1

这就是我通常读取文件的方式std::ifstream

while (InFile.peek() != EOF)
{
    char Character = InFile.get();
    // Do stuff with Character...
}

if这避免了循环内需要语句。但是,似乎甚至需要设置peek()原因,如果我打算稍后使用相同的流eofbit,则需要调用。clear()

有没有更清洁的方法来做到这一点?

4

2 回答 2

2

通常,您只需使用

char x;
while(file >> x) {
    // do something with x
}
// now clear file if you want

如果您忘记 clear(),则使用基于 RAII 范围的类。

编辑:给出更多信息,我只想说

class FileReader {
    std::stringstream str;
public:
    FileReader(std::string filename) {
        std::ifstream file(filename);
        file >> str.rdbuf();
    }
    std::stringstream Contents() {
        return str;
    }
};

现在您只需获取一份副本,而不必每次都清除()流。或者你可以有一个自我清算的参考。

template<typename T> class SelfClearingReference {
    T* t;
public:
    SelfClearingReference(T& tref)
        : t(&tref) {}
    ~SelfClearingReference() {
        tref->clear();
    }
    template<typename Operand> T& operator>>(Operand& op) {
        return *t >> op;
    }
};
于 2011-04-07T14:54:24.977 回答
0

我不确定我是否理解。 Infile.peek()eofbit 在返回时设置EOF。而如果它返回EOF, 之后读取必然会失败;它设置的事实eofbit是一种优化,最重要的是。

于 2011-04-07T17:26:51.590 回答