假如我们想把一个文本文件的内容复制到一个string对象中:
ifstream inputFile("xxx.txt");
// 不正确
string fileData(istream_iterator<char>(inputFile), istream_iterator<char>());
这段代码并没有把文件中的空白字符复制到string对象中。因为istream_iterator使用operator>>函数来完成实际的读操作,而默认情况下operator>>函数会跳过空白字符。
如果希望保留空白字符,需要清除输入流的skipws标志:
ifstream inputFile("xxx.txt");
inputFile.unsetf(ios::skipws);
string fileData(istream_iterator<char>(inputFile), istream_iterator<char>());
现在,inputFile中的所有字符会被复制到fileData中。
但是这种方法效率较低,有一种更有效的方法,使用istreambuf_iterator。istream_iterator<char>对象使用operator>>从输入流中读取单个字符,而istreambuf_iterator<char>直接从流的缓冲区读取下一个字符。
ifstream inputFile("xxx.txt");
string fileData(istreambuf_iterator<char>(inputFile), istreambuf_iterator<char>());
对于非格式化的逐个字符输入过程,总是应该考虑使用istreambuf_iterator。对于非格式化的逐个字符输出过程,总是应该考虑使用ostreambuf_iterator。