从.txt文件一次读取两行 - C ++ getline / streams?

时间:2013-10-08 05:23:17

标签: c++ string file stream getline

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

3 个答案:

答案 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标志变量,您在找到匹配项时设置该变量,然后在找到匹配项后再次循环,以便您可以获得下一行。测试标志以确定您是否在上一个循环中找到了匹配项。