From: http://blog.csdn.net/wuyu1125/article/details/7610652
fgets
從指定的文件中讀一行字符到調用者提供的緩衝區中,gets
從標準輸入讀一行字符到調用者提供的緩衝區中。
#include <stdio.h> char *fgets(char *s, int size, FILE *stream); char *gets(char *s); 返回值:成功時s指向哪返回的指針就指向哪,出錯或者讀到文件末尾時返回NULL
gets
函數無需解釋,Man Page的BUGS部分已經說得很清楚了:Never use gets()。gets
函數的存在只是爲了兼容以前的程序,我們寫的代碼都不應該調用這個函數。gets
函數的接口設計得很有問題,就像strcpy
一樣,用戶提供一個緩衝區,卻不能指定緩衝區的大小,很可能導致緩衝區溢出錯誤,這個函數比strcpy
更加危險,strcpy
的輸入和輸出都來自程序內部,只要程序員小心一點就可以避免出問題,而gets
讀取的輸入直接來自程序外部,用戶可能通過標準輸入提供任意長的字符串,程序員無法避免gets
函數導致的緩衝區溢出錯誤,所以唯一的辦法就是不要用它。
現在說說fgets
函數,參數s
是緩衝區的首地址,size
是緩衝區的長度,該函數從stream
所指的文件中讀取以'/n'
結尾的一行(包括'/n'
在內)存到緩衝區s
中,並且在該行末尾添加一個'/0'
組成完整的字符串。
如果文件中的一行太長,fgets
從文件中讀了size-1
個字符還沒有讀到'/n'
,就把已經讀到的size-1
個字符和一個'/0'
字符存入緩衝區,文件中剩下的半行可以在下次調用fgets
時繼續讀。
如果一次fgets
調用在讀入若干個字符後到達文件末尾,則將已讀到的字符串加上'/0'
存入緩衝區並返回,如果再次調用fgets
則返回NULL
,可以據此判斷是否讀到文件末尾。
注意,對於fgets
來說,'/n'
是一個特別的字符,而'/0'
並無任何特別之處,如果讀到'/0'
就當作普通字符讀入。如果文件中存在'/0'
字符(或者說0x00字節),調用fgets
之後就無法判斷緩衝區中的'/0'
究竟是從文件讀上來的字符還是由fgets
自動添加的結束符,所以fgets
只適合讀文本文件而不適合讀二進制文件,並且文本文件中的所有字符都應該是可見字符,不能有'/0'
。
fputs
向指定的文件寫入一個字符串,puts
向標準輸出寫入一個字符串。
#include <stdio.h> int fputs(const char *s, FILE *stream); int puts(const char *s); 返回值:成功返回一個非負整數,出錯返回EOF
緩衝區s
中保存的是以'/0'
結尾的字符串,fputs
將該字符串寫入文件stream
,但並不寫入結尾的'/0'
。與fgets
不同的是,fputs
並不關心的字符串中的'/n'
字符,字符串中可以有'/n'
也可以沒有'/n'
。puts
將字符串s
寫到標準輸出(不包括結尾的'/0'
),然後自動寫一個'/n'
到標準輸出。