以下内容会导致错误,因为file.eof()
显然不会返回true
,直到读取超过文件末尾。我该怎么做?
std::ifstream file("something.stuff", std::ios::in|std::ios::binary);
while(!file.eof())
{
double x, y, z;
file.read(reinterpret_cast<char*>(&x), sizeof(x)); // Do I need to check if(file) after every read?
file.read(reinterpret_cast<char*>(&y), sizeof(y));
file.read(reinterpret_cast<char*>(&z), sizeof(z));
// Do something with xyz
}
答案 0 :(得分:8)
您可以在所有读取后检查它,除非您打算对部分数据执行某些操作,因此:
while(true)
{
double x, y, z;
file.read(reinterpret_cast<char*>(&x), sizeof(x));
file.read(reinterpret_cast<char*>(&y), sizeof(y));
file.read(reinterpret_cast<char*>(&z), sizeof(z));
if (!file)
break;
// Do something with xyz
}
答案 1 :(得分:1)
std::ifstream::read
应设置eof
标记。
所以,是的,您应该在每次致电file.eof()
后查看file.read()
。
答案 2 :(得分:0)
或者,使用seek和tell查找文件的前期长度,然后计算应执行的迭代次数。这样,您不必在每次读取后继续检查eof位。
答案 3 :(得分:0)
是的,每次阅读都可以到达流的结尾,所以你应该在继续之前检查每一个是否成功
std::ifstream file("something.stuff", std::ios::in|std::ios::binary);
while(!file.eof())
{
double x, y, z;
if (!file.read(reinterpret_cast<char*>(&x), sizeof(x)) ||
!file.read(reinterpret_cast<char*>(&y), sizeof(y)) ||
!file.read(reinterpret_cast<char*>(&z), sizeof(z)))
{
// failure... perhaps check file.eof() and/or file.fail() for precise condition
break;
}
else
{
// Do something with xyz
}
}