这就是我通常使用std::ifstream
读取文件的方式:
while (InFile.peek() != EOF)
{
char Character = InFile.get();
// Do stuff with Character...
}
这避免了循环内需要if
语句。但是,似乎偶数peek()
会导致设置eofbit
,这使得如果我计划稍后使用相同的流,则需要调用clear()
。
有更简洁的方法吗?
答案 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
的事实是一个
优化,最重要的是。