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