关于在循环中使用ifstream的错误

时间:2012-10-05 00:50:09

标签: c++ fstream

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

问题是,虽然第一个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;
}

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

答案 2 :(得分: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时,在调用open之前,您需要open文件流的状态位。