CreateFile
vs fopen
vs ofsteam
-优势和劣势?
我听说 CreateFile 功能强大但仅适用于 windows。
你能告诉我应该使用什么(在 Windows 上)以及为什么?
这取决于你在做什么。对于顺序读取和写入文本文件,iostream 绝对是要走的路。对于涉及交易安全或非标准设备的任何事情,您必须直接访问系统(CreateFile
或open
)。即使这样,对于文本的顺序读取和写入,最好的解决方案是定义自己的streambuf
,并将其与 iostream 一起使用。
我想不出任何fopen
更可取的上下文。
除非您需要 Windows 文件函数提供的功能(例如重叠 I/O),否则我的建议是使用 C++ 中的 iostreams 或 C 中的FILE
(fopen
和朋友)。
除了更便携之外,您还可以对文本文件使用格式化的输入/输出,而对于 C++,很容易为您的类重载输出/输入运算符。
如果您想使用 Windows 文件内存映射,您应该使用CreateFile
(例如,HANDLE
传递给CreateFileMapping API 的是 的返回值CreateFile
)。此外,CreateFile
提供比 C 和 C++ 标准文件 API 更高的自定义选项。
但是,如果您想编写可移植代码,或者如果您不需要 Windows 特定的功能,C 和 C++ 标准文件 API 就可以了。在一些测试中,当处理大数据时,我注意到 C++ I/O 流与原始 C 文件 API 的一些性能开销;如果您碰巧遇到这种情况,您可以简单地将原始 C 文件 API 包装在某个 C++ RAII 类中,并仍然在 C++ 代码中使用它。
除非您绝对需要 OS API 函数(如CreateFile
)提供的额外功能,否则我建议您使用标准库函数(如fopen
或ofstream
)。这样,您的程序将更具可移植性。
我能想到的唯一真正的优势CreateFile
是重叠的 I/O 和更细粒度的访问权限。
在大多数情况下,最好在 C 中使用 fopen 或在 C++ 中使用 ofstream。CreateFile 对共享和缓存提供了一些额外的控制,但不提供格式化功能。
我复制了我的答案
由于某种原因而关闭,这让我无法理解......
结论:
不要害怕这些小任务。您实际上会知道,与调用它的代码相比,您的代码中发生了什么,并且这些小代码片段应该可以忽略不计(以代码行数计)。此外,如果您对所有事情都使用 RAII,那么调用这些实用程序类的代码将比不使用 RAII 并且必须使用两步甚至更多步初始化时要少得多,并且容易出错的可能性要小得多。用其他操作系统的等效实用程序类替换这些实用程序类也是小菜一碟(在 UNIX 上使用 open()/close()/read()/write())。
为了过去的几千年,不要阅读谷歌编程指南!