C語言由淺入深講解文件的操作下篇_第1頁
C語言由淺入深講解文件的操作下篇_第2頁
C語言由淺入深講解文件的操作下篇_第3頁
C語言由淺入深講解文件的操作下篇_第4頁
C語言由淺入深講解文件的操作下篇_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第C語言由淺入深講解文件的操作下篇目錄文件的順序讀寫字符輸入輸出fgetc和fputcfgetcfputc:文本行輸入輸出函數(shù)fgets和fputsfgets:fputs:格式化輸入輸出函數(shù)fscanf和fprintffscanf:fprintf:二進(jìn)制輸入輸出函數(shù)fread和fwritefread:fwrite:文件的隨機(jī)讀寫fseekftellfwind文本文件和二進(jìn)制文件文件結(jié)束的判定feof文件緩沖區(qū)第一篇講了文件的基本概念,和文件如何打開和關(guān)閉。第二篇主要介紹文件的順序讀寫和隨機(jī)讀寫。外加文件緩沖區(qū)的知識點(diǎn)。

文件的順序讀寫

字符輸入輸出fgetc和fputc

fgetc

fgetc:字符輸入函數(shù),也就是讀文件時用的函數(shù)。

函數(shù)功能:Readacharacterfromastream

從一個文件中讀一個字符到內(nèi)存中。

函數(shù)原型:

intfgetc(FILE*stream);

參數(shù)為stream,也就是文件指針。

返回值:fgetcreturnthecharacterreadasanintorreturnEOFtoindicateanerrororendoffile.該函數(shù)調(diào)用成功會返回讀取到的的字符的ASCIIC碼值;若讀取文件時發(fā)生錯誤,或是已經(jīng)讀取到文件末尾,則返回EOF。

舉例:將data.txt文件中的內(nèi)容讀取,并打印。

#includestdio.h

#includestring.h

#includeerrno.h

intmain()

//打開文件

FILE*pf=fopen("data.txt","r");

if(pf==NULL)

printf("%s\n",strerror(errno));

return0;//文件打開失敗,失敗返回

//對文件進(jìn)行輸入字符操作

intch=0;

while((ch=fgetc(pf))!=EOF)

printf("%c",ch);

//關(guān)閉文件

fclose(pf);

pf=NULL;

return0;

fputc:

函數(shù)功能:從內(nèi)存中寫一個字符到文件中。也就是輸出字符。

函數(shù)原型:

intfputc(intc,FILE*stream);

第一個參數(shù)為待輸出的字符,第二個參數(shù)是文件指針。

返回值:Eachofthesefunctionsreturnsthecharacterwritten.Forfputc,areturnvalueofEOFindicatesanerror.

如果正常運(yùn)行則返回此字符,如果返回EOF則意味著失敗。

舉例:將字母a~z寫入到data.txt文件中

#includestdio.h

#includestring.h

#includeerrno.h

intmain()

//打開文件

FILE*pf=fopen("data.txt","w");

//文件打開失敗,失敗返回

if(pf==NULL)

printf("%s\n",strerror(errno));

return0;

//對文件進(jìn)行輸出字符的操作

chari=0;

for(i='a';i='z';i++)

fputc(i,pf);

//關(guān)閉文件

fclose(pf);

pf=NULL;

return0;

文本行輸入輸出函數(shù)fgets和fputs

fgets和fputs是對文本行的操作,相當(dāng)于對字符串的操作。這是不同于fgetc和fputc的地方。

fgets:

函數(shù)功能:從文件中讀一行字符到內(nèi)存中,也就是輸入。

函數(shù)原型:

char*fgets(char*string,intn,FILE*stream);

第一個參數(shù)是指向文件字符串的指針,第二個參數(shù)是讀幾個字符的意思,第三個參數(shù)是指向文件的指針。

返回值:Eachofthesefunctionsreturnsstring.NULLisreturnedtoindicateanerrororanend-of-filecondition.Usefeoforferrortodeterminewhetheranerroroccurred.每一個這樣的函數(shù)結(jié)束后正常情況返回一個指向這個字符串的字符指針。如果返回NULL則意味著遇到錯誤,或者是文件結(jié)束。但是重點(diǎn)來了~,想要判斷到底是錯誤導(dǎo)致的返回,還是文件結(jié)束導(dǎo)致的返回,還需要使用feof函數(shù)和ferror函數(shù)來判斷。

