c ++ ifstream, rileva se lettera o EOLine?
Domanda
Ho questa funzione per leggere tutti gli ints dal file. Il problema è quando leggo le lettere, innesco una nuova riga e cerco sempre 1 e non fino alla fine della riga. Come posso scrivere meglio questa funzione?
int v;
while (!in.eof())
{
while (in >> v)
cout << v << " ";
cout << endl;
if (in.eof())
break;
in.clear();
in.seekg(1, ios::cur);
int a;
a=0;
}
Soluzione
Se il tuo file è composto da soli ints separati da newline di spazi bianchi (compresi), questo dovrebbe essere sufficiente.
while( in >> v )
{
// do something with v
}
Dopo il file, se in.fail () è falso e in.eof () è vero, hai raggiunto la fine del file senza errori di formattazione. Altrimenti si è verificato un errore durante la lettura di un int.
Se ricevi input non validi e vuoi recuperarli, devi capire come vuoi recuperare. Se vuoi saltare fino alla fine della riga e ricominciare ad analizzare, puoi usare qualcosa del genere.
in.clear();
in.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
Altri suggerimenti
Primo problema, il codice sopra riportato non si ferma alla fine della riga.
L'operatore > > () ignora " Caratteri dello spazio bianco " che include il nuovo carattere di riga.
Come si può scrivere meglio?
È difficile dirlo senza sapere cosa stai cercando di fare con i numeri e qual è il formato di input del file!
Ma se lo scrivessi lo scriverei senza usare queste righe:
if (in.eof())
break;
in.clear();
in.seekg(1, ios::cur);
Quando si elabora un file di testo formattato è raro vedere l'uso di seek ().
Assumign:
Il file contiene solo numeri.
Vuoi leggere tutti i numeri in un contenitore.
std::vector<int> data;
std::copy( std::istream_iterator<int>(in), // An iterator from current point
std::istream_iterator<int>(), // To end of file.
std::inserter(data) // Destination (insert into data)
);