即使读取成功,最终计数为 0

count eventually 0 even though read successful

我正在编写一个 iOS 应用程序,它使用一段 C++ 代码,该代码使用 istream 从文件中读取数据片段。该代码有效,但它被反复使用,最终达到读取限制,然后出现问题。它似乎成功读入,但 gcount returns 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 returns the number of characters extracted by the last unformatted input operation performed on the object.

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

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

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

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

希望对您有所帮助!

-- 亚历克斯