学习标准IO需要注意的几个问题

一、注意缓冲类型:全缓冲、行缓冲和不带缓冲。

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可以检测到底是出错了还是达到文件末尾了。

你可能感兴趣的:(数据结构,C++,c,C#,gcc)