为什么在文件重置之前最后一个字符被取两次?

时间:2013-07-28 17:29:05

标签: c++ file-io char eof

我有一个函数,可以逐个字符地从文件中获取输入:

#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

如何在第一次读取文件中的最后一个字符后重置文件?

2 个答案:

答案 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。