我使用下面的代码来读取文件,搜索给定的字符串并显示该行。但我想阅读immediate next line
到我在文件的字符串搜索中找到的内容。我可以增加行号以获得下一行,但是我是否需要再次使用getline
文件?
这是我的代码:
#include <string>
#include <iostream>
#include <fstream>
int main()
{
std::ifstream file( "data.txt" ) ;
std::string search_str = "Man" ;
std::string line ;
int line_number = 0 ;
while( std::getline( file, line ) )
{
++line_number ;
if( line.find(search_str) != std::string::npos )
{
std::cout << "line " << line_number << ": " << line << '\n' ;
std::cout << ++line_number; // read the next line too
}
}
return (0);
}
以下是我文件的内容:
Stu
Phil and Doug
Jason
Bourne or X
Stephen
Hawlkings or Jonathan
Major
League or Justice
Man
Super or Bat
答案 0 :(得分:2)
您不需要另外std::getline
次来电,但您需要一个标志来避免它:
#include <string>
#include <iostream>
#include <fstream>
int main()
{
std::ifstream file( "data.txt" ) ;
std::string search_str = "Man" ;
std::string line ;
int line_number = 0 ;
bool test = false;
while(std::getline(file, line))
{
++line_number;
if (test)
{
std::cout << "line " << line_number << ": " << line << '\n' ;
break;
}
if( line.find(search_str) != std::string::npos )
{
std::cout << "line " << line_number << ": " << line << '\n' ;
test = true;
}
}
return (0);
}
答案 1 :(得分:1)
是的,您需要getline
功能才能阅读下一行。
while( file && std::getline( file, line ) )
{
++line_number ;
if( line.find(search_str) != std::string::npos )
{
std::cout << "line " << line_number << ": " << line << '\n' ;
std::cout << ++line_number; // read the next line too
std::getline(file, line); // then do whatever you want.
}
}
请注意while子句中file
的用法,这很重要。 istream对象可以被计算为boolean,它等同于file.good()。您要检查状态的原因是第二个getline()
函数可能到达文件的末尾并引发异常。您还可以在第二次getline
来电后添加支票,并在break
时添加!file.good()
。
std::getline(file, line); // then do whatever you want.
if(line.good()){
// line is read stored correctly and you can use it
}
else{
// you are at end of the file and line is not read
break;
}
然后不需要检查。
答案 2 :(得分:1)
您需要创建一个新的bool
标志变量,您在找到匹配项时设置该变量,然后在找到匹配项后再次循环,以便您可以获得下一行。测试标志以确定您是否在上一个循环中找到了匹配项。