各种I/O函数的选用准则

作者 : 开心源码 本文共1041个字,预计阅读时间需要3分钟 发布时间: 2022-05-13 共183人阅读

应用程序可以通过诸如open、close、lseek、read、write和stat这样的函数来访问文件或者I/O设施。更高级别的还有标准I/O及RIO( CS:AP网站参考代码 ,为了修补read等系统IO函数的不足而撰写的健壮的包装函数,它们自动解决不足值,为读文本行提供一种高效的带缓冲的方法。)

image
在实际编程中如何选用这些函数呢?下面提供少量基本准则:

  • 只需又可能就使用标准I/O。特别是对磁盘和终端设施来说,标准函数是首选方法。
  • 不要使用scanf或者rio_readlineb来读二进制文件。它们是设计用来读取文本文件的。由于二进制文件中的0xa正好是文本文件中的换行符(代表行终止),而在二进制文件中这又非它的本意。
  • 对网络套接字的I/O使用RIO函数。为毛不用标准IO呢?由于标准I/O函数的使用有两个限制。

    1.跟在输出函数之后的输入函数的限制。在它们之间之间假如没有fflush、fseek、fsetpos、rewind的调用,一个输入函数是不能跟在一个输出函数之后的。

    1. 跟在输入函数之后的输出函数的限制。在它们之间之间假如没有fseek、fsetpos、rewind的调用,一个输入函数是不能跟在一个输出函数之后的,除非该输入函数遇到了一个文件结束。

这些限制给网络应用带来了问题,由于在对套接字使用lseek是非法的。假如说第一个限制我们可以在每个输入函数之前插入刷新缓冲区的函数来避免,而第二个限制的满足要求对同一个打开的套接字形容符打开两个流,一个用来写,一个用来读:

FILE *fpin,*fpout;fpin = fdopen(sockfd, "r");fpout = fdopen(sockfd, "w");

但是,这样要求应用程序在结束时需要在两个流上调用 fclose函数:

fclose(fpin);fclose(fpout);

以上两条语句都试图关闭同一个底层的套接字形容符,所以第二条语句一定会失败。对顺序执行的程序一般问题不大,但对线程化的程序来说,关闭一个已经关闭的形容符是会导致灾难性后果的。
因而,建议在网络套接字上不适应用标准IO函数,而要使用健壮的RIO函数。

  • 假如你需要格式化输出,使用sprintf函数在内存中格式化一个字符串,而后用rio_writen把它发送出去;
  • 假如你需要格式化输入,使用rio_readlineb函数来读一个完整的文本行,而后用sscanf从文本行提取不同的字段。

获取更多知识,请点击关注:
嵌入式Linux&ARM
CSDN博客
简书博客


说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 各种I/O函数的选用准则

发表回复