2009-07-08 51 views
1

在VS 2005,我有一些代码,看起来像这样:ifstream seekg超越最终不会在VS 2008 Express中返回eof?

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(); 

的代码在VS 2005中工作得很好,但在VS 2008中快速失败。从我所知道的来看,VS 2008在代码追寻到文件末尾后没有返回eof()。我错过了什么吗?我通过添加一个明确的检查来确定它是否超出了文件大小,但我想确保我理解ifstream是否正确。

回答

2

EOF标志仅在您尝试读取文件末尾后触发。
正在读取upto文件结尾不会触发它。

这就是为什么大多数的代码如下所示:

while(ifs.read(&bar,sizeof(bar))) 
{ 
    // Do Stuff 
} 

如果read()方法的结果去高达的EOF循环将被输入。
如果read()方法的结果去过去的EOF循环将不enetered

  • 注意:阅读()将只走过去的EOF如果有留下的文件中的零个字节。否则它会读到文件的末尾。因此,如果文件中还剩下一些东西,则始终输入循环。

原因是读取结果(返回值)是对流的引用。如果流在布尔上下文中使用(如if测试表达式),它将被转换为可以在这种上下文中使用的类型。此转换的结果测试EOF标志(除了其他几个标志之外),并在EOF为真时返回false的对等值。

注:
此技术更好地工作,如果你使用操作符重载< <您的酒吧类,因为这应该阅读正是它需要的对象,而不要去过去的EOF。然后让对象直接读取到文件末尾,而不必重新开始。我担心读取的事情是,如果read()需要10个字节并且文件中只有5个字节,那么部分填充的对象会发生什么?

如果你想继续使用你的风格的代码应该是这样的:

ifs.open("foo"); 
while (!ifs.eof()) 
{ 
    ifs.read(&bar,sizeof(bar)); 
    if (ifs.eof()) 
    { break; 
    } 
    // Do Stuff 
}