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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值