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