尽管读取成功,但最终计数为0

时间:2015-05-13 17:59:29

标签: c++ ios objective-c istream

我正在编写一个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
        }
        .....

这是一个很难问的问题,如果您需要更多信息,请告诉我。我跳出来的人有类似的问题。

谢谢

1 个答案:

答案 0 :(得分:3)

我认为我需要更多代码才能提供更好的答案,但是从您的代码中,我可以告诉您我第一眼看到的地方:

  

istream :: gcount返回上次未格式化提取的字符数   对象执行输入操作。

这意味着当到达文件末尾时,gcount将返回0,因为上次读取操作无法读取任何新数据。

现在,缓冲区中有一些随机位是正常的,因为空间已分配,但您从未将缓冲区归零。因此,缓冲区将包含随机分配的内存中的一些随机位。为了避免混淆,您可以添加一个语句,通过在分配之后立即添加此语句来清除缓冲区最初具有的任何垃圾:

memset(buffer, 0, sizeof(buffer));

换句话说,当你的gcount返回0时,表示没有从iStreams [i]读取的新数据位。

我希望这有帮助!

- Alex