我有一个函数,可以逐个字符地从文件中获取输入:
#include <iostream>
#include <fstream>
using namespace std;
ifstream input("sequence.txt");
char getChar(){
char nextType;
if (input.eof()) {
input.clear();
input.seekg(0,ios::beg);
}
input >> nextType;
return nextType;
}
int main(){
for(int i = 0; i < 10; i++){
cout << getChar() << endl;
}
return 0;
}
“sequence.txt”中的输入是:
I O
因此输出应该交替打印I和O,而是输出:
I O O I O O I O O I
如何在第一次读取文件中的最后一个字符后重置文件?
答案 0 :(得分:2)
eof
仅在您已经到达文件末尾后尝试读取时设置。相反,首先尝试读取char。如果失败,则重置流并再试一次,如下所示:
char getChar()
{
char nextType;
if (!(input >> nextType))
{
input.clear();
input.seekg(0,ios::beg);
input >> nextType;
}
return nextType;
}
答案 1 :(得分:0)
您在不测试输入的情况下返回值 成功了。你的功能应该是线上的东西 的:
char
getChar()
{
char results;
input >> results;
if ( !input ) {
input.clear();
input.seekg( 0, std::ios_base:;beg );
input >> results;
if ( !input ) {
// There are no non-blanks in the input, so there's no way we're
// going to read one. Give up, generating some error condition
// (Throw an exception?)
}
}
return results;
}
重要的是有没有执行路径
在没有成功阅读的情况下读取或复制results
它。 (除非你已经分配了一些东西。否则你
例如,可以使用'\0'
初始化它
如果函数无法返回'\0'
函数的约定
读什么。)
我可能会补充说input.eof()
的测试只有效
在后确定输入失败。我可以
即使没有更多有效输入,也会返回false。