2010-05-26 10 views
6

Sto usando il seguente codice per leggere le righe da un file di testo. Qual è il metodo migliore per gestire il caso in cui la linea è superiore al limite SIZE_MAX_LINE?Come si leggono le lunghe file da un file di testo in C++?

void TextFileReader::read(string inFilename) 
{ 
    ifstream xInFile(inFilename.c_str()); 
    if(!xInFile){ 
     return; 
    } 

    char acLine[SIZE_MAX_LINE + 1]; 

    while(xInFile){ 
     xInFile.getline(acLine, SIZE_MAX_LINE); 
     if(xInFile){ 
      m_sStream.append(acLine); //Appending read line to string 
     } 
    } 

    xInFile.close(); 
} 
+0

io in realtà volevo sapere come gestire l'eofbit e failbit impostato dalla funzione – sonofdelphi

+1

Se si utilizza std :: stringhe non è necessario per testare il limite di dimensione – Nikko

+0

cosa sarà allora la dimensione di una linea di lettura? – sonofdelphi

risposta

10

Non utilizzare istream::getline(). Si occupa di buffer di caratteri nudi ed è quindi soggetto a errori. Meglio usare std::getline(std::istream&,std::string&, char='\n') dal <string> intestazione:

std::string line; 

while(std::getline(xInFile, line)) { 
    m_sStream.append(line); 
    m_sStream.append('\n'); // getline() consumes '\n' 
} 
+0

Che ne dici di questo? \t istream_iterator cursore (xInFile); \t istream_iterator endmarker; \t while (cursor! = Endmarker) { \t \t m_sStream.append (* cursor); \t \t cursor ++; \t} – sonofdelphi

+0

@sonofdelphi: IIUC, questo leggerà _words_, non _lines_ (dove una "parola" è qualcosa delimitata da spazi bianchi). Per poter leggere le righe, devi istanziare 'std :: istream_iterator' con un tipo che legge le righe, anziché le parole. Non dovrebbe essere difficile trovare un simile tipo, ma non c'è nessuno nella std lib. – sbi

2

Se si utilizza il free function nella stringa, non c'è bisogno di passare una lunghezza max. Utilizza anche il tipo di stringa C++.

9

Dato che stai già utilizzando C++ e iostream, perché non utilizzare std::string's getline function?

std::string acLine; 
while(xInFile){ 
    std::getline(xInFile, acLine); 
    // etc. 
} 

E, utilizzare xInFile.good() per garantire eofbit e badbit e failbit non sono set.

+2

Vorrei fare "while" (std :: getline (xInFile, acLine)) {} " – Nikko

+0

Kenny, quando l'input fallisce, questo tenterà di elaborare i vecchi dati nella parte' // etc.'. (Se la stringa era locale alla funzione, sarebbe almeno una stringa vuota.) Meglio usare l'idioma di Nikko. Vedi [la mia risposta] (http://stackoverflow.com/questions/2910836/how-do-i-read-long-lines-from-a-text-file-in-c/2911350#2911350). – sbi

Problemi correlati