【发布时间】: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[]