微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C vs C文件处理

我一直在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兼容的文件操作吗?
哪个更广泛使用,为什么?
除了这些我还应该注意什么?

解决方法

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

> RAII语义,意味着例如fstreams在离开范围时关闭他们管理的文件
>模式在发生错误时抛出异常的能力,这可以使代码更清晰地集中在典型/成功的处理上(参见http://en.cppreference.com/w/cpp/io/basic_ios/exceptions的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

原文地址:https://www.jb51.cc/c/115820.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