读取文件时避免错误标志

时间:2011-04-07 14:41:13

标签: c++ while-loop filestreams

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

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

这避免了循环内需要if语句。但是,似乎偶数peek()会导致设置eofbit,这使得如果我计划稍后使用相同的流,则需要调用clear()

有更简洁的方法吗?

2 个答案:

答案 0 :(得分:2)

通常,您只需使用

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

如果忘记清除(),则使用基于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;
    }
};

答案 1 :(得分:0)

我不确定我理解。 Infile.peek()仅设置eofbit 当它返回EOF时。如果它返回EOF,稍后再读 必然会失败;它设置eofbit的事实是一个 优化,最重要的是。