读取.part文件并将它们连接起来

时间:2013-02-13 05:46:34

标签: c++

所以我正在为学校项目编写自己的自定义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;

1 个答案:

答案 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