程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 文件輸入/輸出函數對比

文件輸入/輸出函數對比

編輯:關於C語言

【問題描述】常見下列幾組定義:fgets()/fputs(),gets()/puts(),getchar()/putchar(),fgetc()/fputc(),getc()/putc(),fscanf()/scanf()/sscanf(),它們之間有何區別?
【分析】
1 函數聲明
Glibc-2.3.6/Libio/stdio.h
fgets()/fputs()
[html]
1. extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream); 
2. extern int fputs (__const char *__restrict __s, FILE *__restrict __stream); 
 
gets()/puts()
[html]
1. extern char *gets (char *__s); 
2. extern int puts (__const char *__s); 
 
getchar()/putchar()
[html]
1. extern int getchar (void); 
2. extern int putchar (int __c); 

fgetc()/fputc()
[html]
1. extern int fgetc (FILE *__stream); 
2. extern int fputc (int __c, FILE *__stream); 
getc()/putc()
[html]
1. extern int getc (FILE *__stream); 
2. extern int putc (int __c, FILE *__stream); 

fscanf()/scanf()/sscanf()
[html]
1. extern int fscanf (FILE *__restrict __stream, 
2.      __const char *__restrict __format, ...); 
3.  
4. extern int scanf (__const char *__restrict __format, ...); 
5. /* Read formatted input from S.  */ 
6. extern int sscanf (__const char *__restrict __s, 
7.      __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原型 www.2cto.com
[html]
1. Glibc-2.3.6/libio/getc.c 
2. int 
3. _IO_getc (fp) 
4.      FILE *fp; 
5. { 
6.   int result; 
7.   CHECK_FILE (fp, EOF); 
8.   _IO_acquire_lock (fp); 
9.   result = _IO_getc_unlocked (fp); 
10.   _IO_release_lock (fp); 
11.   return result; 
12. } 

putc原型
[html]
1. Glibc-2.3.6/sysdeps/generic/printf_fphex.c 
2. # define putc(c, f) (wide \ 
3.              ? (int)_IO_putwc_unlocked (c, f) : _IO_putc_unlocked (c, f)) 
getchar原型
[html]
1. Glibc-2.3.6/libio/bits/stdio.h 
2. __STDIO_INLINE int 
3. getchar (void) 
4. { 
5.   return _IO_getc (stdin); 
6. } 

putchar原型
[html]
1. Glibc-2.3.6/libio/bits/stdio.h 
2.  
3. __STDIO_INLINE int 
4. putchar (int __c) 
5. { 
6.   return _IO_putc (__c, stdout); 
7. } 
 
(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是格式輸出,可將指定的流轉換成需要的格式。

 
摘自 tandesir的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved