2010-06-18 811 views

Respuesta

82

¿Qué tal esto: -

std::ifstream inFile("file"); 
    std::count(std::istreambuf_iterator<char>(inFile), 
      std::istreambuf_iterator<char>(), '\n'); 
+0

Eso es lo que diría, si no lo dijiste antes que yo. Aún así, tu camino es un poco mejor ... +1 – fingerprint211b

+0

Acabo de recordar algo, ¿Qué pasa si la última línea no tiene \ n? – fingerprint211b

+5

@ fingerprint211b: agregue uno al resultado :-) Siempre existe este compromiso si tiene una nueva línea al final del archivo. – Abhay

12

Lea el archivo línea por línea. Cuenta el número de líneas que lees.

+20

¡Eso suena como una sobrecomplicación _huge_! ;-) –

-2

int numLines = 0; 
ifstream in("file.txt"); 
//while (! in.eof()) 
while (in.good()) 
{ 
    std::string line; 
    std::getline(in, line); 
    ++numLines; 
} 

No es una cuestión de cómo tratar a la última línea del archivo si no termina con un salto de línea. Dependiendo de lo que esté haciendo, es posible que desee contarlo y es posible que no. Este código lo cuenta.

Ver: http://www.cplusplus.com/reference/string/getline/

+7

'while (! In.eof())' <--- NOOOOO! Esto dará basura si hay algún tipo de falla al leer el archivo. Pon "std :: getline" como la condición del tiempo. –

+3

Todavía no es válido después de su edición porque si 'std :: getline' falla, usted incrementa el recuento de líneas, y no verifica si tuvo éxito hasta después. Mueva 'std :: getline' a la condición del tiempo. –

10

Esta es la versión correcta de la respuesta de Craig W. Wright:

int numLines = 0; 
ifstream in("file.txt"); 
std::string unused; 
while (std::getline(in, unused)) 
    ++numLines; 
+0

std :: getline (in, std :: string()) - Enlazar una referencia no const a un temporal no es legal C++. – Pietro

+0

@Pietro: Buen punto. ¡Fijo! –

-10

Divida el tamaño del archivo y el número medio de caracteres por línea!

+0

¿Cómo se determina el número promedio de caracteres por línea sin leer el archivo? Si estás contando los personajes, también podrías contar las nuevas líneas; que tipo de invalida tu respuesta. –

-1
int aNumOfLines = 0; 
ifstream aInputFile(iFileName); 

string aLineStr; 
while (getline(aInputFile, aLineStr)) 
{ 
    if (!aLineStr.empty()) 
     aNumOfLines++; 
} 

return aNumOfLines; 
0

núcleo métodos siguientes @Abhay

un código completo que he hecho:

size_t count_line(istream &is) 
{ 
    // skip when bad 
    if(is.bad()) return 0; 
    // save state 
    std::istream::iostate state_backup = is.rdstate(); 
    // clear state 
    is.clear(); 
    std::istream::streampos pos_backup = is.tellg(); 

    is.seekg(0); 
    size_t line_cnt; 
    size_t lf_cnt = std::count(std::istreambuf_iterator<char>(is), std::istreambuf_iterator<char>(), '\n'); 
    line_cnt = lf_cnt; 
    // if the file is not end with '\n' , then line_cnt should plus 1 
    is.unget(); 
    if(is.get() != '\n') { ++line_cnt ; } 

    // recover state 
    is.clear() ; // previous reading may set eofbit 
    is.seekg(pos_backup); 
    is.setstate(state_backup); 

    return line_cnt; 
} 

no va a cambiar el estado de flujo de archivos origen y que incluye 'transformación situación n'-miss \ para la última línea

+0

devuelve 1 para el archivo en blanco o ningún archivo también. – masoomyf

+0

Creo que 0 puede ser mejor? –

+0

sí 0 es obligatorio si no hay nada en el archivo o si el archivo no existe. Pero esta función devuelve cero para el archivo en blanco. – masoomyf

Cuestiones relacionadas