条款29:需要一个一个字符输入时考虑使用istreambuf_iterator
假设我们要把一个文本文件拷贝到一个字符串对象中。似乎可以用一种很有道理的方法完成:
ifstream inputFile("interestingData.txt"); string fileData((istream_iterator<char>(inputFile)), // 把inputFile读入 istream_iterator<char>()); // fileData;关于为什么 // 它不是很正确看下文 // 关于这个语法的警告 // 参见条款6
很快你就会发现这种方法无法把文件中的空格拷贝到字符串中。那是因为istream_iterators使用operator<<函数来进行真的读取,而且operator<<函数在默认情况下忽略空格。
假如你想保留空格,你要的做就是覆盖默认情况。只要清除输入流的skipws标志就行了:
ifstream inputFile("interestingData.txt"); inputFile.unset(ios::skipws); // 关闭inputFile的 // 忽略空格标志 string fileData((istream_iterator<char>(inputFile)), istream_iterator<char>());
现在inputFile中的所有字符都拷贝到fileData中了。
唉,你会发现它们的拷贝速度不像你想象的那么快。istream_iterators所依靠的operator<<函数进行的是格式化输入,这意味着每次你调用的时候它们都必须做大量工作。它们必