如何用c++的流操作複製文件 fstream

出處:http://www.cppblog.com/qinghuaboy/archive/2009/09/07/95471.html

使用C++標準程序庫的輸入輸出流(I/O Stream)複製文件,存在許多的方法,

方法一:逐個字符複製
#include < fstream >

std::ifstream input(“in”,ios::binary);
std::ofstream output(“out”,ios::binary);
char ch;
while (input.get(ch)) output << ch;

注意:如果使用input>>ch讀取字符,則必須先調用input.unsetf(ios::skipws)取消輸入流默認的跳過空白符的輸入格式,因為換行符是空白符的一種。


方法二:逐行複製#include < fstream >
#include < string >

std::ifstream input(“in”,ios::binary);
std::ofstream output(“out”,ios::binary);
std::string line;
while (getline(input,line)) output << line << “n”;

注意:這裡的代碼有一個小小的缺陷,如果文件不是純文本格式的文件,或者文本文件的最後沒有換行符,那麼會導致複製後的文件末尾添加了一個多餘的換行符。


方法三:迭代器複製#include < fstream >
#include < iterator >
#include < algorithm >

std::ifstream input(“in”,ios::binary);
std::ofstream output(“out”,ios::binary);
input.unsetf(ios::skipws);
copy(istream_iterator(input),istream_iterator(),ostream_iterator(output,””));

同樣這裡也有一個小技巧,輸入流的格式默認為跳過空白字符,因此調用unsetf取消這個格式,才可保證正確的複製。


方法四:緩衝區複製#include < fstream >

std::ifstream input(“in”,ios::binary);
std::ofstream output(“out”,ios::binary);
output << input.rdbuf();

這裡直接使用了輸入流的緩衝區,因此沒有引入額外的臨時對象。

很顯然,上述四種方法中,最後一種方法最簡潔,由於直接操作輸入流的緩衝區,從運行效率上來說,也比其他方法有著略微的優勢(當然,由於操作系統可能提供了額外的基於設備的文件緩衝機制,也許你無法證實這一點)。因此,除非要對輸入內容進行處理,直接複製文件推薦最後一種方法,既不容易出錯,又能獲得良好的性能。

未經允許不得轉載:GoMCU » 如何用c++的流操作複製文件 fstream