C对C++;文件处理 我一直在C和C++工作,当涉及到文件处理时,我感到困惑。让我陈述我知道的事情
在C中,我们使用函数:C对C++;文件处理 我一直在C和C++工作,当涉及到文件处理时,我感到困惑。让我陈述我知道的事情,c++,c,file,file-io,C++,C,File,File Io,在C中,我们使用函数: fopen、fclose、fwrite、fread、ftell、fseek、fprintf、fscanf、feof、文件号、fgets、fputs、fgetc、fputc 文件指针的FILE*fp r、w、a等模式 我知道什么时候使用这些函数(希望我没有错过任何重要的东西) 在C++中,我们使用函数/运算符: f流 F.OpFieldF.Fuff>,F有时存在一个或另一个代码,需要与之交互,这会影响到您的选择,但一般来说,如果没有C版本可以修复的问题,C++版本就
- fopen、fclose、fwrite、fread、ftell、fseek、fprintf、fscanf、feof、文件号、fgets、fputs、fgetc、fputc
- 文件指针的FILE*fp
- r、w、a等模式
- f流
- F.OpFieldF.Fuff>,F
有时存在一个或另一个代码,需要与之交互,这会影响到您的选择,但一般来说,如果没有C版本可以修复的问题,C++版本就不会被引入。改善措施包括:
- RAII语义,这意味着,例如,
s在文件离开作用域时关闭它们管理的文件fstream
- 当出现错误时抛出异常的模式能力,这可以使代码更加清晰,专注于典型/成功的处理(参见API函数和示例)
- 类型安全性,以便使用所涉及的变量类型隐式选择输入和输出的执行方式
- C型I/O具有崩溃的可能性:例如,
,其中int my_int=32;printf(“%s”,my_int)
告诉%s
期望一个指向ASCIIZ字符缓冲区的指针,但会出现printf
;首先,参数传递约定可能意味着my_int
s的传递方式与int
s不同,其次const char*
可能不等于sizeof int
,最后,即使sizeof const char*
将printf
提取为32
,充其量也只是从内存地址32开始打印随机垃圾,直到它同时命中NUL字符-更有可能的是,进程将缺乏读取部分内存的权限,程序将崩溃。现代C编译器有时可以根据提供的参数验证格式字符串,从而降低这种风险const char*
- C型I/O具有崩溃的可能性:例如,
- 用户定义类型的可扩展性(即,您可以教streams如何处理自己的类)
- 支持根据实际输入动态调整接收字符串的大小,而C函数往往需要硬编码的最大缓冲区大小和用户代码中的循环来组装任意大小的输入
- 与
样式的格式字符串相比,格式的详细程度,尤其是“io操纵器”设置的宽度、精度、基数和填充printf
- 一种有时令人困惑的操纵器组合,它跨多个I/O操作保留其设置,而其他操作在每次操作后重置
- 缺少用于RAII推送/保存和稍后弹出/恢复操纵器状态的便利类
- 正如Ben Voigt评论和文档中所说,速度缓慢
- 类型安全
- 实施的灵活性。可以编写代码来对通用
ostream
或istream
对象进行特定的格式化或输入。然后,应用程序可以使用任何类型的派生流对象调用此代码。如果我针对文件编写和测试的代码现在需要应用于套接字、串行端口或其他类型的内部流,则可以创建特定于此类I/O的流实现。以这种方式扩展C样式I/O甚至是不可能的 - 语言环境设置的灵活性:在我看来,使用单一全局语言环境的C方法存在严重缺陷。我曾经遇到过这样的情况:我调用了库代码(一个DLL),它更改了代码下面的全局语言环境设置,并完全破坏了我的输出。C++流允许您在流对象上使用代码> IMBUEE()/<代码>任何区域。
<> /> UL> < P>在代码> PrimtFor()/<代码> />代码> fWord< /COD>样式I/O和C++ IO流格式的性能差异是非常依赖于实现的。一些实现(例如VisualC++),在文件*对象的顶部构建IO流,这会增加它们的实现的运行时复杂度。但是,请注意,以这种方式实现库没有特定的约束
我自己认为,C++ I/O的好处如下:
- 这里可以找到一个有趣的关键比较
不太礼貌,但让人觉得
免责声明
< C++ > FQA(这是对C++常见问题的一个关键反应)经常被C++社区认为是“愚蠢的笑话,甚至是不理解C++是或想成为什么”的人(来自FQA本身)。p>
这些论证常常被用来点燃(或逃避)C++信仰者之间的宗教斗争,或其他语言的信徒或语言无神论者,每个人都以自己的卑鄙的观点信奉为优于其他的东西。
我对这样的战斗不感兴趣,我只是喜欢激发关于正反论证的批判性推理。在这个SENS- <强>中,C++ FQA具有将FQA和FAQ都置于另一个< /强>的优点,允许立即比较。这也是我引用它的唯一原因
以下是Tyyd评论,下面是(坦克的我清楚我的意图需要澄清……),必须注意的是,OP不仅仅讨论了<>代码>代码和代码> /COD>(我只是在简短的评论中讨论它们),而是组成C和C++的I/O模型的整个函数集。p>
考虑到这个想法,也要考虑其他“命令式”语言(java、python、d…),你会发现它们比C++更符合C模型。有时甚至使其类型安全(C模型是什么
- RAII语义,这意味着,例如,