文件输入/输出函数对比
【问题描述】常见下列几组定义:fgets()/fputs(),gets()/puts(),getchar()/putchar(),fgetc()/fputc(),getc()/putc(),fscanf()/scanf()/sscanf(),它们之间有何区别?
【分析】
1 函数声明
Glibc-2.3.6/Libio/stdio.h
fgets()/fputs()
gets()/puts()
getchar()/putchar()
fgetc()/fputc()
getc()/putc()
fscanf()/scanf()/sscanf()
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原型
putc原型
getchar原型
putchar原型
(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是格式输出,可将指定的流转换成需要的格式。