在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兼容的文件操作吗?
哪个更广泛使用,为什么?
除了这些我还应该注意什么?
解决方法
> RAII语义,意味着例如fstreams在离开范围时关闭他们管理的文件
>模式在发生错误时抛出异常的能力,这可以使代码更清晰地集中在典型/成功的处理上(参见@L_404_0@的API函数和示例)
>类型安全性,使用所涉及的变量类型隐式选择如何执行输入和输出
> C风格的I / O有可能发生崩溃:例如int my_int = 32; printf(“%s”,my_int);,其中%s告诉printf期望一个指向ASCIIZ字符缓冲区的指针,但是会出现my_int;首先,参数传递约定可能意味着int不同地传递给const char * s,其次sizeof int可能不等于sizeof const char *,最后,即使printf提取32作为const char *最多只会打印随机垃圾从内存地址32开始,直到碰巧碰到一个NUL字符 – 该进程更有可能缺少读取某些内存的权限,程序将崩溃.现代C编译器有时可以根据提供的参数验证格式字符串,从而降低这种风险.
>用户定义类型的可扩展性(即您可以教流如何处理自己的类)
>支持根据实际输入动态调整接收字符串的大小,而C函数往往需要硬编码的最大缓冲区大小和用户代码中的循环来组合任意大小的输入
流有时也被批评为:
>格式化的详细程度,特别是“io操纵器”设置宽度,精度,基数,填充,与printf样式格式字符串相比
>有时令人困惑的混合操纵器,它们将设置保留在多个I / O操作中,而其他操作符则在每次操作后重置
>缺少RAII推送/保存的便利等级以及稍后弹出/恢复操纵器状态
>缓慢,正如Ben Voigt的评论和文件here