2012-10-22 63 views
1

采取这种代码的例子什么是iostream语句的语义,如myoutput << myinput.rdbuf()在c + +?

std::ifstream myinput("myinput.txt"); 
std::ofstream myoutput("myoutout.txt"); 
myoutput << myinput.rdbuf(); 
  1. 哪些操作的语义?
  2. C++版本是这个运营商的具体超载问题< < available in in?
  3. 是有没有更明确的方式[使用命名的函数,而不是运营商为了达到同样的效果?
  4. 我怎么能知道多少字节,其中在操作复制?
  5. 我可以限制复制的字节数量?
  6. 您可以概述如何实施运营商的这种特定超载或指向已建立的实施?
+1

“4.我怎么知道在操作中拷贝了多少字节?”好像你对第一部分的内容有一个相当好的概念,那么,不是吗? – dasblinkenlight

+0

有人告诉我,它应该复制整个文件。但我没有找到任何文档,也没有找到该特定运算符的规范<<,它的语义,错误条件等。 –

回答

3
  1. 它将整个输入流(整个文件)复制到输出流。
  2. 它始终在C++中可用。 std :: ifstream在<istream>中定义,而std :: ofstream在<ostream>中定义。
  3. 不,这是唯一的办法。
  4. 使用myoutput.tellp()。
  5. 您需要使用std :: ifstream :: read手动读取流中的数据,将数据复制到缓冲区并使用std :: ofstream :: write将数据写入输出流,直到您'已经复制了你想要的金额。
  6. 如果您安装了C++编译器,您可以查看它的实现(大部分流类都是模板,这意味着它们的实现必须位于标题中)。对于std::basic_ios::rdbuf,你可以看看在<ios>,并为std::ostream::operator<<(std::basic_streambuf*),你可以看看在<ostream>
+0

假设文件非常大,它是否继续从输入文件读取,或者它只是复制缓冲区的内容? –

+0

我稍微编辑了这个问题,使#2更清晰。 –

+0

@AviadRozenhek同样的答案。所有的流库都一直在C++中可用。事实上,我认为它甚至都没有改变,除了可能在C++的早期阶段。 – user1610015