【问题标题】:C++: Read files in 4096B steps [duplicate]C ++:以4096B步骤读取文件[重复]
【发布时间】:2014-09-02 22:43:06
【问题描述】:

我想写一个带套接字的 ftp 类,到目前为止,文本文件上传效果很好,但后来我想上传一个更大的文件,一部电影,但它没有用。

第一个 4096B 读得很好,但后来就什么也没有了。

也许我使用了错误的功能,请帮助我的代码。

这是我的阅读功能:

bool CStream::Read  (string * _OutString, unsigned int _iStartPos, unsigned int _iLength)
{
    if (!bInitialized)
        return false;

    int iReturn = 0;

    char * buffer;

    fseek (pFile, _iStartPos, SEEK_SET);

    buffer = new char[(unsigned int) _iLength + 1];

    iReturn = fread  (buffer, 1, (unsigned int) _iLength, pFile);

    if (iReturn == 0)
    {
        delete (buffer);

        return false;
    }
    else
        buffer[iReturn] = '\0';

    *_OutString = string (buffer, iReturn);

    delete (buffer);

    return true;
}

我就是这样称呼它的:

Stream.Read是上面的函数

Stream.FileSize (&iFileSize);

    while (iPos < iFileSize)
    {
        Stream.Read (&ReadData, iPos, 4096);

        Socket.Send   (ReadData, NULL, NULL);
        Socket.Reciev (&RecievData, NULL, NULL);

        if (RecievData != "ok")
            goto Error;

        iPos += 4096;
    }

【问题讨论】:

  • 你不能在套接字上fseek
  • fread() 的长度参数只是一个限制,不能保证它会读那么多。你需要不断地循环调用才能得到你想要的一切。
  • 您的问题是4096kB,但您的代码只是读取4096b 步骤。
  • 你不应该使用字符串作为输出,只需在循环之前创建一个 char 缓冲区并传递缓冲区的指针来读取。
  • @schacker22:将那些 delete (buffer); 调用更改为 delete [] buffer;。由于使用了new[]的数组形式,所以必须使用对应的delete[]

标签: c++ file-io buffer fread


【解决方案1】:

您当前正在等待 while 循环的每次迭代都得到 ok 响应。

为了获得更好的结果,您还应该真正考虑做其他一些事情:

  1. 打开要传输的文件一次,每次迭代以块的形式读取它,然后关闭它一次。多次打开和关闭它不好

  2. 正如其他人所提到的,您将 array-new 与 delete 混合在一起。使用数组删除,即。 delete [] buffer;

  3. 不要使用字符串作为中间缓冲区类型!

【讨论】:

  • 我不明白 1.,我不是多次打开和关闭文件,我在打开文件的地方有一个'Stream.intit()'函数,还有一个'Stream.intit()'函数。 quit()' 再次关闭的地方
猜你喜欢
  • 2021-08-07
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-29
  • 1970-01-01
  • 2012-09-21
  • 2017-05-01
相关资源
最近更新 更多