c++ - 读取 .part 文件并将它们全部连接起来

标签 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;

最佳答案

几乎您复制循环中的所有内容都有问题。

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 —— 数组或 vector 显然是这里的替代品。

编辑:至于为什么 while (infile.read(...)) 有效,read 返回对流的引用。流依次提供到 bool(在 C++11 中)或 void *(在 C++03 中)的转换,可以解释为 bool 值。该转换运算符返回流的状态,因此如果读取失败,它将被解释为 false,但只要成功,它就会被解释为 true

关于c++ - 读取 .part 文件并将它们全部连接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14847180/

相关文章:

C++:将不可移动的仿函数传递给 std::function

c++ - 具有公共(public)领域许可的最佳 zip 库

.net - 64 位 Win 上缺少 dll

c++ - 在队列中,插入删除后,被删除的元素也出现在Output中,为什么?

c++ - 在 linux 中使用 codeBlocks 编写 OpenCV 程序时出现运行时错误

c++ - 制作 C 项目而不是 C++

c++ - 简单的 C++ 地址/指针说明

c++ - 使用私有(private)复制/移动构造函数进行聚合初始化

c++ - 立体声乒乓延迟 C++

c++ - 在整个硬盘中查找文件