在c ++中,发生故障后是否需要stream.clear()?

问题描述 投票:0回答:2

我有以下代码:

string promptPlayerForFile(ifstream &infile, string prompt) {
    while (true) {
        string filename;
        cout << prompt;
        getline(cin, filename);
        infile.open(filename.c_str());
        if (!infile.fail()) return filename;
        infile.clear();
        cout << "Unable to open that file. Try again." << endl;
    }
}

该函数按预期工作:输入文件名,直到给出正确的文件名,在这种情况下,它将流与文件关联并返回文件名字符串。

然后我尝试评论infile.clear()线,看看会发生什么。 (我读到在发生故障后需要包含它才能重置流的相关位。)

但是,在对此进行注释后,该函数的行为与以前一样。如果我首先给出一个错误的文件名,然后一个正确的文件名就可以了,所以即使没有那行,故障位也会被重置。那么infile.clear()是否必要,它的适当用途是什么?

c++ ifstream
2个回答
5
投票

如果您使用的是C ++ 11或更高版本,则无需调用infile.clear();。如果open()成功,则调用clear()

如果您使用的是预C ++ 11编译器,则需要调用infile.clear()。当open()成功时,该语言不保证故障位被清除。

有关调用https://en.cppreference.com/w/cpp/io/basic_ifstream/open的详细信息,请参阅clear()


0
投票

当且仅当您想要继续与流进行交互时(例如,从中读取),infile.clear()才是相关的。如果您的程序仍然结束,则不必清除错误标志。

© www.soinside.com 2019 - 2024. All rights reserved.