2010-05-26 21 views
6

Ich verwende den folgenden Code zum Lesen von Zeilen aus einer Textdatei. Was ist die beste Methode für den Fall, dass die Linie größer als das Limit SIZE_MAX_LINE ist?Wie lese ich lange Zeilen aus einer Textdatei 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

Ich wollte eigentlich wissen, wie die eofbit zu handhaben und failbit durch die Funktion – sonofdelphi

+1

gesetzt Wenn Sie std :: strings Sie brauchen nicht die maximale Größe zu testen – Nikko

+0

was Wird die Größe einer Leselinie dann sein? – sonofdelphi

Antwort

10

Verwenden Sie nicht istream::getline(). Es handelt sich um nackte Zeichenpuffer und ist daher fehleranfällig. Besser nutzen std::getline(std::istream&,std::string&, char='\n') vom <string> Header:

std::string line; 

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

Wie wäre es damit? \t istream_iterator Cursor (xInFile); \t istream_iterator Endmarker; \t während (Cursor! = Endmarker) { \t \t m_sStream.append (* Cursor); \t \t Cursor ++; \t} – sonofdelphi

+0

@sonozufelphi: IIUC, dies wird lesen _words_, nicht _lines_ (wo ein "Wort" alles von Leerzeichen begrenzt ist). Damit Zeilen gelesen werden können, müssten Sie 'std :: iStream_iterator' mit einem Typ instanziieren, der anstelle von Wörtern Zeilen liest. Es sollte nicht schwierig sein, einen solchen Typ zu finden, aber es gibt keinen in der Standardbibliothek. – sbi

2

Wenn Sie die free function in Zeichenfolge verwenden, Sie müssen nicht eine maximale Länge übergeben. Es verwendet auch den C++ - String-Typ.

9

Da Sie bereits C++ und Iostream verwenden, warum nicht std::stringgetline function verwenden?

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

Und verwenden xInFile.good()eofbit und badbit und failbit, um sicherzustellen, sind nicht Satz.

+2

Ich würde nur "while (std :: getline (xInFile, acLine)) {}" – Nikko

+0

Kenny, wenn die Eingabe fehlschlägt, wird dies versuchen, alte Daten in der '// etc.' Teil zu verarbeiten. (Wenn die Zeichenfolge für die Funktion lokal ist, wäre es zumindest eine leere Zeichenfolge.) Verwenden Sie Nikkos Sprache besser. Siehe [meine Antwort] (http://stackoverflow.com/questions/2910836/how-do-i-read-long-lines-from-a-text-file-in-c/2911350#2911350). – sbi

Verwandte Themen