Is there a particular function in c++ that can return the line number of a particular string i want to find?
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.";
I want to add some codes at:
cout << "found: " << search << endl;
That will return the line number followed by the string that was searched.
Just use a counter variable to keep track of the current line number. Each time you call getline
you... read a line... so just increment the variable after that.
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;
}
}
Also...
while(!fileInput.eof())
should be
while(getline(fileInput, line))
If an error occurs while reading eof
will not be set, so you have an infinite loop. std::getline
returns a stream (the stream you passed it) which can be implicitly converted to a bool
, which tells you if you can continue to read, not only if you are at the end of the file.
If eof
is set you will still exit the loop, but you will also exit if, for example, bad
is set, someone deletes the file while you are reading it, etc.
A modified version of the accepted answer. [A comment on the answer as a suggestion would have been preferable but I can't comment yet.] The following code is untested but it should work
for(unsigned int curLine = 0; getline(fileInput, line); curLine++) {
if (line.find(search) != string::npos) {
cout << "found: " << search << "line: " << curLine << endl;
}
}
for loop makes it slightly smaller (but perhaps harder to read). And 0 in find should be unnecessary because find by default searches the whole string
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With