我想通过读取数据块来复制文件,然后将其重新组合在一起。发送不是问题的一部分,所以我把它留在了代码中。它应该适用于任何类型的文件和任意的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;
}
答案 0 :(得分:1)
要回答您的具体问题,您需要在标志中打开outfile
ios::in | ios::out
,否则默认为只写模式并销毁文件中已有的内容。有关详细信息,请参阅此答案:Write to the middle of an existing binary file c++
您可能需要考虑以下因素:
ios::app
(追加)。甚至不需要寻求。infile
甚至outfile
,只需重复使用即可。buffer
。请记得delete
他们,或者更好地使用std::vector
。