2012-09-17 8 views
5

¿Existe alguna función particular en C++ que pueda devolver el número de línea de una cadena en particular que quiero encontrar?C++ busca un archivo de texto para una cadena en particular y devuelve el número de línea donde se encuentra esa cadena

ifstream fileInput; 
int offset; 
string line; 
char* search = "a"; // test variable to search in file 
// open file to search 
fileInput.open(cfilename.c_str()); 
if(fileInput.is_open()) { 
    while(!fileInput.eof()) { 
     getline(fileInput, line); 
     if ((offset = line.find(search, 0)) != string::npos) { 
      cout << "found: " << search << endl; 
     } 
    } 
    fileInput.close(); 
} 
else cout << "Unable to open file."; 

Quiero añadir algunos códigos en:

cout << "found: " << search << endl; 

que devolverá el número de línea seguido de la cadena que se buscó.

Respuesta

10

Simplemente use una variable de contador para realizar un seguimiento del número de línea actual. Cada vez que llamas al getline ... lees una línea ... así que simplemente incrementa la variable después de eso.

unsigned int curLine = 0; 
while(getline(fileInput, line)) { // I changed this, see below 
    curLine++; 
    if (line.find(search, 0) != string::npos) { 
     cout << "found: " << search << "line: " << curLine << endl; 
    } 
} 

también ...

while(!fileInput.eof())

debería ser

while(getline(fileInput, line))

Si se produce un error durante la lectura no se establecerá eof, por lo que tiene un bucle infinito. std::getline devuelve una secuencia (la secuencia que pasó) que se puede convertir implícitamente a bool, que le indica si puede seguir leyendo, no solo si se encuentra al final del archivo.

Si eof se fija usted todavía salir del bucle, pero también de salida si, por ejemplo, se establece bad, alguien borra el archivo mientras lo está leyendo, etc.

+0

oh mi no puedo creer que no haya pensado en ese método de contador simple. Estaba pensando que hay una función especial para llamar ... gracias, lo resolví. –

+0

@JohnMarston: No hay problema, pero asegúrate de cambiar esa condición de bucle. Tal como está, no puedes manejar una condición de error. –

4

Una versión modificada de la respuesta aceptada [Un comentario sobre la respuesta como una sugerencia habría sido preferible pero no puede hacer comentarios todavía.] El siguiente código no se ha probado pero debería funcionar

for(unsigned int curLine = 0; getline(fileInput, line); curLine++) { 
    if (line.find(search) != string::npos) { 
     cout << "found: " << search << "line: " << curLine << endl; 
    } 
} 

de bucle hace que sea un poco más pequeño (pero tal vez más difícil leer). Y 0 en find debería ser innecesario porque buscar por defecto busca toda la cadena

Cuestiones relacionadas