0

我想通过读取数据块来复制文件,将其发送,然后将其重新组合在一起。发送不是问题的一部分,所以我在代码中省略了它。它应该适用于任何类型的文件和任意piece_lengths。

这只是一个前期阶段。最后数据块不应该顺序选择,而是随机选择。接收另一个数据块之间可能有一段时间。

我知道这个例子是有意义的size % piece_length != 0

我在另一端收到与原始文件大小相同的崩溃文件。有没有人看到问题?

int main ()
{
string file = "path/test.txt"
string file2 = "path2/test.txt";

std::ifstream infile (file.c_str() ,std::ifstream::binary);
//get size of file
infile.seekg (0,infile.end);
long size = infile.tellg();
infile.seekg (0);   
size_t piece_length = 5;



for (int i = 0; i < ((size / piece_length) + 1); i++)
{
    if ( i != (size / piece_length))
    {
        std::ifstream infile (file.c_str() ,std::ifstream::binary);
        infile.seekg((i * piece_length) , infile.beg);          
        char* buffer = new char[piece_length];
        infile.read(buffer, piece_length);
        infile.close();
        std::ofstream outfile (file2.c_str() ,std::ofstream::binary);
        outfile.seekp((i * piece_length), outfile.beg);
        outfile.write(buffer, piece_length);
        outfile.close();
    }
    else 
    {
        std::ifstream infile (file.c_str() ,std::ifstream::binary);
        infile.seekg((i * piece_length) , infile.beg);          
        char* buffer = new char[size % piece_length];
        infile.read(buffer, size % piece_length);
        infile.close();
        std::ofstream outfile (file2.c_str() ,std::ofstream::binary);
        outfile.seekp((i * piece_length), outfile.beg);
        outfile.write(buffer, size % piece_length);
        outfile.close();
        }
}
return 0;
}
4

1 回答 1

1

要回答您的特定问题,您需要在标志中打开outfileios::in | ios::out否则它默认为只写模式并破坏文件中已有的内容。有关更多详细信息,请参阅此答案:写入现有二进制文件的中间 c++

您可能需要考虑以下事项:

  • 如果您只是将部分写入文件末尾,只需使用ios::app(append)。甚至不需要寻找。
  • 您不需要继续重新打开infile,甚至不需要outfile重复使用它们。
  • 您还可以重复使用buffer. 请记住delete他们,或者最好使用std::vector.
于 2013-03-11T12:37:07.933 回答