ifstream seekg超过结束不返回eof在VS2008表达什么?
题
在VS2005年,我有一些代码,是这样的:
ifs.open("foo");
while (!ifs.eof())
{
ifs.read(&bar,sizeof(bar));
loc = ifs.tellg();
loc += bar.dwHeaderSize;
// four byte boundary padding
if ((loc % 4) != 0)
loc += 4 - (loc % 4);
ifs.seekg(loc,ios::beg);
}
ifs.close();
代码的工作现在VS2005年,但它未能在VS2008表达。从什么我可以告诉,与2008年没有返回eof()代码后寻求结束的文件。我失去了一些东西?我固定的通过添加明确的检查,看如果所寻求的位置超过了文件的大小,但是我要确保我的理解ifstream正确。
解决方案
EOF标志仅仅是触发的后你试图阅读过的文件。
阅读 upto
结束的文件不会触发它。
这就是为什么多数码看起来是这样的:
while(ifs.read(&bar,sizeof(bar)))
{
// Do Stuff
}
如果结果的read()转达的EOF循环将进入。
如果结果的read()过去EOF的循环将不可enetered
- 注:read()将只能走过去的EOF如果有零字左边的文件。否则它会读取高达结束的文件。所以循环总是进入的,如果有财产以后留在该文件。
其原因是结果的读(返回值)是一个参考流。如果流用于在布尔环境(例如,如果测试表达)它转变成一种类型,可用于这样一个背景。结果这种转换的测试EOF标志(外一对夫妇的其他人)和返回quivalent假,如果EOF是真实的。
注:
这个技术工作得更好,如果你过多的操作者 << 你的酒吧类,因为这应该读什么需要的对象,而不会过去的EOF.它是那么容易让你的对象读正是最终的文件没有去过。我担心读取是什么应该发生,如果read()希望10bytesand只有5个字节的文件,会发生什么情况的部分填充的对象?
如果你想继续使用你的风格,该代码应该是这样的:
ifs.open("foo");
while (!ifs.eof())
{
ifs.read(&bar,sizeof(bar));
if (ifs.eof())
{ break;
}
// Do Stuff
}
不隶属于 StackOverflow