C vs C++文件处理

0as*_*am0 9 c c++ file-io file

我一直在使用C和C++,当涉及到文件处理时,我感到困惑.让我说出我所知道的事情.

在C中,我们使用函数:

  • fopen,fclose,fwrite,fread,ftell,fseek,fprintf,fscanf,feof,fileno,fgets,fputs,fgetc,fputc.
  • 文件指针的FILE*fp.
  • 模式如r,w,a

我知道何时使用这些功能(希望我没有错过任何重要的事情).

在C++中,我们使用函数/运算符:

  • fstream f
  • f.open,f.close,f >>,f <<,f.seekg,f.seekp,f.tellg,f.tellp,f.read,f.write,f.eof.
  • 模式如ios :: in,ios :: out,ios :: bin等...

那么(推荐)可以在C++中使用C兼容的文件操作吗?哪个更广泛使用,为什么?除了这些我还应该注意什么?

Ton*_*roy 14

有时候现有的代码需要一个或另一个需要与之交互,这可能会影响您的选择,但一般来说,如果C版本没有问题可以解决,那么就不会引入C++版本.改进包括:

  • RAII语义,这意味着例如fstream当他们离开范围时关闭他们管理的文件

  • 模式在发生错误时抛出异常的能力,这可以使代码更清晰地集中在典型/成功的处理上(有关API函数和示例,请参阅http://en.cppreference.com/w/cpp/io/basic_ios/exceptions)

  • 类型安全性,使得涉及的变量类型隐式地选择如何执行输入和输出

    • C风格的I/O有崩溃的可能性:例如int my_int = 32; printf("%s", my_int);,在哪里%s告诉printf指向ASCIIZ字符缓冲区的指针,而是my_int出现; 首先,传递约定的参数可能意味着ints被不同地传递给const char*s,其次sizeof int可能不相等sizeof const char*,最后,即使printf提取32const char* 最好它只会打印从内存地址32开始的随机垃圾,直到它巧合地击中NUL字符 - 远更有可能的是,该进程将缺乏读取某些内存的权限,程序将崩溃.现代C编译器有时可以根据提供的参数验证格式字符串,从而降低这种风险.
  • 用户定义类型的可扩展性(即您可以教流如何处理自己的类)

  • 支持根据实际输入动态调整接收字符串的大小,而C函数往往需要硬编码的最大缓冲区大小和用户代码中的循环来组合任意大小的输入

流有时也被批评为:

  • 格式的详细程度,特别是"io操纵器"设置宽度,精度,基数,填充,与printf样式格式字符串相比

  • 有时令人困惑的操纵器组合,它们将设置保持在多个I/O操作中,而其他操作符则在每次操作后重置

  • RAII推送/保存以及稍后弹出/恢复操纵器状态缺乏便利性类别

  • 正如Ben Voigt 在这里发表评论和文件一样缓慢

  • 对iostreams的另一个批评是[它们的速度很慢](http://stackoverflow.com/q/4340396/103167) (3认同)