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

C++ 读取.part文件并将它们全部连接起来,c++,C++,因此,我正在为一个学校项目编写自己的自定义FTP客户端。我设法让所有的东西都与成群结队的FTP客户端一起工作,现在只剩下最后一个小部分了……将.part文件读入主文件。我需要做两件事。(1) 获取此命令以读取每个文件并正确写入最终文件(2)在完成每个文件后删除零件文件的命令 有人能帮我修复我在下面写的连接函数吗?我认为我有权利在EOF之前阅读每个文件,然后继续阅读下一个文件 在本例中,*numOfThreads为17。最终得到的文件是4742442字节,而不是594542592字节。谢谢,我很乐

因此,我正在为一个学校项目编写自己的自定义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;
std::string s=“Fedora-15-x86_64-Live-Desktop.iso”;
标准:流出流;
open(s.c_str(),std::ios::out);
对于(int i=0;i<17;++i)
{
std::ifstream-in;
std::ostringstream转换;
convert复制循环中的几乎所有内容都有问题

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);
while (infile.read(buffer, buffer_size))
    outfile.write(buffer, infile.gcount());
C++中的p>通常会像:

while (read(some_amount) == succeeded)
    write(amount that was read);
while (infile.read(buffer, buffer_size))
    outfile.write(buffer, infile.gcount());
可能还值得注意的是,由于您正在使用
new
为缓冲区分配内存,但从未使用
delete
,因此您的函数正在泄漏内存。对于这一点,最好不要使用
new
,数组或向量是明显的替代方法

编辑:至于为什么
while(infle.read(…)
工作,
read
返回对流的引用。流反过来提供到
bool
(在C++11中)或
void*
(在C++03中)的转换这可以解释为布尔值。该转换运算符返回流的状态,因此如果读取失败,它将被解释为
false
,但只要成功,它将被解释为
true

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

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);
while (infile.read(buffer, buffer_size))
    outfile.write(buffer, infile.gcount());
C++中的p>通常会像:

while (read(some_amount) == succeeded)
    write(amount that was read);
while (infile.read(buffer, buffer_size))
    outfile.write(buffer, infile.gcount());
可能还值得注意的是,由于您正在使用
new
为缓冲区分配内存,但从未使用
delete
,因此您的函数正在泄漏内存。对于这一点,最好不要使用
new
,数组或向量是明显的替代方法


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

,作为通知,您可以在.gcount()中使用访问读取字节数。另外,您没有释放tempBuffer变量。其他一切对我来说都很好。您检查了文件内容吗?哪个文件被截断,在哪里?
ifstream::read
返回
istream&
,因此在while循环中使用它作为条件似乎没有多大意义。我将使用
while(!in.eof())
请注意,您可以在.gcount()中使用访问读取字节数。另外,您没有释放tempBuffer变量。其他一切对我来说都很好。您检查了文件内容吗?哪个文件被截断,在哪里?
ifstream::read
返回
istream&
,因此在while循环中使用它作为条件似乎没有多大意义。我将使用
while(!in.eof())
相反。哎呀,内存泄漏。对于这一点,这是漫长的一天。因此,我按照你的建议进行了更改,并且比以前做得更进一步……但仍然有点偏离。我使用了
594378752
字节而不是
594542592
字节,总共缺少
163840
字节。我用您建议的最新版本。
istream::read
返回
istream&
,while(infle.read())
的意义是什么?应该使用
infle.eof()
取而代之。@Spook:请看专门介绍这一点的文章。我特别推荐Nawaz的答案。很公平,我得到了更正。不过,在这种情况下,使用eof似乎是个好主意,因为
infle.gcount()
将返回0,以防您正好到达流的末尾,不是吗?哎呀,内存泄漏。对于这额外的一点,这是一个漫长的一天。因此,我按照您的建议进行了更改,并且比以前做得更进一步……但仍然有点偏离。我使用了
594378752
字节,而不是
594542592
字节,缺少
16384总共0
字节。我用您建议的最新版本修改了上面的代码