最终计算0,即使阅读成功

count eventually 0 even though read successful

本文关键字:成功 计算      更新时间:2023-10-16

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

这是一个很难问的问题,所以请让我知道您是否需要更多信息。我希望那里有人也有类似的问题。

谢谢

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

istream :: gcount返回最后一个未形式提取的字符数 在对象上执行的输入操作。

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

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

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

换句话说,当您的gcount返回0时,这意味着没有从istreams [i]读取的新数据。

我希望这会有所帮助!

- Alex