用gets()函數(shù);gets從標(biāo)準(zhǔn)輸入設(shè)備讀字符串函數(shù),其可以無限讀取,不會(huì)判斷上限,以回車結(jié)束讀取,所以程序員應(yīng)該確保buffer的空間足夠大,以便在執(zhí)行讀操作時(shí)不發(fā)生溢出。
10年積累的成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有山東免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
功能
從stdin流中讀取字符串,直至接受到換行符或EOF時(shí)停止,并將讀取的結(jié)果存放在buffer指針?biāo)赶虻淖址麛?shù)組中。換行符不作為讀取串的內(nèi)容,讀取的換行符被轉(zhuǎn)換為‘\0’空字符,并由此來結(jié)束字符串。
返回值
讀入成功,返回與參數(shù)buffer相同的指針;讀入過程中遇到EOF(End-of-File)或發(fā)生錯(cuò)誤,返回NULL指針。所以在遇到返回值為NULL的情況,要用ferror或feof函數(shù)檢查是發(fā)生錯(cuò)誤還是遇到EOF。
擴(kuò)展資料:
gets()函數(shù)用法:
示例
1、C:
#include stdio.h? ? //這個(gè)頭文件包含gets()函數(shù),這個(gè)函數(shù)在ISO/IEC 9899 2011(C11)標(biāo)準(zhǔn)中被移除
int main(void)
{
char str1;? //不要char*p,然后gets(p),這是錯(cuò)誤的,因?yàn)閜沒有指向有效的內(nèi)存,它可能指向任何非法地址//地方的未知大小的內(nèi)存塊,這樣以來,就可能修改了不屬于本程序的內(nèi)存的內(nèi)容
gets(str1);
printf("%s\n", str1);
return 0;
}
#include stdio.h//gets_s()用法
#define CH 20
int main(void)
{
char ch[CH];
printf("請輸入你的名字:\n");
gets_s(ch,CH);? ? ? ? ? ? ?//這里不能用gets_s(ch);
printf("這是你的名字:%s\n", ch);
return 0;
}
2、C++:
#include iostream
#include cstdio
using namespace std;
int main()
{
char str[100];
gets(str);
coutstrendl;
return 0;
}
gets()函數(shù)用來從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)讀取字符串直到換行符結(jié)束,但換行符會(huì)被丟棄,然后在末尾添加'\0'字符。其調(diào)用格式為:
gets(s);其中s為字符串變量(字符串?dāng)?shù)組名或字符串指針)。
gets(s)函數(shù)與scanf("%s",s)相似,但不完全相同,使用scanf("%s",s) 函數(shù)輸入字符串時(shí)存在一個(gè)問題,就是如果輸入了空格會(huì)認(rèn)為字符串結(jié)束,空格后的字符將作為下一個(gè)輸入項(xiàng)處理,但gets()函數(shù)將接收輸入的整個(gè)字符串直到遇到換行為止。
也就是說:gets()函數(shù)讀取到\n(我們輸入的回車)于是停止讀取,但是它不會(huì)把\n包含到字符串里面去。然而,和它配合使用的puts函數(shù),卻在輸出字符串的時(shí)候自動(dòng)換行。
以文件流的形式打開文件之后有多種方法可以讀取文件,這里列舉常用的幾種:
(1)?size_t?fread?(?void???*buffer,??size_t?size,??size_t?count,??FILE?*stream)?;
功?能:從一個(gè)文件流中讀數(shù)據(jù),最多讀取count個(gè)元素,每個(gè)元素size字節(jié),如果調(diào)用成功返回實(shí)際讀取到的元素個(gè)數(shù),如果不成功返回?0。
參?數(shù):
buffer:用于接收數(shù)據(jù)的內(nèi)存地址,大小至少是size*count字節(jié).
size:單個(gè)元素的大小,單位是字節(jié)
count:元素的個(gè)數(shù),每個(gè)元素是size字節(jié).
stream:輸入流(即打開文件返回的句柄)
返回值:實(shí)際讀取的元素個(gè)數(shù).如果返回值與count不相同,則可能文件結(jié)尾或發(fā)生錯(cuò)誤.
從ferror和feof獲取錯(cuò)誤信息或檢測是否到達(dá)文件結(jié)尾.
(2)?char?*fgets(char?*buf,?int?bufsize,?FILE?*stream);
功能:?從文件結(jié)構(gòu)體指針stream中讀取數(shù)據(jù),每次讀取一行。讀取的數(shù)據(jù)保存在buf指向的字符數(shù)組中,每次最多讀取bufsize-1個(gè)字符(第bufsize個(gè)字符賦'\0'),如果文件中的該行,不足bufsize個(gè)字符,則讀完該行就結(jié)束。函數(shù)成功將返回buf,失敗或讀到文件結(jié)尾返回NULL。因此我們不能直接通過fgets的返回值來判斷函數(shù)是否是出錯(cuò)而終止的,應(yīng)該借助feof函數(shù)或者ferror函數(shù)來判斷。
參數(shù):
buf:?字符型指針,指向用來存儲(chǔ)所得數(shù)據(jù)的地址。
bufsize:?整型數(shù)據(jù),指明buf指向的字符數(shù)組的大小。
stream:?文件結(jié)構(gòu)體指針,將要讀取的文件流(即打開文件返回的句柄)
(3)?int?fgetc(FILE?*stream);
功能:意為從文件指針stream指向的文件中讀取一個(gè)字符,讀取一個(gè)字節(jié)后,光標(biāo)位置后移一個(gè)字節(jié)。
參數(shù):
stream:輸入文件流(即打開文件返回的句柄)
返回值:是返回所讀取的一個(gè)字節(jié)。如果讀到文件末尾或者讀取出錯(cuò)時(shí)返回EOF。
對于文本文件要逐行處理的可以優(yōu)先考慮fgets();
若要逐個(gè)字符處理的可以優(yōu)先考慮fgetc();
若對二進(jìn)制文件或者整塊數(shù)據(jù)進(jìn)行處理的優(yōu)先考慮fread();
以文件流的形式打開文件之后有多種方法可以讀取文件,這里列舉常用的幾種:(1) size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;功 能:從一個(gè)文件流中讀數(shù)據(jù),最多讀取count個(gè)元素,每個(gè)元素size字節(jié),如果調(diào)用成功返回實(shí)際讀取到的元素個(gè)數(shù),如果不成功返回 0。參 數(shù):buffer:用于接收數(shù)據(jù)的內(nèi)存地址,大小至少是size*count字節(jié).size:單個(gè)元素的大小,單位是字節(jié)count:元素的個(gè)數(shù),每個(gè)元素是size字節(jié).stream:輸入流(即打開文件返回的句柄)返回值:實(shí)際讀取的元素個(gè)數(shù).如果返回值與count不相同,則可能文件結(jié)尾或發(fā)生錯(cuò)誤.從ferror和feof獲取錯(cuò)誤信息或檢測是否到達(dá)文件結(jié)尾.(2) char *fgets(char *buf, int bufsize, FILE *stream);功能: 從文件結(jié)構(gòu)體指針stream中讀取數(shù)據(jù),每次讀取一行。讀取的數(shù)據(jù)保存在buf指向的字符數(shù)組中,每次最多讀取bufsize-1個(gè)字符(第bufsize個(gè)字符賦'\0'),如果文件中的該行,不足bufsize個(gè)字符,則讀完該行就結(jié)束。函數(shù)成功將返回buf,失敗或讀到文件結(jié)尾返回NULL。因此我們不能直接通過fgets的返回值來判斷函數(shù)是否是出錯(cuò)而終止的,應(yīng)該借助feof函數(shù)或者ferror函數(shù)來判斷。參數(shù):buf: 字符型指針,指向用來存儲(chǔ)所得數(shù)據(jù)的地址。bufsize: 整型數(shù)據(jù),指明buf指向的字符數(shù)組的大小。stream: 文件結(jié)構(gòu)體指針,將要讀取的文件流(即打開文件返回的句柄)(3) int fgetc(FILE *stream);功能:意為從文件指針stream指向的文件中讀取一個(gè)字符,讀取一個(gè)字節(jié)后,光標(biāo)位置后移一個(gè)字節(jié)。參數(shù):stream:輸入文件流(即打開文件返回的句柄)返回值:是返回所讀取的一個(gè)字節(jié)。如果讀到文件末尾或者讀取出錯(cuò)時(shí)返回EOF。對于文本文件要逐行處理的可以優(yōu)先考慮fgets();若要逐個(gè)字符處理的可以優(yōu)先考慮fgetc();若對二進(jìn)制文件或者整塊數(shù)據(jù)進(jìn)行處理的優(yōu)先考慮fread();
C語言中:fread是一個(gè)函數(shù)。從一個(gè)文件流中讀數(shù)據(jù),最多讀取count個(gè)元素,每個(gè)元素size字節(jié),如果調(diào)用成功返回實(shí)際讀取到的元素個(gè)數(shù),如果不成功或讀到文件末尾返回 0。下面我們來看看c語言fread函數(shù)的用法。
fread()函數(shù)---- Reads data from a stream.
#includestdio.h
size_t fread( void *buffer, size_t size, size_t count,FILE *stream );
從一個(gè)文件流中讀數(shù)據(jù),讀取count個(gè)元素,每個(gè)元素size字節(jié).如果調(diào)用成功返回count.如果調(diào)用成功則實(shí)際讀取size*count字節(jié)
buffer的大小至少是 size*count 字節(jié).
return:
fread returns the number of full items actually read
實(shí)際讀取的元素?cái)?shù).如果返回值與count(不是count*size)不相同,則可能文件結(jié)尾或發(fā)生錯(cuò)誤.
從ferror和feof獲取錯(cuò)誤信息或檢測是否到達(dá)文件結(jié)尾.
DEMO:
[cpp] view plain#include stdio.h
#include process.h
#include string.h
int main()
{
FILE *stream;
char msg[]="this is a test";
char buf[20];
if ((stream=fopen("dummy.fil","w+"))==NULL)
{
fprintf(stderr,"cannot open output file.\n");
return 1;
}
/*write some data to the file*/
fwrite(msg,1,strlen(msg)+1,stream);
/*seek to the beginning of the file*/
fseek(stream,0,SEEK_SET);
/*read the data and display it*/
fread(buf,1,strlen(msg)+1,stream);
printf("%s\n",buf);
fclose(stream);
system("pause");
return 0;
}
DEMO2
[cpp] view plainint main(void)
{
FILE *stream;
char list[30];
int i,numread,numwritten;
/*open file in text mode:*/
if ((stream=fopen("fread.out","w+t"))!=NULL)
{
for (i=0;i25;i++)
{
list[i]=(char)('z'-i);
}
/*write 25 characters to stram*/
numwritten=fwrite(list,sizeof(char),25,stream);
printf("Wrote %d items\n",numwritten);
fclose(stream);
}
else
printf("Problem opening the file\n");
if ((stream=fopen("fread.out","r+t"))!=NULL)
{
numread=fread(list,sizeof(char),25,stream);
printf("Number of items read =%d\n",numread);
printf("Contents of buffer=%.25s\n",list);
fclose(stream);
}
else
{
printf("File could not be opened\n");
}
system("pause");
return 0;
}
1 int fclose(FILE *stream)
關(guān)閉流 stream。刷新所有的緩沖區(qū)。
2 void clearerr(FILE *stream)
清除給定流 stream 的文件結(jié)束和錯(cuò)誤標(biāo)識(shí)符。
3 int feof(FILE *stream)
測試給定流 stream 的文件結(jié)束標(biāo)識(shí)符。
4 int ferror(FILE *stream)
測試給定流 stream 的錯(cuò)誤標(biāo)識(shí)符。
5 int fflush(FILE *stream)
刷新流 stream 的輸出緩沖區(qū)。
6 int fgetpos(FILE *stream, fpos_t *pos)
獲取流 stream 的當(dāng)前文件位置,并把它寫入到 pos。
7 FILE *fopen(const char *filename, const char *mode)
使用給定的模式 mode 打開 filename 所指向的文件。
8 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
從給定流 stream 讀取數(shù)據(jù)到 ptr 所指向的數(shù)組中。
9 FILE *freopen(const char *filename, const char *mode, FILE *stream)
把一個(gè)新的文件名 filename 與給定的打開的流 stream 關(guān)聯(lián),同時(shí)關(guān)閉流中的舊文件。
10 int fseek(FILE *stream, long int offset, int whence)
設(shè)置流 stream 的文件位置為給定的偏移 offset,參數(shù) offset 意味著從給定的 whence 位置查找的字節(jié)數(shù)。
11 int fsetpos(FILE *stream, const fpos_t *pos)
設(shè)置給定流 stream 的文件位置為給定的位置。參數(shù) pos 是由函數(shù) fgetpos 給定的位置。
12 long int ftell(FILE *stream)
返回給定流 stream 的當(dāng)前文件位置。
13 size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
把 ptr 所指向的數(shù)組中的數(shù)據(jù)寫入到給定流 stream 中。
14 int remove(const char *filename)
刪除給定的文件名 filename,以便它不再被訪問。
15 int rename(const char *old_filename, const char *new_filename)
把 old_filename 所指向的文件名改為 new_filename。
16 void rewind(FILE *stream)
設(shè)置文件位置為給定流 stream 的文件的開頭。
17 void setbuf(FILE *stream, char *buffer)
定義流 stream 應(yīng)如何緩沖。
18 int setvbuf(FILE *stream, char *buffer, int mode, size_t size)
另一個(gè)定義流 stream 應(yīng)如何緩沖的函數(shù)。
19 FILE *tmpfile(void)
以二進(jìn)制更新模式(wb+)創(chuàng)建臨時(shí)文件。
20 char *tmpnam(char *str)
生成并返回一個(gè)有效的臨時(shí)文件名,該文件名之前是不存在的。
21 int fprintf(FILE *stream, const char *format, ...)
發(fā)送格式化輸出到流 stream 中。
22 int printf(const char *format, ...)
發(fā)送格式化輸出到標(biāo)準(zhǔn)輸出 stdout。
23 int sprintf(char *str, const char *format, ...)
發(fā)送格式化輸出到字符串。
24 int vfprintf(FILE *stream, const char *format, va_list arg)
使用參數(shù)列表發(fā)送格式化輸出到流 stream 中。
25 int vprintf(const char *format, va_list arg)
使用參數(shù)列表發(fā)送格式化輸出到標(biāo)準(zhǔn)輸出 stdout。
26 int vsprintf(char *str, const char *format, va_list arg)
使用參數(shù)列表發(fā)送格式化輸出到字符串。
27 int fscanf(FILE *stream, const char *format, ...)
從流 stream 讀取格式化輸入。
28 int scanf(const char *format, ...)
從標(biāo)準(zhǔn)輸入 stdin 讀取格式化輸入。
29 int sscanf(const char *str, const char *format, ...)
從字符串讀取格式化輸入。
30 int fgetc(FILE *stream)
從指定的流 stream 獲取下一個(gè)字符(一個(gè)無符號(hào)字符),并把位置標(biāo)識(shí)符往前移動(dòng)。
31 char *fgets(char *str, int n, FILE *stream)
從指定的流 stream 讀取一行,并把它存儲(chǔ)在 str 所指向的字符串內(nèi)。當(dāng)讀取 (n-1) 個(gè)字符時(shí),或者讀取到換行符時(shí),或者到達(dá)文件末尾時(shí),它會(huì)停止,具體視情況而定。
32 int fputc(int char, FILE *stream)
把參數(shù) char 指定的字符(一個(gè)無符號(hào)字符)寫入到指定的流 stream 中,并把位置標(biāo)識(shí)符往前移動(dòng)。
33 int fputs(const char *str, FILE *stream)
把字符串寫入到指定的流 stream 中,但不包括空字符。
34 int getc(FILE *stream)
從指定的流 stream 獲取下一個(gè)字符(一個(gè)無符號(hào)字符),并把位置標(biāo)識(shí)符往前移動(dòng)。
35 int getchar(void)
從標(biāo)準(zhǔn)輸入 stdin 獲取一個(gè)字符(一個(gè)無符號(hào)字符)。
36 char *gets(char *str)
從標(biāo)準(zhǔn)輸入 stdin 讀取一行,并把它存儲(chǔ)在 str 所指向的字符串中。當(dāng)讀取到換行符時(shí),或者到達(dá)文件末尾時(shí),它會(huì)停止,具體視情況而定。
37 int putc(int char, FILE *stream)
把參數(shù) char 指定的字符(一個(gè)無符號(hào)字符)寫入到指定的流 stream 中,并把位置標(biāo)識(shí)符往前移動(dòng)。
38 int putchar(int char)
把參數(shù) char 指定的字符(一個(gè)無符號(hào)字符)寫入到標(biāo)準(zhǔn)輸出 stdout 中。
39 int puts(const char *str)
把一個(gè)字符串寫入到標(biāo)準(zhǔn)輸出 stdout,直到空字符,但不包括空字符。換行符會(huì)被追加到輸出中。
40 int ungetc(int char, FILE *stream)
把字符 char(一個(gè)無符號(hào)字符)推入到指定的流 stream 中,以便它是下一個(gè)被讀取到的字符。
41 void perror(const char *str)
把一個(gè)描述性錯(cuò)誤消息輸出到標(biāo)準(zhǔn)錯(cuò)誤 stderr。首先輸出字符串 str,后跟一個(gè)冒號(hào),然后是一個(gè)空格。