繁体   English   中英

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

[英]error about using ifstream in loop

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

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

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

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

从标准来看

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()成功,则规范性文本完全没有说明成功打开对错误状态rdbuf->open() 该注释澄清了此非声明。

底线:你需要clear在调用文件流的状态位open ,当你重新调用open后失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM