C++ 从.txt文件-C++;获取行/流?

C++ 从.txt文件-C++;获取行/流?,c++,string,file,stream,getline,C++,String,File,Stream,Getline,我使用下面的代码读取文件,搜索给定的字符串并显示该行。但是我想把我在文件的字符串搜索中找到的内容读到下一行的。我可以增加行号以获得下一行,但我是否需要在文件上再次使用getline 这是我的密码: #include <string> #include <iostream> #include <fstream> int main() { std::ifstream file( "data.txt" ) ; 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 ;
        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);
    }

是的,您需要使用
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.

        }

    }

那么就不需要检查了。

是的,您需要使用
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.

        }

    }

这样就不需要进行检查。

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

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

您不需要另一个
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);
}
#包括
#包括
#包括
int main()
{
std::ifstream文件(“data.txt”);
std::string search_str=“Man”;
std::字符串行;
int line_number=0;
布尔检验=假;
while(std::getline(文件,行))
{
++线号;
如果(测试)
{

std::cout您不需要另一个
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);
}
#包括
#包括
#包括
int main()
{
std::ifstream文件(“data.txt”);
std::string search_str=“Man”;
std::字符串行;
int line_number=0;
布尔检验=假;
while(std::getline(文件,行))
{
++线号;
如果(测试)
{

std::我不确定你想要什么。你想只显示匹配后的下一行还是匹配行和下一行?是的,特洛伊,匹配行和紧接着的下一行…我不确定你想要什么。你想只显示匹配后的下一行还是匹配行和下一行?是的,特洛伊,匹配行和我马上下一行……在得到一些指导之后,你真的应该试着自己解决这些问题。否则你什么也学不到:看看这里:嘿,特洛伊,我用的是Zac说的以下代码,这是对的还是内存泄漏或有任何错误?-请检查这里:你真的应该尝试解决这些问题在得到一些指导后,你会自己解决问题。否则你不会学到任何东西:无论如何,请看这里:嘿,特洛伊,我正在使用Zac所说的以下代码,这是对的还是内存泄漏或有任何错误?-请检查这里:我不确定你是否意外地重用了相同的变量名,但
文件
作为两个input stream和布尔标志要么不正确(因为名称冲突),要么不必要(因为getline返回
ostream&
)。他可以在找到结果时,以及在下一个循环中(读取该行后)简单地设置布尔标志,测试它并中断循环。我不确定是否意外地重用了相同的变量名,但
文件
,因为输入流和布尔标志要么不正确(因为名称冲突),要么不必要(因为getline返回
ostream&
)。当他找到一个结果时,他只需设置一个布尔标志就可以了,在下一个循环中(读取行后),测试它并跳出循环。