2012-09-17 12 views
5

Czy istnieje specjalna funkcja w języku C++, która może zwrócić numer wiersza określonego ciągu, który chcę znaleźć?C++ wyszukiwanie pliku tekstowego dla określonego ciągu i zwracanie numeru wiersza, w którym ten ciąg jest na

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

chcę dodać niektóre kody na:

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

To zwróci numer linii, po której następuje ciąg, który był poszukiwany.

Odpowiedz

10

Wystarczy użyć zmiennej licznika, aby śledzić bieżący numer linii. Za każdym razem, gdy wywołujesz getline ... czytasz linię ... po prostu zwiększaj po niej zmienną.

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

także ...

while(!fileInput.eof())

powinny być

while(getline(fileInput, line))

W przypadku wystąpienia błędu podczas odczytu eof nie zostanie ustawiony, więc masz nieskończoną pętlę. std::getline zwraca strumień (strumień, który został przez niego przekazany), który można niejawnie przekonwertować na bool, który mówi, czy możesz kontynuować czytanie, nie tylko jeśli znajdujesz się na końcu pliku.

Jeśli eof jest ustawiona będzie jeszcze wyjść z pętli, ale także wyjście, jeśli, na przykład, bad jest ustawiony, ktoś usuwa plik, podczas gdy czytasz itp

+0

o mój nie mogę uwierzyć, że nie myślałem o tej prostej metodzie licznika. Myślałem, że istnieje specjalna funkcja, do której można zadzwonić. Dzięki temu rozwiązałem. –

+0

@JohnMarston: Nie ma problemu, upewnij się jednak, że zmieniłeś warunek pętli. W obecnej wersji nie można obsłużyć błędu. –

4

Zmodyfikowana wersja z zaakceptowana odpowiedź. [Komentarz do odpowiedzi jako sugestia byłaby korzystna, ale nie mogę jeszcze skomentować.] Poniższy kod jest niesprawdzone, ale to powinno działać

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

do pętli sprawia, że ​​nieco mniejszy (ale być może trudniej czytać). I 0 w find powinno być niepotrzebne, ponieważ domyślnie wyszukuje cały ciąg

Powiązane problemy