2013-02-13 83 views
0

因此,我正在为学校项目编写自己的自定义FTP客户端。我设法让所有的东西都可以和蜂拥而至的FTP客户端一起工作,然后到最后一小部分......将.part文件读入主文件。我需要做两件事。 (1)读取每个文件并正确写入最终文件(2)完成每个文件后删除部分文件的命令。读取.part文件并将它们全部连接起来

有人可以帮我解决我写下面的连接函数吗?我认为我已经正确地阅读每个文件直到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

作为通知,您可以使用in.gcount()来访问读取字节数。此外,你不释放tempBuffer变量。其他的一切对我来说都很好。你有没有检查文件内容?哪个文件被截断并在哪里? – Spook 2013-02-13 05:59:04

+0

'ifstream :: read'返回'istream&',因此在while循环中使用它作为条件似乎没有太多意义。我会使用'while(!in.eof())'代替。 – Spook 2013-02-13 06:53:05

回答

3

在复制循环几乎一切都有问题。

while (!in.eof()) 

这是坏了。没什么比这更多的说。

 bzero(tempBuffer, size); 

这是相当无害的,但完全没有意义。

  in.read(tempBuffer, size); 

这个“几乎”的部分 - 即一个没有明显断裂的部分。

  out.write(tempBuffer, strlen(tempBuffer)); 

你不想使用strlen确定长度 - 它仅用于NULL结尾的(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

+0

内存泄漏。对于那个额外点Ty是一个漫长的一天。 – MasterGberry 2013-02-13 06:04:54

+0

所以我按照你的建议进行了修改,并且比以前做得更多了....尽管如此,还是有点不合适。我用'594378752'字节替代'594542592'字节,总共丢失了'163840'字节。我用上面提到的最新版本修改了我的代码。 – MasterGberry 2013-02-13 06:13:16

+1

'istream :: read'返回'istream&',while(infile.read())'是什么意思?应该使用'infile.eof()'来代替。 – Spook 2013-02-13 06:45:58

相关问题