这就是我通常读取文件的方式std::ifstream
:
while (InFile.peek() != EOF)
{
char Character = InFile.get();
// Do stuff with Character...
}
if
这避免了循环内需要语句。但是,似乎甚至需要设置peek()
原因,如果我打算稍后使用相同的流eofbit
,则需要调用。clear()
有没有更清洁的方法来做到这一点?
这就是我通常读取文件的方式std::ifstream
:
while (InFile.peek() != EOF)
{
char Character = InFile.get();
// Do stuff with Character...
}
if
这避免了循环内需要语句。但是,似乎甚至需要设置peek()
原因,如果我打算稍后使用相同的流eofbit
,则需要调用。clear()
有没有更清洁的方法来做到这一点?
通常,您只需使用
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;
}
};
我不确定我是否理解。 Infile.peek()
仅eofbit
在返回时设置EOF
。而如果它返回EOF
, 之后读取必然会失败;它设置的事实eofbit
是一种优化,最重要的是。