2

我有一个非常简单的代码,它的功能是输入程序将从中读取数据的文件的名称。由于输入错误可能导致文件不正确,如果以前的名称无效,控制台将继续要求用户输入名称。

问题是,虽然第一个 do-while 循环工作正常,但如果在第一个循环中第一次没有正确输入文件名,程序将跳过第二个 while 循环。但是,如果正确输入了文件名,则一切正常。

我想知道为什么程序会这样。

感谢您的帮助和时间!

#include<iostream>
#include<fstream>

using namespace std;

int main() {
    string context;
    int step=0,i=0;
    ifstream fin;

    do {
        string filename;
        cout << endl << "please type in the name of input file" << endl;
        cin >> filename;
        string filepath = "files/" + filename;
        cout << filepath << endl;
        fin.open( filepath.c_str() );
    } while( !fin.is_open() );

    while (getline(fin, context)){
        cout << context << endl;
        cout << "hello" << endl;
    }
    fin.close();
    return 0;
}
4

3 回答 3

2

我认为“鳍”的状态在第一次尝试后可能会受到污染。为什么不尝试在调用 fin.open() 之前调用 fin.clear()。

于 2012-10-05T00:58:08.147 回答
1

您需要清除您的 ifstream,它可能已被先前的文件尝试损坏。

于 2012-10-05T00:59:59.017 回答
1

从标准来看,

27.8.1.10
void open(const char* s, ios_base::openmode mode = ios_base::out);
通话rdbuf()->open(s,mode|out)。如果该函数返回空指针,则调用 setstate(failbit)。311a

那么这个注释 311a 是什么?

311a成功打开不会改变错误状态。

虽然注释不是规范性的,但规范性文本绝对没有说明如果成功打开,成功打开对错误状态有何rdbuf->open()影响。该说明澄清了这一非陈述。

底线:当您在失败后重新clear调用时,您需要在调用之前获取文件流的状态位。openopen

于 2012-10-05T01:07:57.750 回答