[英]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.