0

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

#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

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

4

2 回答 2

2

eof仅当您在到达文件末尾后尝试读取时才设置。相反,首先尝试读取一个字符。如果失败,则重置流并重试,如下所示:

char getChar()
{
    char nextType;
    if (!(input >> nextType))
    {
        input.clear();
        input.seekg(0,ios::beg);
        input >> nextType;
    }
    return nextType;
}
于 2013-07-28T17:33:18.087 回答
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。

于 2013-07-28T18:27:02.293 回答