2

我正在使用下面的代码来读取文件,搜索给定的字符串并显示该行。但我想阅读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
4

3 回答 3

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);
}
于 2013-10-08T05:46:22.927 回答
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.

        }

    }

请注意filewhile 子句中的用法,这很重要。istream 对象可以被评估为布尔值,相当于 file.good()。您要检查状态的原因是第二个getline()函数可能到达文件末尾并引发异常。您还可以在第二次getline调用后添加检查并添加breakif !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;
}

那么就不需要检查了。

于 2013-10-08T05:25:27.413 回答
1

您需要创建一个bool在找到匹配项时设置的新标志变量,然后在找到匹配项后再次循环,以便获得下一行。测试标志以确定您是否在前一个循环中找到了匹配项。

于 2013-10-08T05:30:08.913 回答