我正在编写一个iOS应用程序,它使用一段c ++代码,该代码使用istream从文件中读取数据。代码可以工作,但它反复使用,最终会达到读取限制,然后出现问题。它似乎成功读取但gcount返回0.这不是特定于某个文件或大小写,因为在重新启动应用程序后,一切都将从它停止的地方开始,一旦再次达到限制就会失败。感觉有一些istream会话进入了一个我无法摆脱的糟糕状态。我正在关闭我打开的文件。
这就是我打开流的方式
iFiles.push_back(new ifstream([[[arrayOfPaths objectAtIndex:i] absoluteString] cStringUsingEncoding:NSASCIIStringEncoding] , ios::in | ios::binary));
然后我有一个循环,我在这里阅读了这个文件:
while (!iStreams[0]->eof())
{
vector<vector<int64_t> > matrix;
int length = 0;
for (int i = 0; i < rows; i++)
{
char * buffer = new char [DEMUX_BUFFER];
iStreams[i]->read(buffer, DEMUX_BUFFER);
int int64Groups;
if(iStreams[i]->gcount() == 0)
{
//this is the catch for the bad case but buffer contains something even though count is 0
}
.....
这是一个很难问的问题,如果您需要更多信息,请告诉我。我跳出来的人有类似的问题。
谢谢
答案 0 :(得分:3)
我认为我需要更多代码才能提供更好的答案,但是从您的代码中,我可以告诉您我第一眼看到的地方:
istream :: gcount返回上次未格式化提取的字符数 对象执行输入操作。
这意味着当到达文件末尾时,gcount将返回0,因为上次读取操作无法读取任何新数据。
现在,缓冲区中有一些随机位是正常的,因为空间已分配,但您从未将缓冲区归零。因此,缓冲区将包含随机分配的内存中的一些随机位。为了避免混淆,您可以添加一个语句,通过在分配之后立即添加此语句来清除缓冲区最初具有的任何垃圾:
memset(buffer, 0, sizeof(buffer));
换句话说,当你的gcount返回0时,表示没有从iStreams [i]读取的新数据位。
我希望这有帮助!
- Alex