无法将std :: ifstream与std :: string进行比较

时间:2013-10-12 09:43:46

标签: ifstream

我的代码陷入无限循环,因为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内容与标签匹配并退出指向该地址。

1 个答案:

答案 0 :(得分:0)

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

断开循环的唯一条件是检查指针的初始条件:

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

并检查文件结束状态:

if (ifile->eof())

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

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

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

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