2012-09-17 6 views
5

Esiste una funzione particolare in C++ che può restituire il numero di riga di una stringa particolare che voglio trovare?C++ cerca un file di testo per una particolare stringa e restituisce il numero di riga in cui si trova quella stringa

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."; 

voglio aggiungere alcuni codici a:

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

che restituirà il numero della linea seguita dalla stringa che è stato cercato.

risposta

10

Basta usare una variabile contatore per tenere traccia del numero di linea corrente. Ogni volta che chiami getline tu ... leggi una riga ... quindi basta incrementare la variabile dopo.

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; 
    } 
} 

anche ...

while(!fileInput.eof())

dovrebbe essere

while(getline(fileInput, line))

Se si verifica un errore durante la lettura non sarà impostato eof, in modo da avere un ciclo infinito. std::getline restituisce uno stream (il flusso che lo hai passato) che può essere convertito implicitamente in un bool, che ti dice se puoi continuare a leggere, non solo se sei alla fine del file.

Se eof è impostato si continua a uscire dal ciclo, ma vi sarà anche l'uscita, se, per esempio, bad è impostato, qualcuno elimina il file mentre si sta leggendo, ecc

+0

oh mio non posso credere che non ho pensato a quel metodo contatore semplice. Stavo pensando che c'è una funzione speciale da chiamare .. grazie l'ho risolto. –

+0

@JohnMarston: Nessun problema, assicurati di cambiare le condizioni del ciclo. Allo stato attuale non è possibile gestire una condizione di errore. –

4

Una versione modificata del risposta accettata [Un commento sulla risposta come un suggerimento sarebbe stato preferibile, ma non posso commentare ancora.] Il seguente codice non è testato, ma dovrebbe funzionare

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

ciclo for lo rende leggermente più piccolo (ma forse più difficile da leggere). E 0 in find non dovrebbe essere necessario perché trova per impostazione predefinita l'intera stringa

Problemi correlati