C风格,C ++流或Win32 API文件I / O?

时间:2011-06-02 18:25:25

标签: c++ winapi file-io

我阅读C++ Streams vs. C-style IO?(以及其他页面)试图帮助我决定在我正在进行的项目中实现某些文件IO的方法。

背景 我是C ++和Windows编程的新手,我一直在C和命令行应用程序中工作。对这个问题的n00b提前道歉。

问题 我想读取一个文本文件,处理内容并输出到另一个(新)文本文件。我在Win32环境中工作(这对于可预见的未来不会改变)并且正在通过_T样式宏编写应用程序以识别Unicode。 “处理”可以包括插入/附加/删除文本行,最多128个字符。

问题 我更愿意写一些强大的东西,因此I / O错误处理是一个考虑因素。我认为我需要远离C风格文件I / O,除非简化代码和类型检查没有其他原因 - 即在更多的OO POV中处理这个问题。使用Win32 API函数而不是C ++流函数(如果有的话)有什么好处?你能为这两种方法推荐一个好的底漆吗? (我的谷歌搜索给我留下了一点信息超载)

非常感谢

4 个答案:

答案 0 :(得分:7)

  

使用Win32 API函数而不是C ++流函数(如果有的话)有什么好处?

  1. 速度
  2. 能够使用重叠I / O一次处理多个操作而无需线程(以及同步的复杂性)
  3. 速度
  4. 更具体的错误代码
  5. 速度
  6. 速度
  7. 低依赖性足迹(与MSVC ++ 7.x,8.0,9.0,10.0和大多数其他供应商相比)
  8. 速度

答案 1 :(得分:5)

使用C ++流I / O.写入文本文件几乎不会给I / O库带来压力,您可以获得代码清晰度,类型安全性以及几乎无需编写任何内容来完成工作的巨大好处。作为一个副作用,你的代码可能会更便携,更容易理解,所以如果你在这里问一下,你会得到更好的答案。

答案 2 :(得分:3)

为了更广泛地看一下,如果你需要一个没有额外依赖关系的小应用程序,直接使用Win32是好的。

对于C ++ iostreams做得更好的任何事情,你可能想看看Boost :: Spirit。看起来它具有iostream的所有类型安全性,具有更好的性能。

这里确实有两个问题:文件I / O和文本处理。 Win32做得非常好,第二次没有帮助。 Boost :: Spirit做得非常好。 C ++ iostream在两个任务中都是边缘的,除非可移植性是最重要的特性,否则它们应该避免使用它们。

答案 3 :(得分:0)

只是提供一个粗略的基准 - 这段代码必须是最低效的代码:

#include <iostream>
using namespace std;

unsigned int MB = 1024 * 1024;
unsigned int GB = MB * 1024;

int main() {
    char c = 'x';
    for ( unsigned int i = 0; i < GB; i++ ) {
        cout << c;
    }
}

在调用时将大量数据写入文本文件大约需要4分钟:

myprog > file.txt

在我几乎没有最先进的笔记本电脑上。