一、注意缓冲类型:全缓冲、行缓冲和不带缓冲。
1.标准出错流stderr通常是不带缓冲的。
2.涉及终端设备的流,比如stdin,一般是行缓冲的。
3.其它情况都是全缓冲。
可以更改缓冲类型,通过setbuf和setvbuf函数。
可以通过fflush冲洗输出流缓冲区,即将缓冲区内容写入文件中。
fflush参数传递NULL时,表示将冲洗所有输出流。
程序正常结束的时候,会冲洗缓冲区的输出数据,丢弃缓冲区的输入数据,并关闭所有打开的标准I/O流。
二、标准I/O函数采取了最优读写性能时的buf大小BUFSIZE,UNIX中一般定义为stat结构成员中st_blksize所指定的值。
三、读、写流函数分三类:每次一个字符、每次一行、直接I/O。
分别为:
1.getc, fgetc, getchar; putc, fputc, putchar
2.gets, fgets; puts, fputs
3.fread; fwrite;
注意:
getchar、getc、fgetc返回值都是int型的(目的是将出错返回也包括进来)。
putc、fputc、putchar返回值也是int型。
gets不对要写入的缓冲区进行检测,需要程序员确保写入内容不会超过缓冲区大小。如char str[2]; gets(str);当输入hello,即产生缓冲区溢出问题。
[canlynet@dc ~]$ cat test.c #include <stdio.h> int main(void) { char str[2]; char buf[2]; gets(str); puts(str); puts(buf); return 0; } [canlynet@dc ~]$ gcc -o test test.c /tmp/ccSY7eFA.o: In function `main': test.c:(.text+0x11): warning: the `gets' function is dangerous and should not be used. [canlynet@dc ~]$ ./test hello hello ��hello [canlynet@dc ~]$
gets并不将换行符存入缓冲区中,fgets却会。
puts会添加一个换行符,fputs不会。
标准I/O函数读取文件时,无论出错还是达到文件尾,都返回负值-1(宏定义为EOF),但是流的FILE对象中维持了两个标志用于区分,采用函数ferror和feof可以检测到底是出错了还是达到文件末尾了。