2010-05-26 12 views
6

Estoy usando el siguiente código para leer líneas de un archivo de texto. ¿Cuál es el mejor método para manejar el caso donde la línea es mayor que el límite SIZE_MAX_LINE?¿Cómo leo líneas largas desde un archivo de texto en 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

yo en realidad quería saber cómo manejar la eofbit y failbit establecido por la función – sonofdelphi

+1

Si utiliza std :: cadenas que no es necesario para poner a prueba el límite de tamaño – Nikko

+0

lo ¿será el tamaño de una línea de lectura entonces? – sonofdelphi

Respuesta

10

No utilice istream::getline(). Se trata de búferes de caracteres desnudos y, por lo tanto, propensos a errores. Un mejor uso de la std::getline(std::istream&,std::string&, char='\n')<string> cabecera:

std::string line; 

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

¿Qué tal esto? \t istream_iterator cursor (xInFile); \t istream_iterator endmarker; \t while (cursor! = Endmarker) { \t \t m_sStream.append (* cursor); \t \t cursor ++; \t} – sonofdelphi

+0

@sonofdelphi: IIUC, esto leerá _words_, not _lines_ (donde una "palabra" es algo delimitado por espacios en blanco). Para que pueda leer líneas, debe crear una instancia de 'std :: istream_iterator' con un tipo que lea líneas, en lugar de palabras. No debería ser difícil crear un tipo de este tipo, pero no hay ninguno en la versión estándar. – sbi

2

Si utiliza el free function en cadena, no tiene que pasar una longitud máx. También utiliza el tipo de cadena C++.

9

Dado que ya utiliza C++ y iostream, ¿por qué no utilizar std::string's getline function?

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

Y, utilice xInFile.good() para asegurar eofbit y badbit y failbit no son conjunto.

+2

Me gustaría hacer "while (std :: getline (xInFile, acLine)) {}" – Nikko

+0

Kenny, cuando la entrada falla, intentará procesar los datos antiguos en la parte '// etc.'. (Si la cadena fuera local para la función, al menos sería una cadena vacía). Mejor utilizar la expresión idiomática de Nikko. Ver [mi respuesta] (http://stackoverflow.com/questions/2910836/how-do-i-read-long-lines-from-a-text-file-in-c/2911350#2911350). – sbi

Cuestiones relacionadas