0

我的代码陷入了无限循环,因为 的内容ifile与标签不匹配。

在调试过程中,我注意到的内容ifile是整个文件的字符串。

void Experiment::read_moveTo(ifstream* ifile, string label) {
    string temp;

    while (temp.compare(label) != 0 and ifile) {
        *ifile >> temp;

       if (ifile->eof()) {
            cout << "Read error: Could not find label '"
                 << label << "' while reading parameter file '"
                 << parameterFile << "'" << endl;
            exit(0);
        }
    }
}

我希望ifile内容与标签匹配并退出指向该地址。

4

1 回答 1

0

我认为问题在于流无法执行提取(由于文件中的任何内容),因此std::ios_base::failbit设置为流状态。这意味着流上的任何后续 I/O 操作都不会执行任何操作。

跳出循环的唯一条件是检查指针的初始条件:

while (temp.compare(label) != 0 and ifile)
//                                  ^^^^^

以及检查文件结束状态的位置:

if (ifile->eof())

假设输入因调用此函数之前的某些原因而失败(无法打开文件或事先执行了无效读取),这两种情况都无法充分检查流。第一个条件只是检查指针的非零值,如果指针未设置为真NULL(我在这里假设),则为真。第二个条件始终为假,因为流不能再执行任何会导致std::ios_base::eofbit设置的操作。

您需要在 while 循环中取消引用指针,以便检查流状态:

while (temp.compare(label) != 0 and *ifile)
//                                  ^

这将修复无限循环,但您仍然必须放弃有关文件内部内容以及如何创建和传递流以完全解决此问题的更多细节。

于 2014-01-10T17:07:36.497 回答