下面有涉及feof函數(shù)的用法

舉個例子。

//feof是用來在結(jié)束后判斷是什么原因結(jié)束的

if(ferror(fp))

puts("I/Oerrorwhenreading");

elseif(feof(fp))

puts("Endoffilereachedsuccessfully");

fclose(fp);

注意:

1.在fgets函數(shù)讀取到指定字符數(shù)之前,若讀取到換行符(\n),則停止讀取,讀取帶回的字符包含換行符。

2.fgets函數(shù)讀取到第n-1個字符時都沒有遇到換行符(\n)時,則返回讀到的前n-1個字符,并在末尾加上一個NULL字符返回。這樣加起來共n個字符

fputs:

函數(shù)功能:寫一行字符串到文件中,也就是輸出。

函數(shù)原型:

intfputs(constchar*string,FILE*stream);

第一個參數(shù)為指向內(nèi)存中這個字符串的指針,第二個參數(shù)為指向這個文件的文件指針。返回值:該函數(shù)調(diào)用成功會返回一個非負(fù)值;若輸出時發(fā)生錯誤,則返回EOF。

格式化輸入輸出函數(shù)fscanf和fprintf

fscanf和fprintf也叫格式化輸入(讀)和輸出(寫)函數(shù)。

fscanf:

函數(shù)功能:按照一定的格式如%s,%c,從指定文件的位置輸入到內(nèi)存中。

函數(shù)原型:

intfscanf(FILE*stream,constchar*format[,argument]...);

fscanf函數(shù)的第一個參數(shù)是讀取數(shù)據(jù)的位置也就是文件指針,第二個參數(shù)也就是scanf函數(shù)的參數(shù),也就是取地址。

除了第一個參數(shù)是需要指針位置其余和scanf函數(shù)操作一樣。

fprintf:

函數(shù)功能:將內(nèi)存中的數(shù)據(jù)以一定的格式輸出到文件中。也就是打印,也稱為寫。

函數(shù)原型:

intfprintf(FILE*stream,constchar*format[,argument]...);

第一個參數(shù)是文件指針,第二個參數(shù)和printf函數(shù)一樣,會用printf函數(shù)就會用這個函數(shù)。

舉例:

includestdio.h

#includestring.h

#includeerrno.h

structS

charname[20];

charsex[5];

intage;

intmain()

//打開文件

FILE*pf=fopen("data.txt","r");

//如果文件打開失敗,失敗返回

if(pf==NULL)

printf("%s\n",strerror(errno));

return0;

//對文件進(jìn)行格式化輸入輸出操作

structStmp={0};

fscanf(pf,"%s%s%d",,tmp.sex,(tmp.age));

printf("%s%s%d\n",,tmp.sex,tmp.age);

//可以打印出來,我這里沒打印。

//關(guān)閉文件

fclose(pf);

pf=NULL;

return0;

二進(jìn)制輸入輸出函數(shù)fread和fwrite

fread:

函數(shù)功能:Readsdatafromastream.從一個流中讀取數(shù)據(jù)到內(nèi)存中。

函數(shù)原型:

size_tfread(void*buffer,size_tsize,size_tcount,FILE*stream);

第一個參數(shù)是buffer是內(nèi)存的意思,第二個參數(shù)是要讀的數(shù)據(jù)的類型,第三個參數(shù)是讀取的個數(shù),第四個參數(shù)是文件指針。總的意思是從文件指針指向的文件讀取count個size大小的數(shù)據(jù)到內(nèi)存buffer中。

返回值:若在讀取過程中發(fā)生錯誤或是在未讀取到指定元素個數(shù)時讀取到文件末尾,則返回一個小于count的數(shù)。

fwrite:

函數(shù)功能:Writesdatatoastream.寫入二進(jìn)制數(shù)據(jù)到文件中

函數(shù)原型:

size_tfwrite(constvoid*buffer,size_tsize,size_tcount,FILE*stream);

第一個參數(shù)是輸出數(shù)據(jù)的位置,第二個參數(shù)是要輸出數(shù)據(jù)的元素個數(shù),第三個參數(shù)是每個元素的大小,第四個參數(shù)是數(shù)據(jù)輸出的目標(biāo)位置。返回值:該函數(shù)調(diào)用完后,會返回實(shí)際寫入目標(biāo)位置的元素個數(shù),當(dāng)輸出時發(fā)生錯誤或是待輸出數(shù)據(jù)元素個數(shù)小于要求輸出的元素個數(shù)時,會返回一個小于count的數(shù)。

