0

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

1 回答 1

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

于 2013-02-13T05:58:24.527 回答