【问题标题】:what are the semantics of an iostream statement like myoutput << myinput.rdbuf() in c++?c++ 中像 myoutput << myinput.rdbuf() 这样的 iostream 语句的语义是什么?
【发布时间】:2012-10-12 06:52:57
【问题描述】:

以这段代码为例

std::ifstream myinput("myinput.txt");
std::ofstream myoutput("myoutout.txt");
myoutput << myinput.rdbuf();
  1. 操作的语义是什么?
  2. C++ 版本是运算符的特定重载
  3. 有没有更明确的方法[通过使用命名函数而不是运算符]来实现相同的效果?
  4. 如何知道在操作中复制了多少字节?
  5. 我可以限制复制的字节数吗?
  6. 您能否概述一下这种特定的 operator

【问题讨论】:

  • "4. 我如何知道在操作中复制了多少字节?"看来您已经对第 1 部分中发生的事情有了相当好的了解,不是吗?
  • 好吧,有人告诉我它应该复制整个文件。但我没有找到任何关于此的文档,也没有找到该特定运算符

标签: c++ stl iostream


【解决方案1】:
  1. 它将整个输入流(整个文件)复制到输出流。
  2. 它一直在 C++ 中可用。 std::ifstream 在&lt;istream&gt; 中定义,std::ofstream 在&lt;ostream&gt; 中定义。
  3. 不,这是唯一的方法。
  4. 使用 myoutput.tellp()。
  5. 您需要使用 std::ifstream::read 在循环中手动读取流,将数据复制到缓冲区并使用 std::ofstream::write 将该数据写入输出流,直到您已复制您想要的金额。
  6. 如果您安装了 C++ 编译器,您可以查看它的实现(大多数流类都是模板,这意味着它们的实现必须在标头中)。对于std::basic_ios::rdbuf,您可以查看&lt;ios&gt;,对于std::ostream::operator&lt;&lt;(std::basic_streambuf*),您可以查看&lt;ostream&gt;

【讨论】:

  • 假设文件真的很大,是继续从输入文件读取,还是只是复制缓冲区的内容?
  • @AviadRozenhek 相同的答案。所有的流库一直都在 C++ 中可用。事实上,我认为它甚至从未改变过,除非是在 C++ 的早期阶段。
猜你喜欢
  • 2019-09-02
  • 2022-01-12
  • 2021-06-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多