2013-03-11 30 views
0

我想要通過讀取數據塊來複制文件,發送它並將它重新放回到一起。發送不是問題的一部分,所以我把它放在代碼中。它應該可以處理任何類型的文件和任意的piece_lengths。拆分文件並將其放回到一起C++

這只是一個前期階段。最後的數據塊不應該順序選擇,而是隨機選擇。在接收另一個數據塊之間可能會有一段時間。

我知道這個例子只有在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; 
} 
+1

爲什麼不先讀整個文件,然後從內存中將東西分塊? – 2013-03-11 12:12:24

+0

首先它可能是一個非常大的文件,seconde可能在發送兩個塊之間有很多時間。 – user2156561 2013-03-11 12:16:04

回答

1

爲了回答您的具體問題,你需要打開outfile與標誌ios::in | ios::out,否則默認爲只寫模式,並破壞了已經在文件中。看到這個答案的詳細信息:Write to the middle of an existing binary file c++

你可能要考慮,雖然以下幾點:

  • 如果你只是寫零件到文件的末尾,只需使用ios::app(追加)。甚至不需要尋求。
  • 您不需要保持重新打開infile甚至outfile,只需重新使用它們即可。
  • 您也可以重複使用buffer。請記住delete他們,或更好的使用std::vector
+0

謝謝,用標誌打開outfile解決了問題。我會考慮你的進一步筆記。 – user2156561 2013-03-11 12:50:24

相關問題