gpt4 book ai didi

c++ - 为什么使用 fopen 打开流并使用读/写(而不是 fread/fwrite)执行 I/O

转载 作者:行者123 更新时间:2023-11-30 05:29:12 24 4
gpt4 key购买 nike

在查看 libstd++ (GNU CC 4.9.2) 中 basic_filebuf 的实现时,我遇到了 __basic_file 类,我可以了解设计原理。具体来说:

  1. __basic_file::open 使用 C stdio fopen
  2. 实现
  3. __basic_file::sync 使用 C stdio fflush
  4. 实现
  5. 所有其他方法都是使用系统调用实现的(例如readwritelseek)

我明白为什么 I/O 是使用系统调用执行的(filebuf/streambuf 实现它们自己的缓冲)但是为什么要用 C stdio 打开文件首先

为什么要在 sync 中刷新 stdio 缓冲区(这不会引入一些奇怪的边缘情况)?例如,如果由于某种原因 fwrite 除了执行 C++ 流写入外还被客户端代码调用,则可能不会遵守写入顺序(即发生 filebuf 写入,fwrite 发生但未填充 stdio 缓冲区并实际输出任何内容,filebuf 再次写入并显式或隐式调用 sync ... 然后fwrite 数据将最后写入 - 我意识到这是一个人为的例子,但理论上是可能的)。

最佳答案

有一个标准函数,std::base_io::sync_with_stdio,可用于关闭原始 C io 和缓冲 C++ 内容的默认同步和可能代价高昂的同步。我现在还没有确凿的证据,但我敢猜测这意味着(通过逆逻辑)您的边缘情况已被涵盖。

关于c++ - 为什么使用 fopen 打开流并使用读/写(而不是 fread/fwrite)执行 I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36509196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com