如何使用文件中断getline?

时间:2014-02-25 16:44:27

标签: c++

我有代码,我从文件中输入内容。我的txt文件如下所示:

file.txt的

  

你好世界   ...
  1 2

底部的数字应该被读入变量。至于“你好世界”,它应该被getline选中。但我不知道txt文件中会有多少行,所以我不知道如何突破它。这是我的代码:

while (getline(file, line))
{
    std::cout << line << std::endl;
    // ...
}

file >> a >> b; // 1 2

如果我使用cin执行此操作,我可以Ctrl+Z停止getline循环运行。如何在到达while之前的适当时间突破1 2循环?

3 个答案:

答案 0 :(得分:1)

使用条件和break;语句。

例如:

while (getline(file, line))
{
    std::cout << line << std::endl;
    // ...
    if(line == "hello world"/){
        break;//Exits the loop
    }
}

break语句使您的代码退出它所使用的最内部循环。在这种情况下,它退出while循环。

编辑: 如果你不想打破特定的行,那么你最好使用正则表达式或其他机制(如std::stringstream)来找到你正在寻找的字符串的匹配,并捕获你的部分我很感兴趣。我建议你看一下Boost.Regex

这个想法是循环上线,就像你一样。只要你有匹配,你可以打破(以相同的方式)并从你当前正在阅读的字符串中捕获(在你的代码中将在line变量中)。

答案 1 :(得分:1)

对于每一行string line,您可以将其放入istringstream iss。然后尝试使用a将其流式传输到biss >> a >> b,如果可以成功完成,则表示您输入了正确的行。否则,你继续检查下一行。

int a, b;
while (getline(file, line))
{
    istringstream iss(line);

    if (iss >> a >> b)
    {
        // you are in the right line, and a,b has the values e.g. 1 2
    }
}

除了"hello world"之外,它还适用于"aaa bbb cc"之外的其他字符串,只要它们不是您要查找的数字。

P.S。:如果您使用C++11检查给定的行是否与您要查找的模式匹配,您也可以使用regex

答案 2 :(得分:0)

你不确定自己如何确定要突破 循环。标准是什么?如果你想阅读全部 除了最后一行,最简单的解决方案是简单地阅读全部 然后将这些行转换为std::vector<std::string> 过程;你可以遍历一个向量,直到下一个向量 最后一个元素(你不能在流上做)。如果是的话 模仿你想要匹配(说"\\d+\\s+\\d+"),然后你 可以添加到条件:

std::string line;
std::regex matchNumbers( "\\d+\\s+\\d+" );
while ( std::getline( file, line ) && ! regex_match( line, matchNumbers ) ) {
    //  ...
}
std::istringstream numbers( line );
numbers >> a >> b;

等等。