有关循环条件下EOF的更多信息

时间:2019-06-13 09:44:12

标签: c++

好的,当我看到此线程时:Why is iostream::eof inside a loop condition (i.e. `while (!stream.eof())`) considered wrong?

我阅读了答案,但我真的不明白这是什么错误,可能是因为我没有c ++的丰富经验,但是我的代码却按预期的方式工作。

int main()
{
    ifstream file;
    string text, search;
    int offset;
    cout << "Enter a word: "; cin >> search;
    file.open("Find.txt");
    if (file.is_open()) {
        while (!file.eof()) {
            file >> text;
            offset = text.find(search, 0);
            if (offset != string::npos) {
                cout << text << endl;
            }
        }
    }
    else {
        cout << "Error!";
        return 0;
    }
    file.close();
}

我输入一个单词,然后在一个文本文件中搜索它,使用该单词的问题为零。那么,什么时候认为这种情况不对?

1 个答案:

答案 0 :(得分:1)

我不会重复该主题中的所有内容;那会浪费时间。

如果您这样做:

    while (!file.eof()) {
        file >> text;
        // offset = text.find(search, 0);
        // if (offset != string::npos) {
            cout << "Text: " << text << endl;
        // }
    }

…然后您会看到问题:每次运行程序时,都会进行一次“额外”循环迭代,其中text的值与上一次迭代相同。

由于您的输出取决于在text中搜索特定子字符串的结果,因此如果在输入的最后一行搜索失败,您就可以摆脱它!但是,如果最后一行匹配,您将再次看到问题。

这种循环输入方式不会总是引起错误。这就是链接的“问答”说“几乎肯定是错误的”的原因。有时,循环内部的逻辑是专门为正常工作而设计的。有时候,就像您所做的那样,恰好发生以避免该错误。

正确的代码是:

while (file >> text)
{
    offset = text.find(search, 0);
    if (offset != string::npos) {
        cout << text << endl;
    }
}