文件输入/输出函数对比

【问题描述】常见下列几组定义:fgets()/fputs(),gets()/puts(),getchar()/putchar(),fgetc()/fputc(),getc()/putc(),fscanf()/scanf()/sscanf(),它们之间有何区别?

【分析】

1 函数声明

Glibc-2.3.6/Libio/stdio.h

fgets()/fputs()

extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream); extern int fputs (__const char *__restrict __s, FILE *__restrict __stream);

 

gets()/puts()

extern char *gets (char *__s); extern int puts (__const char *__s);

 

getchar()/putchar()

extern int getchar (void); extern int putchar (int __c);


fgetc()/fputc()

extern int fgetc (FILE *__stream); extern int fputc (int __c, FILE *__stream);

getc()/putc()

extern int getc (FILE *__stream); extern int putc (int __c, FILE *__stream);


fscanf()/scanf()/sscanf()

extern int fscanf (FILE *__restrict __stream, __const char *__restrict __format, ...); extern int scanf (__const char *__restrict __format, ...); /* Read formatted input from S. */ extern int sscanf (__const char *__restrict __s, __const char *__restrict __format, ...) __THROW;


2 重要区别

(1) fgets()/gets()

从声明可以看出,fgets()参数中,有输入长度限制,而gets()中没有。因此fgets()可以防止存储溢出,所以对于严格的编程而言,使用fgets是一个更好的选择。fgets()和fputs()须要配对使用。因为fgets()读入时,会将换行符读入字符串,而gets()不会。在输出时,puts()追加一个换行符,而fputs()不会追加。如果使用fgets()输入,使用puts()输出,那么输入一个换行符,输出就会有两个换行符。

(2) 函数还是宏定义

fgetc()和fputc()都是真正的函数,而getc、putc、getchar、putchar都是通过#define指令定义的宏。宏在预处理阶段被插入代码中,执行效率稍高一些。而函数在程序的长度方面更胜一筹。

getc原型

Glibc-2.3.6/libio/getc.c int _IO_getc (fp) FILE *fp; { int result; CHECK_FILE (fp, EOF); _IO_acquire_lock (fp); result = _IO_getc_unlocked (fp); _IO_release_lock (fp); return result; }


putc原型

Glibc-2.3.6/sysdeps/generic/printf_fphex.c # define putc(c, f) (wide \ ? (int)_IO_putwc_unlocked (c, f) : _IO_putc_unlocked (c, f))

getchar原型

Glibc-2.3.6/libio/bits/stdio.h __STDIO_INLINE int getchar (void) {   return _IO_getc (stdin); }


putchar原型

Glibc-2.3.6/libio/bits/stdio.h __STDIO_INLINE int putchar (int __c) { return _IO_putc (__c, stdout); }

 

(3) getchar()/fgets()用法区别

getchar()一次只能输入一个字符,利用putchar()输出getchar()返回值。注意返回值为int不是char,之所以如此,是为了返回时,能更有效的接收字符,因为char只能表示8位无符号数,超过8位的字符就不能表示了。而int则可以接收8为无符号数不能表示的数。fgets和gets可以一次输入多个字符,分别利用fputs和puts输出。

(4) scanf/fscanf/sscanf

scanf和printf的区别详见:scanf与printf转换说明符区别

sscanf的示例详见:cgi如何提取表单post的特殊子串

scanf从标准输入读取数据;fscanf的输入源是作为参数给出的流;sscanf是格式输出,可将指定的流转换成需要的格式。

 

转载于:https://www.cnblogs.com/J2EEPLUS/archive/2012/04/17/2487948.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值