所以我正在为学校项目编写自己的自定义FTP客户端。我设法让一切都与蜂拥而至的FTP客户端一起工作,直到最后一小部分......将.part文件读入主文件。我需要做两件事。 (1)读取每个文件并正确写入最终文件(2)完成每个文件后删除部分文件的命令。
有人可以帮我修一下我在下面写的连接函数吗?我以为我有权在EOF之前阅读每个文件然后继续下一个文件。
在这种情况下,*numOfThreads
为17.使用4742442字节而不是594542592字节的文件结束。谢谢,我很乐意提供任何其他有用的信息。
编辑:修改后的评论代码。
std::string s = "Fedora-15-x86_64-Live-Desktop.iso";
std::ofstream out;
out.open(s.c_str(), std::ios::out);
for (int i = 0; i < 17; ++i)
{
std::ifstream in;
std::ostringstream convert;
convert << i;
std::string t = s + ".part" + convert.str();
in.open(t.c_str(), std::ios::in | std::ios::binary);
int size = 32*1024;
char *tempBuffer = new char[size];
if (in.good())
{
while (in.read(tempBuffer, size))
out.write(tempBuffer, in.gcount());
}
delete [] tempBuffer;
in.close();
}
out.close();
return 0;
答案 0 :(得分:3)
几乎复制循环中的所有内容都存在问题。
while (!in.eof())
这已经破了。没什么可说的。
bzero(tempBuffer, size);
这是相当无害的,但完全没有意义。
in.read(tempBuffer, size);
这是“差不多”的部分 - 即一件没有明显破损的部分。
out.write(tempBuffer, strlen(tempBuffer));
您不希望使用strlen
来确定长度 - 它仅适用于NUL终止(C风格)字符串。如果(显然是这种情况),您读取的数据可能包含零字节(而不是仅使用零字节来表示字符串的结尾),这只会产生错误的大小。
你通常想做的是一个循环,如:
while (read(some_amount) == succeeded)
write(amount that was read);
在C ++中通常类似于:
while (infile.read(buffer, buffer_size))
outfile.write(buffer, infile.gcount());
可能还值得注意的是,由于您使用new
为缓冲区分配内存,但从不使用delete
,因此您的函数正在泄漏内存。没有new
可能更好的做法 - 数组或向量在这里是明显的选择。
编辑:至于while (infile.read(...))
的工作原理,read
会返回对流的引用。该流反过来提供到bool
(在C ++ 11中)或void *
(在C ++ 03中)的转换,可以解释为布尔值。该转换运算符返回流的状态,因此如果读取失败,它将被解释为false
,但只要成功,它将被解释为true
。