Newsgroup: it.comp.lang.c++
Titolo: Lettura file

Ho utilizzato la libreria fstream per scrivere su di un file dei dati. Ora
cercavo di leggerli ed avevo la necessità che venissero riportati a schermo
esattamente come sono scritti sul file. Io ho scritto una cosa del genere:
void show_file()
{
  char string[50];
  ifstream file(xmlFilename, ios::in);
  while (!file.eof())
  {
    file >> string;
    cout << string<< " ";
  }
  return;
}
ma purtroppo non funziona esattamente come vorrei, infatti mi mostra tutto
sulla stessa riga. C'è un modo per avere anche quelli e visualizzarlo
proprio nello stesso modo?
Grazie e ciao a tutti.
Luca Carlon

Puoi provare con una cosa del genere:
int main()
{
    char c;
    ifstream file(TuoFileName, ios::in);
    while (!file.eof()) {
        file.read(&c, 1);
        cout << c;
    }
}
Questo codice legge ad uno ad uno tutti i caratteri contenuti nel file,
senza saltarne nessuno (solitamente, con istruzioni tipo "file >> string;",
spazi, ritorni a capo, tabulazioni, ecc., vengono ignorati), e li invia a
cout.
L'esempio č molto banale e affrettato, ma č fatto solo per farti notare
l'utilizzo di
read(char* puntatore_a_buffer, int numero_caratteri_da_leggere).
Byez! AG5F :-D

 proprio nello stesso modo?
Oltre  al metodo  della read,  puoi  utilizzare la  getline per  leggere
un'intera riga e stamparla:
void print_file() {
        std::ifstream file(xmlFilename);
        std::string line;
        while(getline(file, line))
                std::cout << line << std::endl;
}
Questo metodo e` il migliore se devi anche elaborare le linee che leggi.
L'esempio qui` sopra  puo` comportare un numero  cospicuo di allocazioni
(dovute  alla   crescita  di  's'). Nel  caso   tu  debba  semplicemente
visualizzare  il  file  il  metodo  migliore e`  quello  di  esporre  lo
streambuff sottostante:
void print_file() {
        std::ifstream file(xmlFilename);
        std::cout << file.rdbuf();
}
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
"La mia teoria scientifica preferita e` quella secondo la quale gli 
 anelli di Saturno sarebbero interamente composti dai bagagli andati 
 persi nei viaggi aerei." -- Mark Russel

 un'intera riga e stamparla:
Caspita! si vede che mi manca lo Stroustruppone! Appena finisco gli esami di
stato giuro che me lo accatto! :-D
AG5F: Povero autodidatta delle STL...

 stato giuro che me lo accatto! :-D
Forse lo conosci gia`, ma... 
http://www.bruceeckel.com
Cerca  "Thinking  in C++",  e`  un  libro  (in due  volumi)  distribuito
gratuitamente online.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Do, or do not. There is no try.

 gratuitamente online.
non è un libro è un mattone :) Io sono al capitolo sull'overloading
degli operatori... ma quanto è complicato sto C++... con Python c'ho
messo molto meno tempo :)
-- 
Rhymes
rhy...@myself.com
" ride or die "

 }
alcune precisazioni: std::ifstream dispone anche di un metodo get() che 
legge un carattere e restituisce l'eventuale stato di eof (a dir la 
verita` restituisce lo stream di lettura, per il quale esiste una 
conversione verso bool che rende superflua la chiamata a eof()).
Inoltre se devi fare una copia carattere-per-carattere e` meglio usare il 
metodo put di std::ostream: esso stampa un carattere nudo e crudo, 
mentre operator<< esegue un output formattato, controllando anche le 
impostazioni di width, precision, e altri manipolatori: in definitiva, 
putc e` piu` efficiente e stampa solo quello che gli dici, quindi e` 
quello che fa al caso tuo:
while( file.get(c )
        cout.put(c);
ciao Anto
-- 
Antonio Cuni, 20 anni, studente
Brainbench C++ Master: 4.73, higher than 99% of all previous test takers.
C Language: 3.79, higher than 92% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it