永远不会达到EOF(无限循环)

时间:2017-03-26 16:02:25

标签: c++ while-loop io infinite-loop

奇怪的是,在尝试接受我的输入时,我陷入了无限循环。我过去能够适当地使用这样的循环,但出于某种原因,我被抓到了这里:

vector<string> boolean_forms;
    while (!cin.eof()) {
        cout << "HELP IM STUCK";
        string line;
        getline(cin,line);
        if (!cin.fail()) {
            boolean_forms.push_back(line);
        }
    }

我不知道,有更好的方法吗?我不能为我的生活弄清楚为什么这会引起问题。我的程序中的其他地方的代码是否有可能搞砸了?我无法想象它会是什么,因为这只是从一个我根本不写的文件中读取。

更新: 在更改为直接执行输入而不是首先检查文件结尾之后,我遇到了分段错误。 segfault不是由这个循环之外的任何东西引起的,就好像我尝试直接推回行而不是输入,程序按原样运行,我得到预期的输出。

这令人沮丧。在我尝试了所有提出的解决方案而且没有一个能够奏效的时候,我已经投入了地狱。如果我在检查文件结束之前读入,我会收到分段错误。如果我先检查eof然后再检查getline,我会得到一个无限循环。如果我硬编码插入我尝试检查向量的行,我的代码运行正常,所以我知道它必须与从cin读取。我读了./a.out&lt; input.txt直到现在已经为我工作了很多次。

2 个答案:

答案 0 :(得分:0)

检查EOF,读取数据和重复是错误的方法。您应首先读取数据,检查读取是否失败,然后重复。

vector<string> boolean_forms;
std::string line;
while(getline(cin, line))
    boolean_forms.push_back(line);

答案 1 :(得分:0)

ifstream iFile("input.txt"); // You need to change the file location based on your setup.

试试这个:

while (true) {
    std::string line;
    iFile >> line;
    if( iFile.eof() ) 
        break;
    // Do Something
}

有关isotream::eof的详细说明,请参阅this