舉例:以wb輸出到文件

#includestdio.h

#includestring.h

#includeerrno.h

intmain()

//打開文件

FILE*pf=fopen("data.txt","wb");

if(pf==NULL)

printf("%s\n",strerror(errno));

return0;

//對文件以二進(jìn)制形式進(jìn)行輸出操作

intarr[10]={0,1,2,3,4,5,6,7,8,9};

fwrite(arr,sizeof(int),10,pf);

//關(guān)閉文件

fclose(pf);

pf=NULL;

return0;

文件的隨機(jī)讀寫

fseek

函數(shù)介紹:定位文件指針,以文件指針當(dāng)前的位置,偏移到想定位的位置。向前偏移是負(fù)的,比如-1,-2,向后偏移是正的。

SEEK_CUR:從當(dāng)前指針的位置偏移SEEK_SET:從文件的起始位置開始偏移SEEK_END:從文件的末尾開始偏移

函數(shù)原型:

intfseek(FILE*stream,longoffset,intorigin);

第一個參數(shù)是文件指針,第二個參數(shù)是要偏移的偏移量。第三個參數(shù)是從什么位置開始偏移。舉例。

/*fseekexample*/

#includestdio.h

intmain()

FILE*pFile;

//打開文件

pFile=fopen("example.txt","wb");

//以一行的形式寫文件

fputs("Thisisanapple.",pFile);

//讓文件指針從文件的起始位置開始偏移9個單位。

fseek(pFile,9,SEEK_SET);

//繼續(xù)寫文件

fputs("sam",pFile);

//關(guān)閉文件

fclose(pFile);

return0;

ftell

函數(shù)介紹:可以返回文件指針相對于起始位置的偏移量

函數(shù)原型:

longftell(FILE*stream);

返回值類型為longint,第一個參數(shù)是文件指針。

fwind

函數(shù)介紹:讓文件指針回到文件的起始位置。fseek函數(shù)也可以達(dá)到同樣的效果。

函數(shù)原型:

voidrewind(FILE*stream);

舉例

/*rewindexample*/

#includestdio.h

intmain()

intn;

FILE*pFile;

charbuffer[27];

//打開文件

pFile=fopen("myfile.txt","w+");

for(n='A';n='Z';n++)

fputc(n,pFile);

//使指針回到起始位置

rewind(pFile);

fread(buffer,1,26,pFile);

fclose(pFile);

buffer[26]='\0';

puts(buffer);

return0;

文本文件和二進(jìn)制文件

數(shù)據(jù)文件:可以分為文本文件和二進(jìn)制文件

二進(jìn)制文件:文本文件可以肉眼看懂,二進(jìn)制文件則是亂碼看不懂。

數(shù)據(jù)在內(nèi)存中是以二進(jìn)制的形式存儲,如果不加轉(zhuǎn)換的輸出到外存,就是二進(jìn)制文件文本文件:如果要求在外存中以ASCII碼的形式存儲,則需要在存儲前轉(zhuǎn)換。如果以ASCII字符的形式存儲文件就叫做文本文件。

具體例子如下。

一個數(shù)據(jù)在內(nèi)存中是怎么存儲的呢?

如果整數(shù)10000以ASCII碼的形式輸出到磁盤,則占用5個字節(jié)。如果以二進(jìn)制形式輸出到磁盤則占用4個字節(jié)。

文件結(jié)束的判定

feof

牢記:在文件讀取過程中,不能用feof函數(shù)的返回值直接用來判斷文件是否結(jié)束。

函數(shù)功能:應(yīng)用于當(dāng)文件讀取結(jié)束的時候,用ferror判斷是讀取失敗結(jié)束,還是遇到文件末尾結(jié)束。

1.文本文件讀取是否結(jié)束,判斷返回值是否為EOF(fgetc),或者是否為NULL(fgets)等。每個函數(shù)有每個特定的結(jié)束標(biāo)志。

2.二進(jìn)制文件的讀取結(jié)束判斷,判斷返回值是否小于實(shí)際要讀的個數(shù)。

正確使用例子

#includestdio.h

#includestdlib.h

intmain(void){

intc;

//注意:int,非char,要求處理EOF

FILE*fp=fopen("test.txt","r");

//如果為0,則打開失敗

if(!fp)

perror("Fileopeningfailed")

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論