标准I/O库之读和写流
一旦打开了流,则可在三种不同类型的非格式化I/O中进行选择,对其进行读、写操作:
(1)每次一个字符的I/O。一次读或写一个字符,如果流是带缓冲的,则标准I/O会处理所有缓冲。
(2)每次一行的I/O。如果想要一次读或写一行,则使用fgets和fputs。每行都以一个换行符终止。当调用fgets时,应说明能处理的最大行长。
(3)直接I/O。fread和fwrite函数支持这种类型的I/O。每次I/O操作读或写某种数量的对象,而每个对象具有指定的长度。这两个函数常用于从二进制文件中每次读或写一个结构。
直接I/O(direct I/O)这个术语来自ISO C标准,有时也被称为二进制I/O、一次一个对象I/O、面向记录的I/O或面向结构的I/O。
1、输入函数
以下三个函数可用于一次读一个字符。
#include <stdio.h>
int getc( FILE *fp );
int fgetc( FILE *fp );
int getchar( void );
三个函数的返回值:若成功则返回下一个字符,若已到达文件结尾或出错则返回EOF
函数getchar等价于getc(stdin)。前两个函数的区别是getc可被实现为宏,而fgetc则不能实现为宏。这意味着:
(1)getc的参数不应当是具有副作用的表达式。
(2)因为fgetc一定是一个函数,所以可以得到其地址。这就允许将fgetc的地址作为一个参数传送给另一个函数。
(3)调用fgetc所需时间很可能长于调用getc,因为调用函数通常所需的时间长于调用宏。
这三个函数在返回下一个字符时,会将其unsigned char类型转换为int类型。说明为不带符号的理由是,如果最高位为1也不会使返回值为负。要求整型返回值的理由是,这样就可以返回所有可能的字符再加上一个已出错或已到达文件尾端的指示值。在<stdio.h>中的常量EOF被要求是一个负值,其值经常是-1。这就意味着不能将这三个函数的返回值存放在一个字符变量中,以后还要将这些函数的返回值与常量EOF相比较。
注意,不管是出错还是到达文件尾端,这三个函数都返回同样的值。为了区分这两种不同的情况,必须调用ferror或feof。
#include <stdio.h>
int ferror( FILE *fp );
int feof( FILE *fp );
两个函数返回值:若条件为真则返回非0值(真),否则返回0(假) void clearerr( FILE *fp );
在大多数实现中,为每个流在FILE对象中维持了两个标志:
- 出错标志。
- 文件结束标志。
调用clearerr则清除这两个标志。
从流中读取数据以后,可以调用ungetc将字符再压送回流中。
#include <stdio.h>
int ungetc( int c, FILE *fp );
返回值:若成功则返回c,若出错则返回EOF
压送回流中的字符以后又可从流中读出,但读出的字符的顺序与压送回的顺序相反。应当了解,虽然ISO C允许实现支持任意次数的回送,但是它要求实现提供一次只送回一个字符。我们不能期望一次能送回多个字符。
回送的字符不必一定是上一次读到的字符。不能回送EOF,但是当已经达到文件尾端时,仍可以回送一个字符,下次读将返回该字符,再次读则返回EOF。之所以能这样做的原因是一次成功的ungetc调用会清除该流的文件结束标志。???(这原因解释的,越解释越糊涂)
当正在读一个输入流,并进行某种形式的分字或分记号操作时,会经常用到回送字符操作。有时需要先看一看下一个字符,以决定如何处理当前字符。然后就需要方便地将刚查看的字符送回,以便下一次调用getc时返回该字符。如果标准I/O库不提供回送能力,就需要将该字符存放到一个我们自己的变量中,并设置一个标志以便判别在下一次需要一个字符时是调用getc,还是从我们自己的变量中取用。
用ungetc压送回字符时,并没有将它们写到文件中或设备上,只是将它们写回标准I/O库的流缓冲区中。
2、输出函数
对应于上面所述的每个输入函数都有一个输出函数。
#include <stdio.h>
int putc( int c, FILE *fp );
int fputc( int c, FILE *fp );
int putchar( int c );
三个函数返回值:若成功则返回c,若出错则返回EOF
与输入函数一样,putchar(c)等效于putc(c,staout),putc可实现为宏,而fputc则不能实现为宏。
本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/。
标准I/O库之读和写流的更多相关文章
- 标准I/O库之打开和关闭流
下列三个函数打开一个标准I/O流. #include <stdio.h> FILE *fopen( const char *restrict pathname, const char *r ...
- UNIX环境高级编程——标准I/O库
对一个进程预定义了三个流,并且这三个流可以自动的被进程使用,它们是:标准输入.标准输出.和标准错误. 标准I/O库提供缓冲的目的是尽可能减少使用read和write的次数. 标准I/O库提供了三种类型 ...
- UNIX环境高级编程 第5章 标准I/O库
本章是关于C语言标准I/O库的,之所以在UNIX类系统的编程中会介绍C语言标准库,主要是因为UNIX和C之间具有密不可分的关系.由于UNIX系统存在很多实现,而每个实现都有自己的标准I/O库,为了统一 ...
- APUE(5)---标准I/O库 (2)
六.读和写流 一旦打开了流,则可在3种不同类型的非格式化I/O中进行选择,对其进行读.写操作:1)每次一个字符的I/O,一次读或写一个字符,如果刘时代缓冲的,则标准I/O函数处理所有缓冲:2)每次一行 ...
- 第五章:标准I/O库
本章用于解析C语言标准I/O库,之所以在UNIX类系统的编程中会介绍C语言标准库,主要是因为UNIX和C之间具有密不可分的关系. 标准I/O库相比于操作系统的I/O库,具有更高的效率和可移植性,前者是 ...
- 《UNIX环境高级编程》(APUE) 笔记第五章 - 标准I/O库
5 - 标准I/O库 Github 地址 1. 标准 I/O 库作用 缓冲区分配 以优化的块长度执行 I/O 等 使用户不必担心如何选择使用正确的块长度 标准 I/O 最终都要调用第三章中的 I/O ...
- Linux C 文件操作,系统调用 -- open()、read() 和 标准I/O库 -- fopen()、fread()
函数汇总: open().write().read().close() fopen().fwrite().fread().fclose() 一.什么是文件 在讲述文件操作之前,我们首先要知道什么是文件 ...
- boost.ASIO-可能是下一代C++标准的网络库
曾几何时,Boost中有一个Socket库,但后来没有了下文,C++社区一直在翘首盼望一个标准网络库的出现,网络上开源的网络库也有不少,例如Apache Portable Runtime就是比较著名的 ...
- 标准I/O库之缓冲
标准I/O库提供缓冲的目的是尽可能减少使用read和write调用的次数.它也对每个I/O流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的麻烦. 标准I/O提供了三种类型的缓冲: (1) ...
随机推荐
- Altium Designer学习:PCB只看当前层
1 Shift+S 这个快捷键能高亮当前层,并且使其他层变成灰色,见下图: 2 隐藏指定层 在图中右下角的地方,右键,会弹出一个选项条,选择Hide Layers,可以选 ...
- Macbook配置adb环境
配置adb命令 http://stackoverflow.com/questions/5526470/trying-to-add-adb-to-path-variable-osx http://sta ...
- Java-Swing嵌入浏览器(一)
今天要说的额是浏览器的第一个版本是用DJnative-swt和swt包开发的调用本地浏览器和webkit浏览器的示例 这是我的工程目录[源码见最后]: src下为写的源码,lib为引入的swt和DJn ...
- 坑爹的UICollectionView
最近用UICoolectionView的时候遇到一个很DT的问题,我往VC里加12个视图,结果显示成这样(右边是期待的样子): 研究了一下午,终于发现了问题: @interface FpL ...
- platform_driver与file_operations两种方法开发led驱动
下面是两个LED灯的驱动程序 一个用platform_driver 另一个用file_operations #include <linux/kernel.h> #include <l ...
- Android 常用UI控件之Tab控件的实现方案
实现Tab的方式有多种 1,ActionBar有两种模式可以实现,但是已经过期 tab模式tab在顶部,分裂模式tab在底部(同时所有action item都在底部). 2,PagerTitleStr ...
- Android 完全退出程序,以及再按一次返回键退出程序
再按一次返回键退出最终完整方案: boolean isExit; @Override protected void onCreate(Bundle savedInstanceState) { ...
- Sublime Text主题下载、安装与配置
从下面地址下载主题包,以下载第一个为例,解压缩并重命名为Theme – Flatland 备注:下载好的文件中 .sublime-theme后缀的表示界面主题(theme),.tmTheme表示颜色 ...
- bzoj1965
很明显,求方程x*2^m=L (mod n+1)的解(1<=x<=n) var n,m,l,x,y,p:int64; function quick(x:int64):int64; var ...
- ☀【组件】加载 load
Bear / js / utils / load.js 动态修改script标签中的src属性存在的问题 javascript创建css.js,onload触发callback兼容主流浏览器的实现 各 ...