2011-10-25 41 views
3

我无法在Visual Studio 2010的C++中将大文件读入我自己的缓冲区中。下面是我的代码片段,其中长度是我正在读取的文件的大小,bytesRead在运行之前设置为0,并且文件是std :: ifstream。C++读取()问题

buffer = new char[length]; 
    while(bytesRead < length){ 
     file.read(buffer + bytesRead, length - bytesRead); 
     bytesRead += file.gcount(); 
    } 
    file.close(); 

我注意到,gcount的()在第二次读取返回0及以后,意思就是阅读()没有给我任何新角色,所以这是一个无限循环。我想继续阅读文件的其余部分。我知道即使文件中有更多数据,eofbit也会在第一次读取后设置。

我不知道我能做些什么来阅读更多。请帮忙。

+1

为什么你不检查错误?为什么'gcount'返回0? – littleadv

+0

我知道eofbit已设置,但实际上文件中有更多数据。我会将这些信息添加到问题中。 – Aura

+1

用第二个参数'(std :: ios_base :: in | std :: ios_base :: binary)打开文件' –

回答

3

确保以二进制模式打开文件(std::ios::binary)以避免任何换行。使用文本模式可能会导致您假定文件的长度是您可以从文件中读取的字节数。

在任何情况下,如果发生错误(可能会无限期地继续),在读取和停止之后检查流的状态是一种很好的做法。

+0

这实际上是我的问题。我使用file.open(文件名),并将其更改为file.open(文件名,标准:: ios ::二进制)它工作正常。谢谢。 – Aura

2

听起来好像您的数据流处于失败状态,此时大多数操作都会立即失败。你需要clear该流才能继续阅读。

+1

但知道_why_它处于失败状态很重要。 –

+0

@MooingDuck:那要看。在某些情况下,你希望它进入一个失败的状态(考虑写一个'tail -f'的模仿),并且可能不需要检查每个时间。但是,是的,至少在大多数情况下你可能会这样做。我当然不是故意暗示你所做的事情只是“清楚”,只有在你清除它之前,所有进一步的阅读尝试都将失败。 –