fgets函数
fgets從指定的文件中讀一行字符到調用者提供的緩沖區中,gets從標準輸入讀一行字符到調用者提供的緩沖區中。
#include <stdio.h>char *fgets(char *s, int size, FILE *stream); char *gets(char *s); 返回值:成功時s指向哪返回的指針就指向哪,出錯或者讀到文件末尾時返回NULLgets函數無需解釋,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'到標準輸出。
總結
- 上一篇: atoi()函数定义
- 下一篇: c++ 实例精通(1)