版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1第八章數(shù)據(jù)的磁盤存儲(chǔ)
C
語言程序設(shè)計(jì)案例教程12/23/20242C文件概述文件類型指針文件的打開與關(guān)閉文件的讀寫文件的定位出錯(cuò)的檢測(cè)12/23/20243
案例一文件讀寫函數(shù)的使用11.問題描述向文件寫入一字符串,把字符串中的大寫字母轉(zhuǎn)換為小寫字母,對(duì)轉(zhuǎn)換后的字符串按指定位置輸出。2.問題分析①使用文件讀、寫函數(shù),將鍵盤輸入的字符串寫入文件并輸出,再將文件中字符串讀出并進(jìn)行判斷,若是大寫字母,則轉(zhuǎn)換為小寫字母。②使用文件定位函數(shù)將文件指針重新定位,并輸出從新起始位置開始的字符串。12/23/202443.?C語言代碼#include<stdio.h>#include<stdlib.h>main(){FILE*fp; /*定義文件指針,F(xiàn)ILE要大寫*/charstr[30]; /*存儲(chǔ)從鍵盤輸入的字符串*/charfilename[30]; /*保存從鍵盤輸入的文件名*/charch;intflag;printf("pleaseinputfilename\n");scanf("%s",filename); /*輸入文件名:D:\\8.1\\exp1.txt*/if((fp=fopen(filename,"w"))==NULL) /*以寫文件方式打開文件,并判斷文件是否存在*/{printf("cannotopenfile\n");getchar();exit(0);}printf("pleaseinputstring\n");getchar();gets(str); /*從鍵盤輸出字符串*/fputs(str,fp); /*將字符串寫入文件exp1.txt中,但沒有將字符結(jié)束符'\0'寫入文件中,可在末尾加一個(gè)回車換行,保證文件正確讀出*/fclose(fp); /*關(guān)閉文件*/if((fp=fopen("D:\\8.1\\exp1.txt","r"))==NULL)/*讀文件方式再次打開文件,并判斷文件是否存在*/{printf("cannotopenfile\n");getchar();exit(0);}fgets(str,sizeof(str),fp); /*將字符串從文件中讀出*/printf("thestringis:%s",str);printf("\n");rewind(fp); /*將文件位置指針移動(dòng)到文件首*/printf("convertuppercasetolowercase:\n");ch=fgetc(fp); /*從文件中取出第一字符*/
while(ch!=EOF) /*如果字符不是文件結(jié)尾*/{{if(ch>='A'&&ch<='Z') /*判斷字符是否為英文字母大寫*/{ch=ch+32; /*轉(zhuǎn)換成小寫字母*/putchar(ch); /*將轉(zhuǎn)換的小寫字母輸出*/}elseputchar(ch); /*如果不是大寫字母,輸出原字符*/}ch=fgetc(fp); /*從文件中再讀出一個(gè)字符*/}rewind(fp); /*將文件位置指針移動(dòng)到文件首*/fseek(fp,3L,0); /*將文件指針向后移動(dòng)3個(gè)字節(jié),L要大寫以便文件大于64K
時(shí)文件不會(huì)出錯(cuò)*/flag=ferror(fp); /*檢測(cè)文件最近一次操作(讀、寫、定位等)是否發(fā)生錯(cuò)誤,此處 判斷文件指針移動(dòng)是否正確*/if(flag==0)printf("\nFileoperationiscorret.");else{printf("\nFileoperationisfailed.");clearerr(fp);}fgets(str,sizeof(str),fp); /*從文件指針新位置處讀出字符串*/printf("\ntheseekstringis:");puts(str); /*字符串輸出*/fclose(fp); /*關(guān)閉文件*/}12/23/202454.程序運(yùn)行結(jié)果pleaseinputfilenameD:\\8.1\\exp1.txtpleaseinputstringdgfr%^&234RLQthestringis:dgfr%^&234RLQconvertuppercasetolowercase:dgfr%^&234rlqFileoperationiscorret.theseekstringis:r%^&234RLQ12/23/202468.1文件概述
程序開發(fā)中都會(huì)用到數(shù)據(jù)。在之前的程序設(shè)計(jì)中數(shù)據(jù)與處理在內(nèi)存中,沒有存到磁盤文件中。程序運(yùn)行結(jié)束,數(shù)據(jù)也隨之消失。當(dāng)再次使用數(shù)據(jù)時(shí),需要將程序重新運(yùn)行。應(yīng)用系統(tǒng)開發(fā)過程中需要使用大量的數(shù)據(jù),同時(shí)也需要將數(shù)據(jù)進(jìn)行保存。程序設(shè)計(jì)語言為數(shù)據(jù)的保存提供相應(yīng)的功能,這就是數(shù)據(jù)文件的訪問功能。文件按照組織形式分為文本文件和二進(jìn)制文件。例如:整數(shù)1234,按照文本文件存儲(chǔ)分別是各數(shù)位的ASCII碼。如果按照二進(jìn)制文件存儲(chǔ),要將1234轉(zhuǎn)換成二進(jìn)制數(shù)。C語言中,不管是哪類文件,都被看成是一個(gè)字節(jié)或者一個(gè)二進(jìn)制流,對(duì)文件的存取是以字節(jié)為單位,把數(shù)據(jù)看作一連串的字符。在這個(gè)字節(jié)流中,所有的字節(jié)都是文件所保存的數(shù)據(jù),其中不包含任何作為格式標(biāo)記的符號(hào)或作為記錄格式的符號(hào),例如在輸出時(shí)不會(huì)自動(dòng)增加回車換行符標(biāo)志記錄結(jié)束,這種文件也稱為流式文件。12/23/20247案例二文件讀寫函數(shù)的使用21.問題描述計(jì)算已建立的文件中字符的個(gè)數(shù)。2.問題分析使用文件讀函數(shù)打開已存在的文件,讀出文件中字符并完成統(tǒng)計(jì),將統(tǒng)計(jì)的字符個(gè)數(shù)通過fprintf()寫入另一文件中并讀出。12/23/202483.?C語言代碼#include<stdio.h>#include<process.h>main(){FILE*fp1,*fp2; /*定義2個(gè)文件指針,一個(gè)指向保存字符的文件;一個(gè)指向保存統(tǒng)計(jì) 字符個(gè)數(shù)的文件*/longcount=0; /*保存統(tǒng)計(jì)字符個(gè)數(shù)*/charch; /*保存從文件中讀出的字符*/if((fp1=fopen("D:\\8.2\\exp1.txt","r"))==NULL)/*以讀方式打開已存在的exp1.txt文件,并判斷文件是否存在*/{printf("cannotopenfile\n");exit(0);}/*以下部分從exp1.txt中讀出字符,計(jì)算字符的個(gè)數(shù)存入變量count*/printf("inexp1.txtthecharis");ch=fgetc(fp1); /*從文件中讀出第一個(gè)字符*/while(ch!=EOF) /*字符是否已達(dá)到文件末尾*/{count=count+1; /*統(tǒng)計(jì)從文件中讀出字符個(gè)數(shù)*/ch=fgetc(fp1); /*從文件中再讀出一個(gè)字符*/printf("%c",ch);}fclose(fp1); /*關(guān)閉fp1指針指向的文件exp1.txt*//*以下部分是將count存儲(chǔ)的字符個(gè)數(shù)值寫入fp2指針?biāo)赶虻膃xp2.txt文件,再從exp2.txt文件讀出*/if((fp2=fopen("D:\\8.2\\exp2.txt","w"))==NULL) /*文件以寫方式打開*/{printf("cannotopenfile\n");exit(0);}fprintf(fp2,"%d",count); /*將統(tǒng)計(jì)字符的個(gè)數(shù)寫入文件指針fp2指向的文件exp2.txt中*/fclose(fp2);if((fp2=fopen("D:\\8.2\\exp2.txt","r"))==NULL) /*文件以只讀方式打開*/{printf("cannotopenfile\n");exit(0);}fscanf(fp2,"%d",&count); /*將統(tǒng)計(jì)字符的個(gè)數(shù)從文件指針fp2指向的文件中讀出*/printf("\ninexp2.txtthecountis=%d\n",count);/*輸出exp2.txt中保存的統(tǒng)計(jì)字符的個(gè)數(shù)*/fclose(fp2); /*關(guān)閉fp2指針指向的文件exp2.txt*/}12/23/20249exp1.txt文件中原有內(nèi)容如圖8.2,寫入到exp2.txt字符個(gè)數(shù)如圖8.3所示。圖8.2exp1.txt文件中的字符內(nèi)容圖8.3exp2.txt文件中存入字符個(gè)數(shù)12/23/2024104.程序運(yùn)行結(jié)果inexp1.txtthecharisty459aRQ*(>"inexp2.txtthecountis=1212/23/2024118.2文件的打開與關(guān)閉C語言提供對(duì)文件的訪問及處理功能。C語言對(duì)文件進(jìn)行讀寫之前首先要打開文件,對(duì)文件進(jìn)行處理后再將文件關(guān)閉。12/23/2024128.2.1文件類型指針
C語言中定義一個(gè)文件類型的結(jié)構(gòu)體FILE,通過定義指向文件的結(jié)構(gòu)體指針來訪問文件,完成對(duì)數(shù)據(jù)文件的讀寫操作。結(jié)構(gòu)體類型FILE定義如下:typedefstruct{int_fd; //文件號(hào)
int_cleft; //緩沖區(qū)中剩下的字符數(shù)
int_mode; //文件操作方式
char*_next; //文件當(dāng)前讀寫位置
char*_buff; //文件緩沖區(qū)位置}FILE;當(dāng)要對(duì)文件進(jìn)行操作時(shí),只需定義文件類型指針并將指針指向該文件,然后進(jìn)行操作即可。例如:FILE*fp;一個(gè)文件需要一個(gè)文件指針,若程序中同時(shí)處理多個(gè)文件,則應(yīng)定義多個(gè)文件類型指針。例如:在案例一中,定義了一個(gè)文件指針FILE*fp,處理D:\\8.1\\exp1.txt文件;在案例二中,定義了兩個(gè)文件指針FILE*fp1,*fp2。其中fp1處理D:\\8.2\\exp1.txt,即從該文件中讀出字符并統(tǒng)計(jì)字符個(gè)數(shù);fp2處理D:\\8.2\\exp2.txt,將字符個(gè)數(shù)寫入之后讀出。12/23/2024138.2.2文件的打開與關(guān)閉
對(duì)文件進(jìn)行操作之前,首先要打開文件,操作之后要關(guān)閉文件。C語句提供兩個(gè)標(biāo)準(zhǔn)函數(shù)fopen()和fclose()函數(shù),分別用于數(shù)據(jù)文件的打開和關(guān)閉。如表8.1、8.2所示。文件打開文件無法打開返回值fopen()文件打開函數(shù)系統(tǒng)自動(dòng)創(chuàng)建一個(gè)FILE型結(jié)構(gòu)體,用于存放相關(guān)信息NULL表8.1fopen函數(shù)12/23/202414文件關(guān)閉文件返回值fclose()文件關(guān)閉函數(shù)FILE結(jié)構(gòu)體被釋放正常關(guān)閉時(shí)返回0,否則返回EOF表8.2fclose函數(shù)12/23/2024151.文件打開函數(shù)FILE*fopen(charfname[],charmode[])。其中fname[]為打開文件的文件名;mode[]為打開文件方式。根據(jù)文件存儲(chǔ)格式不同,文件分為文本文件和二進(jìn)制文件,該函數(shù)返回結(jié)構(gòu)體FILE類型指針。例如:案例一中,使用if((fp=fopen("D:\\8.1\\exp1.txt","r"))==NULL),判斷D:\\8.1\\exp1.txt文件以“讀”方式打開是否成功。文件讀寫方式如表8.3所示。2.文件關(guān)閉函數(shù)intfclose(FILE*fp)。在關(guān)閉文件時(shí)先把緩沖區(qū)的數(shù)據(jù)輸出到文件,這樣可以避免丟失數(shù)據(jù),另外操作系統(tǒng)對(duì)同時(shí)打開的文件的數(shù)量也有一定的限制。如果文件使用完畢后沒有關(guān)閉可能會(huì)影響其他文件的打開。除此之外文件使用完畢后不關(guān)閉也會(huì)繼續(xù)占據(jù)一部分內(nèi)存,造成內(nèi)存空間的浪費(fèi)。12/23/202416表8.3文件使用方式使用方式意義指定文件不存在時(shí)指定文件存在時(shí)文件被打開后,位置指針的指向從文件中讀向文件中寫"rt"打開一個(gè)文本文件,只允許讀數(shù)據(jù)出錯(cuò)正常打開文件的起始處允許不允許"wt"打開或建立一個(gè)文本文件,只允許寫數(shù)據(jù)建立新文件刪除文件原有內(nèi)容文件的起始處不允許允許"at"打開一個(gè)文本文件,并在文件末尾寫數(shù)據(jù)建立新文件正常打開文件的結(jié)尾處不允許允許"rb"打開一個(gè)二進(jìn)制文件,只允許讀數(shù)據(jù)出錯(cuò)正常打開文件的起始處允許不允許"wb"打開一個(gè)二進(jìn)制文件,只允許寫數(shù)據(jù)建立新文件刪除文件原有內(nèi)容文件的起始處不允許允許"ab"打開一個(gè)二進(jìn)制文件,并在文件末尾寫數(shù)據(jù)建立新文件正常打開文件的結(jié)尾處不允許允許"rt+"打開一個(gè)文本文件,允許讀和寫出錯(cuò)正常打開文件的起始處允許允許"wt+"打開一個(gè)文本文件,允許讀和寫建立新文件刪除文件原有內(nèi)容文件的起始處允許允許"at+"打開一個(gè)文本文件,允許讀,或在文件末追加數(shù)據(jù)建立新文件正常打開文件的結(jié)尾處允許允許"rb+"打開一個(gè)二進(jìn)制文件,允許讀和寫出錯(cuò)正常打開文件的起始處允許允許"wb+"打開或建立一個(gè)二進(jìn)制文件,允許讀和寫建立新文件刪除文件原有內(nèi)容文件的起始處允許允許"ab+"打開一個(gè)二進(jìn)制文件,允許讀,或在文件末追加數(shù)據(jù)建立新文件正常打開文件的結(jié)尾處允許允許12/23/202417說明:(1)使用fopen()函數(shù)打開文件,將相應(yīng)文件內(nèi)容讀入內(nèi)存等候處理,并且使用if語句判斷文件打開是否成功。(2)根據(jù)需要選擇合適的文件讀寫函數(shù)對(duì)文件進(jìn)行操作。(3)可以根據(jù)需求進(jìn)行隨機(jī)讀寫,這時(shí)需要定位函數(shù)定位讀寫指針。(4)讀寫操作結(jié)束后,使用fclose()函數(shù)關(guān)閉文件,同時(shí)將文件在內(nèi)存中的內(nèi)容保存到外存上。不調(diào)用fclose()函數(shù),文件的更改沒有同步到外存上的文件,所以處理結(jié)束,一定要調(diào)用fclose()函數(shù)。(5)寫入的字符串之間不存在任何分隔符。(6)表8.3中"rt"、"wt"…中的"t"表示對(duì)文本文件的讀和寫,也可直接省略"t"。"rb"、"wb"…中的"b"表示對(duì)二進(jìn)制文件的讀和寫。12/23/202418案例三文件讀寫函數(shù)的使用31.問題描述建立學(xué)生基本信息,并完成信息的顯示與查詢。2.問題分析學(xué)生信息采用結(jié)構(gòu)體數(shù)組,對(duì)整個(gè)數(shù)據(jù)塊的讀寫使用相應(yīng)函數(shù)實(shí)現(xiàn)。12/23/2024193.?C語言代碼#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<dos.h>#include<string.h>structaddress_list{charname[10];charadr[20];chartel[15];};structaddress_listinfo[100];/*學(xué)生數(shù)據(jù)的保存*/voidsave(intn){FILE*fp;inti;if((fp=fopen("data.txt","w"))==NULL){printf("cannotopenfilesave\n");exit(0);}for(i=0;i<n;i++)if(fwrite(&info[i],sizeof(structaddress_list),1,fp)!=1)printf("filewriteerror\n");fclose(fp);}/*學(xué)生數(shù)據(jù)的顯示*/voidshow(intn){FILE*fp;inti;if((fp=fopen("data.txt","r"))==NULL){printf("cannotopenfileshow\n");
exit(0);
}
printf("nameadrtel\n");for(i=0;i<n;i++){fread(&info[i],sizeof(structaddress_list),1,fp);printf("%-15s%-20s%-12s\n",info[i].name,info[i].adr,info[i].tel);}fclose(fp);}/*學(xué)生數(shù)據(jù)查詢*/voidsearch(){FILE*fp;
intm=0,i;
charsname[10];if((fp=fopen("data.txt","rb"))==NULL)
{printf("nodata.txt\n");return;}while(!feof(fp))if(fread(&info[m],sizeof(structaddress_list),1,fp)==1)m++;fclose(fp);if(m==0){printf("norecord!\n");return;}printf("請(qǐng)輸入姓名:");scanf("%s",sname);for(i=0;i<m;i++){if(strcmp(sname,info[i].name)==0)
{
printf("nameadrtel\n");printf("%-15s%-20s%-12s\n",info[i].name,info[i].adr,info[i].tel);break;}} if(i==m)printf("沒有找到該學(xué)生");fclose(fp);}main(){inti,n,flag;printf("howmanystudent?\n");scanf("%d",&n);printf("pleaseinputname,address,telephon:\n");for(i=0;i<n;i++){printf("NO%d\n",i+1);scanf("%s%s%s",info[i].name,info[i].adr,info[i].tel);}save(n);show(n);printf("1tocheckthestudent\n");scanf("%d",&flag);if(flag==1)search();elseprintf("endoftheprogram\n");}12/23/2024204.程序運(yùn)行結(jié)果howmanystudent?2pleaseinputname,address,telephon:NO1zhaoyantalu12238324562NO2qianxianroaameadrtelzhaoyantalu12238324562qianxianroad172834278341tocheckthestudent1請(qǐng)輸入姓名:qiannameadrtelqianxianroad1728342783412/23/2024218.3文?件?的?讀?寫文件成功打開后,可利用C語言提供的相應(yīng)函數(shù)完成對(duì)文件的讀寫操作。C語言提供兩類讀寫函數(shù),非格式化讀寫函數(shù)和格式化讀寫函數(shù)。12/23/2024228.3.1文件讀寫函數(shù)
字符讀寫函數(shù)有fputc()、fgetc();字符串讀寫函數(shù)有fputs()、fgets();字符塊讀寫函數(shù)有fread()、fwrite()。讀寫函數(shù)的一般形式如表8.4所示。表8.4文件讀寫函數(shù)函數(shù)形式一般使用方式說明fputc()fputc(ch,fp)把字符ch寫到fp所指文件中fgetc()ch=fgetc(fp)從fp指向的文件中讀出一個(gè)字符,并返回其ASCII值fputs()fputs(字符串,fp)把一個(gè)字符串寫到fp所指文件中fgets()fgets(字符數(shù)組名,n,fp)從fp指向的文件中讀出(n-1)個(gè)字符,放到字符數(shù)組中,在讀入的最后一個(gè)字符后面加上串結(jié)束標(biāo)志'\0'fread()fread(buffer,size,count,fp)從fp所指文件每次讀取size字節(jié),共讀取count次,讀出信息存放在buffer地址中fwrite()fwrite(buffer,size,count,fp)從buffer地址開始每次讀size個(gè)字節(jié),共讀取count次,讀出信息寫入fp所指文件中表8.4文件讀寫函數(shù)12/23/202423說明:1.?fputc()函數(shù)和fgetc()函數(shù)(1)?fputc()函數(shù)和fgetc()每次寫入一個(gè)字符和讀出一個(gè)字符,以字節(jié)為單位。(2)當(dāng)反復(fù)讀文件字符時(shí),可通過(c=fgetc(fp))!=EOF判斷是否到文件結(jié)束。(3)如果寫入字符成功,fputc()函數(shù)的返回值是寫入字符;如果寫入失敗,返回文件結(jié)束標(biāo)志EOF。例如,案例二中如下語句:ch=fgetc(fp1);/*從文件中讀出第一個(gè)字符*/while(ch!=EOF)/*字符是否已達(dá)到文件末尾*/另外,在系統(tǒng)文件中,有如下的宏定義:#defineputchar(ch) fputc(ch,stdout)#definegetchar() fgetc(stdin)#definegetc(fp) fgetc(fp)#defineputc(ch,fp) fputc(ch,fp)以上宏定義可以幫助大家理解相關(guān)函數(shù)之間的關(guān)系。12/23/2024242.?fputc()函數(shù)和putchar()函數(shù)putchar(ch)相當(dāng)于fputc(ch,stdout),所以它是面向終端的輸出。如果將fputc()中第2個(gè)參數(shù)指向一個(gè)stdout(標(biāo)準(zhǔn)輸出standard-out),fputc()函數(shù)作用與putchar()函數(shù)相同。例8.1分別使用fputc()函數(shù)和putchar()函數(shù)輸出同一字符數(shù)組的字符。程序使用代碼如下:#include<stdio.h>main(){inti=0;charstr[]="Helloworld\n";printf("useputchar輸出數(shù)組元素為:");while(str[i])putchar(str[i++]);printf("usefputc輸出數(shù)組元素為:");i=0;while(str[i])fputc(str[i++],stdout);}程序運(yùn)行結(jié)果如下:useputchar輸出數(shù)組元素為:Helloworldusefputc輸出數(shù)組元素為:Helloworld12/23/2024253.fgetc()函數(shù)和getchar()函數(shù)getchar()相當(dāng)于fgetc(stdin),所以它是面向終端的輸入。如果將fgetc()中參數(shù)指向一個(gè)stdin(標(biāo)準(zhǔn)輸出standard-in),fgetc()作用與getchar()相同。例8.2分別使用fgetc()函數(shù)和getchar()函數(shù)輸入相同的字符,并輸出。程序使用代碼如下:#include<stdio.h>main(){inti=0;charcha1,cha2;printf("inputcha1:");cha1=getchar();printf("inputcha2:");fflush(stdin);cha2=fgetc(stdin);
printf("cha1=%c,cha2=%c\n",cha1,cha2);}程序運(yùn)行結(jié)果如下:inputcha1:ainputcha2:acha1=a,cha2=a12/23/2024264.?fgets()函數(shù)和gets()函數(shù)gets()函數(shù)原型為char*gets(char*buffer)gets()函數(shù)從標(biāo)準(zhǔn)輸入standard-in中讀取字符串,直至接收到換行符停止,并將讀取的結(jié)果存放在buffer指針?biāo)赶虻淖址麛?shù)組中。若讀入成功,則返回與buffer相同的字符型指針;若讀入過程中發(fā)生錯(cuò)誤,返回NULL指針。fgets()函數(shù)的原型為:char*fgets(char*buf,intbufsize,FILE*fp)fgets()函數(shù)的作用是從fp所指文件讀取字符串,放到buf所指內(nèi)存中去。第二個(gè)參數(shù)
bufsize用來指示最大讀入字符數(shù)。如果這個(gè)參數(shù)值為n,那么fgets()函數(shù)就會(huì)讀取最多(n-1)個(gè)字符或者讀完一個(gè)換行符為止,在這兩者之中,最先滿足的那個(gè)條件用于結(jié)束輸入。與gets()函數(shù)不同的是,如果fgets()函數(shù)讀到換行符,就會(huì)把它存儲(chǔ)到字符串中,而不是像gets()函數(shù)那樣丟棄它,結(jié)束輸入。如果將fgets()函數(shù)中第3個(gè)參數(shù)指向一個(gè)stdin(標(biāo)準(zhǔn)輸入standard-in),而不是一個(gè)文件,fgets()作用與gets()相同。12/23/202427例如以下程序:#include<stdio.h>main(){charbuffer[11];fgets(buffer,11,stdin);printf("輸出:%s\n",buffer);}程序運(yùn)行結(jié)果如下:HELLOW輸出:HELLOW12/23/2024285.fputs()函數(shù)和puts()函數(shù)puts()函數(shù)的原型為intputs(constchar*str);puts()函數(shù)主要用于向標(biāo)準(zhǔn)輸出設(shè)備(屏幕)寫入字符串并換行,即自動(dòng)寫一個(gè)換行符'ln'到標(biāo)準(zhǔn)輸出。fputs()函數(shù)的原型為fputs(char*str,FILE*fp);fputs()函數(shù)作用是向指定的文件寫入一個(gè)字符串(不換行)。str為要寫入的字符串的地址,fp為文件指針。寫入成功返回非負(fù)數(shù),失敗返回EOF。如果將fputs()函數(shù)中第2個(gè)參數(shù)指向一個(gè)stdout(標(biāo)準(zhǔn)輸出standard-out),而不是一個(gè)文件,進(jìn)行輸出顯示(它同樣需要遇到null('\0')字符才停止輸出),fputs()函數(shù)作用與puts()函數(shù)作相同。例如以下程序:#include<stdio.h>main(){charstr[]={'H','E','L','L','O','\0'};fputs(str,stdout);}程序運(yùn)行結(jié)果如下:HILLO12/23/2024296.fread()函數(shù)和fwrite()函數(shù)這兩個(gè)函數(shù)適合對(duì)整塊數(shù)據(jù)讀寫,如數(shù)組、結(jié)構(gòu)體。fread()函數(shù)的原型為:fread(buffer,size,count,fp)其中,buffer讀入的數(shù)據(jù)項(xiàng)被存入一個(gè)內(nèi)存塊,buffer為該內(nèi)存塊的首地址;size為整型量,表示將要從文件中讀入的每個(gè)數(shù)據(jù)項(xiàng)的大小(字節(jié)數(shù));count為整型量,表示將要從文件中讀入的數(shù)據(jù)項(xiàng)個(gè)數(shù);fp為文件指針,表示將要讀取數(shù)據(jù)文件的文件指針。函數(shù)的功能是按照指定的格式從文件fp的當(dāng)前位置指針處開始將數(shù)據(jù)(size*count大小)讀入到地址表列buffer開始的地址存儲(chǔ)單元中。該函數(shù)調(diào)用后返回一個(gè)整數(shù)值,表示成功地從文件中讀入的數(shù)據(jù)項(xiàng)的個(gè)數(shù)。當(dāng)函數(shù)執(zhí)行結(jié)束后,文件的當(dāng)前位置指針將自動(dòng)向后移動(dòng)size*count個(gè)字節(jié)。12/23/202430fwrite()函數(shù)的原型為fwrite(buffer,size,count,fp)其中,buffer存放要寫入文件的一組數(shù)據(jù)的首地址;size為整型量,它表示需要輸出到文件中的每個(gè)數(shù)據(jù)項(xiàng)的大小(字節(jié)數(shù));count為整型量,它表示需要輸出到文件中的數(shù)據(jù)項(xiàng)的個(gè)數(shù);fp為文件指針,它表示將要寫入數(shù)據(jù)的文件的文件指針。函數(shù)的功能是將一組類型相同數(shù)據(jù)寫入到指定文件的當(dāng)前位置指針處。該函數(shù)調(diào)用后將返回一個(gè)整數(shù)值,該整數(shù)值表示成功地寫入到文件中的數(shù)據(jù)項(xiàng)的個(gè)數(shù)。當(dāng)該函數(shù)執(zhí)行結(jié)束后,文件的當(dāng)前位置指針將自動(dòng)向后移動(dòng)size*count個(gè)字節(jié)。例如:案例三保存函數(shù)save中for(i=0;i<n;i++)循環(huán)體中使用fwrite(&info[i],sizeof(structaddress_list),1,fp)!=1,每執(zhí)行一次將結(jié)構(gòu)體數(shù)組info中的每一個(gè)元素(結(jié)構(gòu)體)寫入fp指向的文件。&info[i]:從每一個(gè)數(shù)組元素地址開始,每次寫sizeof(structaddress_list)字節(jié),共寫1次。12/23/2024318.3.2格式化讀寫函數(shù)
C語言提供面向文件的格式化函數(shù),即fscanf()、fprintf()。函數(shù)形式一般使用方式說明fscanf()fscanf(fp,格式字符串,輸入表列)向指向的文件讀取輸入表列數(shù)據(jù);若執(zhí)行成功,則返回值為實(shí)際讀取字符;若出錯(cuò)或文件結(jié)束,否則返回0fprintf()fprintf(fp,格式字符串,輸出表列)把輸出表列中所列輸出項(xiàng)的值寫入指向的文件中,若寫入成功,則返回值為寫入字符,否則為負(fù)數(shù)。表8.5格式化文件讀寫函數(shù)12/23/202432說明:(1)?fscanf()從文件讀取數(shù)據(jù)時(shí),以制表符、空格字符、回車符作為數(shù)據(jù)項(xiàng)結(jié)束標(biāo)志。(2)?fprintf()向文件寫數(shù)據(jù)時(shí),輸出表列之間用逗號(hào)隔開。例如:在案例二中,使用fprintf(fp2,"%d",count)將變量count(整數(shù))寫入fp2指向的exp2.txt文件中;使用fscanf(fp2,"%d",&count)將變量count的值為從fp2指向的exp2.txt文件中讀出的整數(shù)。(3)printf()是面向終端的格式化輸出函數(shù)。如果把fprintf()函數(shù)的第一個(gè)參數(shù)改為stdout,可以完成向標(biāo)準(zhǔn)輸出設(shè)備(屏幕)的輸出,作用同printf()。scanf()是面向終端的格式化輸入函數(shù)。如果把fscnf()函數(shù)中的第一個(gè)參數(shù)改為stdin,可以完成由標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)向內(nèi)存的輸入,作用同scanf()。12/23/202433例如以下程序:#include<stdio.h>main(){charst1[20],st2[20];printf("input數(shù)組st1:");scanf("%s",st1);/*輸入"HELLOW"*/printf("input數(shù)組st2:");fscanf(stdin,"%s",st2);/*同樣輸入"HELLOW"*/printf("\n輸出st1數(shù)組元素");printf("%s\n",st1);printf("輸出st2數(shù)組元素");fprintf(stdout,st2);printf("\n");}程序運(yùn)行結(jié)果如下:input數(shù)組st1:HELLOWinput數(shù)組st2:HELLOW輸出st1數(shù)組元素:HELLOW輸出st2數(shù)組元素:HELLOW12/23/2024348.4文?件?的?定?位文件的讀寫操作都是從文件的某一個(gè)位置(稱這個(gè)位置為讀寫位置)開始的。存放讀寫位置的指針為位置指針。每進(jìn)行一次讀寫操作,文件的讀寫位置都自動(dòng)發(fā)生變化。在C語言中,可以調(diào)用庫函數(shù)來改變文件的讀寫位置,這種庫函數(shù)稱為文件定位函數(shù),如表
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 節(jié)假日短租合同注意事項(xiàng)
- 購房合同對(duì)房產(chǎn)增值的影響
- 智能制造廠房租賃合同解讀
- 旅游行業(yè)工程提成合同示例
- 網(wǎng)絡(luò)信息安全服務(wù)合同
- 銀行金融服務(wù)合同簽署流程規(guī)范
- 借款居間服務(wù)合同
- 渣土車運(yùn)輸合同
- 保潔勞動(dòng)合同
- 2024年度辦公樓電梯維修保養(yǎng)勞務(wù)施工承包合同
- DB3710T 190-2023 花生病蟲草害綠色防控技術(shù)規(guī)程
- 2024年墊資與分成合作合同3篇
- 大部分分校:地域文化形考任務(wù)四-國(guó)開(CQ)-國(guó)開期末復(fù)習(xí)資料
- 2024全球體育行業(yè)調(diào)研報(bào)告(第八期)-漸入佳境
- 2024-2030年中國(guó)橄欖油行業(yè)市場(chǎng)發(fā)展動(dòng)態(tài)及前景趨勢(shì)分析報(bào)告
- 【MOOC】管理學(xué)-北京師范大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 《《論語》導(dǎo)讀(復(fù)旦版)》章節(jié)測(cè)試答案
- 杜絕“死亡游戲”(夢(mèng)回大唐)學(xué)生安全主題班會(huì)課件
- 換熱站維保合同范例
- 心理咨詢師兼職合同
- 急診與災(zāi)難醫(yī)學(xué)(廣西中醫(yī)藥大學(xué))知到智慧樹章節(jié)答案
評(píng)論
0/150
提交評(píng)論