一旦打开了流,则可在三种不同类型的非格式化I/O中进行选择,对其进行读、写操作:
- 每次一个字符的I/O。一次读或写一个字符,如果流是带缓冲的,则标准I/O函数会处理所有缓冲。
- 每次一行的I/O.
- 直接I/O。直接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(stdio)。前两个函数的区别是getc可被实现为宏,而fgetc则不能实现为宏。这意味着:
getc的参数不应当是具有副作用的表达式。
因为fgetc一定是一个函数,所以可以得到其地址。这就允许将fgetc的地址作为一个参数传送给另一个函数。
调用fgetc所需时间很可能长于调用getc,因为调用函数通常所需的时间长于调用宏。
注意,不管是出错还是到达文件尾端,这三个函数都会返回同样的值。为了区分这两种不同的情况,必须调用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调用会清除该流的文件结束标志。
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, stdout),putc可实现为宏,而fputc则不能实现为宏。