fgets函數 和 fputs

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'到標準輸出。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章