C語言文件操作教程_第1頁
C語言文件操作教程_第2頁
C語言文件操作教程_第3頁
C語言文件操作教程_第4頁
C語言文件操作教程_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

本文格式為Word版,下載可任意編輯——C語言文件操作教程C語言文件操作教程

引導(dǎo)語;C語言的應(yīng)用范圍廣泛,具備很強的數(shù)據(jù)處理才能,以下是我共享給大家的C語言文件操作教程,接待閱讀,更多精彩請持續(xù)關(guān)注我們我!

一、標(biāo)準(zhǔn)文件的讀寫

1.文件的開啟fopen

文件的開啟操作表示將給用戶指定的文件在內(nèi)存調(diào)配一個FILE布局區(qū),并將該布局的指針返回給用戶程序,以后用戶程序就可用此FILE指針來實現(xiàn)對指定文件的存取操作了。當(dāng)使用開啟函數(shù)時,務(wù)必給出文件名、文件操作方式讀、寫或讀寫,假設(shè)該文件名不存在,就意味著建立只對寫文件而言,對讀文件那么出錯,并將文件指針指向文件開頭。若已有一個同名文件存在,那么刪除該文件,若無同名文件,那么建立該文件,并將文件指針指向文件開頭。

fopenchar*filename,char*type;

其中*filename是要開啟文件的文件名指針,一般用雙引號括起來的文件名表示,也可使用雙反斜杠隔開的路徑名。而*type參數(shù)表示了對開啟文件的操作方式。其可采用的操作方式如下:

方式含義

r開啟,只讀

w開啟,文件指針指到頭,只寫

a開啟,指向文件尾,在已存在文件中追加

rb開啟一個二進制文件,只讀

wb開啟一個二進制文件,只寫

ab開啟一個二進制文件,舉行追加

r+以讀/寫方式開啟一個已存在的文件

w+以讀/寫方式建立一個新的文本文件

a+以讀/寫方式開啟一個文件文件舉行追加

rb+以讀/寫方式開啟一個二進制文件

wb+以讀/寫方式建立一個新的二進制文件

ab+以讀/寫方式開啟一個二進制文件舉行追加

當(dāng)用fopen0告成的開啟一個文件時,該函數(shù)將返回一個FILE指針,假設(shè)文件開啟失敗,將返回一個NULL指針。如想開啟test文件,舉行寫:

FILE*fp;

iffp=fopentest,w==NULL

printfFilecannotbeopened\n;

exit;

else

printfFileopenedforwriting\n;

fclosefp;

DOS操作系統(tǒng)對同時開啟的文件數(shù)目是有限制的,缺省值為5,可以通過修改CONFIG.SYS文件變更這個設(shè)置。

2.關(guān)閉文件函數(shù)fclose

文件操作完成后,務(wù)必要用fclose函數(shù)舉行關(guān)閉,這是由于對開啟的文件舉行寫入時,若文件緩沖區(qū)的空間未被寫入的內(nèi)容填滿,這些內(nèi)容不會寫到開啟的文件中去而損失。只有對開啟的文件舉行關(guān)閉操作時,停留在文件緩沖區(qū)的內(nèi)容才能寫到該文件中去,從而使文件完整。再者一旦關(guān)閉了文件,該文件對應(yīng)的FILE布局將被釋放,從而使關(guān)閉的文件得到養(yǎng)護,由于這時對該文件的存取操作將不會舉行。文件的關(guān)閉也意味著釋放了該文件的緩沖區(qū)。

intfcloseFILE*stream;

它表示該函數(shù)將關(guān)閉FILE指針對應(yīng)的文件,并返回一個整數(shù)值。若告成地關(guān)閉了文件,那么返回一個0值,否那么返回一個非0值。常用以下方法舉行測試:

iffclosefp!=0

printfFilecannotbeclosed\n;

exit1;

else

printfFileisnowclosed\n;

當(dāng)開啟多個文件舉行操作,而又要同時關(guān)閉時,可采用fcloseall函數(shù),它將關(guān)閉全體在程序中開啟的文件。

intfcloseall;

該函數(shù)將關(guān)閉全體已開啟的文件,將各文件緩沖區(qū)未裝滿的內(nèi)容寫到相應(yīng)的文件中去,接著釋放這些緩沖區(qū),并返回關(guān)閉文件的數(shù)目。如關(guān)閉了4個文件,那么當(dāng)執(zhí)行:

n=fcloseall;

時,n應(yīng)為4。

3.文件的讀寫

1.讀寫文件中字符的函數(shù)一次只讀寫文件中的一個字符:

intfgetcFILE*stream;

intfgetcharvoid;

intfputcintch,FILE*stream;

intfputcharintch;

intgetcFILE*stream;

intputcintch,FILE*stream;

其中fgetc函數(shù)將把由流指針指向的文件中的一個字符讀出,例如:

ch=fgetcfp;

將把流指針fp指向的文件中的一個字符讀出,并賦給ch,當(dāng)執(zhí)行fgetc函數(shù)時,若當(dāng)時文件指針指到文件尾,即遇到文件終止標(biāo)志EOF其對應(yīng)值為-1,該函數(shù)返回一個-1給ch,在程序中常用檢查該函數(shù)返回值是否為-1來判斷是否已讀到文件尾,從而抉擇是否持續(xù)。

#includestdio.h

main

FILE*fp;

chch;

iffp=fopenmyfile.tex,r==NULL

printffilecannotbeopened\n;

exit1;

whilech=fgetcfp!=EOFfputcch,stdout;

fclosefp;

該程序以只讀方式開啟myfile.txt文件,在執(zhí)行while循環(huán)時,文件指針每循環(huán)一次后移一個字符位置。用fgetc函數(shù)將文件指針指定的字符讀到ch變量中,然后用fputc函數(shù)在屏幕上顯示,當(dāng)讀到文件終止標(biāo)志EOF時,變關(guān)閉該文件。

上面的程序用到了fputc函數(shù),該函數(shù)將字符變量ch的值寫到流指針指定的文件中去,由于流指針用的是標(biāo)準(zhǔn)輸出顯示器的FILE指針stdout,故讀出的字符將在顯示器上顯示。又譬如:

fputcch,fp;

該函數(shù)執(zhí)行布局,將把ch表示的字符送到流指針fp指向的文件中去。

在TC中,putc等價于fput,getc等價于fgetc。

putcharc相當(dāng)于fputcc,stdout;getchar相當(dāng)于fgetcstdin。

留神,這里使用charch,其實是不科學(xué)的,由于結(jié)果判斷終止標(biāo)志時,是看ch!=EOF,而EOF的值為-1,這鮮明和char是不能對比的。所以,某些使用,我們都定義成intch。

2.讀寫文件中字符串的函數(shù)

char*fgetschar*string,intn,FILE*stream;

char*getschar*s;

intfprintfFILE*stream,char*format,variable-list;

intfputschar*string,FILE*stream;

intfscanfFILE*stream,char*format,variable-list;

其中fgets函數(shù)將把由流指針指定的文件中n-1個字符,讀到由指針stream指向的字符數(shù)組中去,例如:

fgetsbuffer,9,fp;

將把fp指向的文件中的8個字符讀到buffer內(nèi)存區(qū),buffer可以是定義的字符數(shù)組,也可以是動態(tài)調(diào)配的內(nèi)存區(qū)。

留神,fgets函數(shù)讀到\n就中斷,而不管是否達成數(shù)目要求。同時在讀取字符串的結(jié)果加上\0。

fgets函數(shù)執(zhí)行完以后,返回一個指向該串的指針。假設(shè)讀到文件尾或出錯,那么均返回一個空指針NULL,所以長用feof函數(shù)來測定是否到了文件尾或者是ferror函數(shù)來測試是否出錯,例如下面的程序用fgets函數(shù)讀test.txt文件中的第一行并顯示出來:

#includestdio.h

main

FILE*fp;

charstr[128];

iffp=fopentest.txt,r==NULL

printfcannotopenfile\n;

exit1;

while!feoffp

iffgetsstr,128,fp!=NULLprintf%s,str;

fclosefp;

gets函數(shù)執(zhí)行時,只要未遇到換行符或文件終止標(biāo)志,將一向讀下去。因此讀到什么時候為止,需要用戶舉行操縱,否那么可能造成存儲區(qū)的溢出。

fputs函數(shù)想指定文件寫入一個由string指向的字符串,\0不寫入文件。

fprintf和fscanf同printf和scanf函數(shù)類似,不同之處就是printf函數(shù)是想顯示器輸出,fprintf那么是向流指針指向的文件輸出;fscanf是從文件輸入。

C語言文件操作教程

下面程序是向文件test.dat里輸入一些字符:

#include

main

char*s=Thatsgoodnews;

inti=617;

FILE*fp;

fp=fopnetest.dat,w;/*建立一個文字文件只寫*/

fputsYourscoreofTOEFLis,fp;/*向所建文件寫入一串字符*/

fputc:,fp;/*向所建文件寫冒號:*/

fprintffp,%d\n,i;/*向所建文件寫一整型數(shù)*/

fprintffp,%s,s;/*向所建文件寫一字符串*/

fclosefp;

用DOS的TYPE命令顯示TEST.DAT的內(nèi)容如下所示:

屏幕顯示

YourscoreofTOEFLis:617

Thatsgoodnews

下面的程序是把上面的文件test.dat里的內(nèi)容在屏幕上顯示出來:

#include

main

char*s,m[20];

inti;

FILE*fp;

fp=fopentest.dat,r;/*開啟文字文件只讀*/

fgetss,24,fp;/*從文件中讀取23個字符*/

printf%s,s;

fscanffp,%d,i;/*讀取整型數(shù)*/

printf%d,i;

putcharfgetcfp;/*讀取一個字符同時輸出*/

fgetsm,17,fp;/*讀取16個字符*/

putsm;/*輸出所讀字符串*/

fclosefp;

getch;

運行后屏幕顯示:

YourscoreofTOEFLis:617

Thatsgoodnews

4.除掉和設(shè)置文件緩沖區(qū)

1.除掉文件緩沖區(qū)函數(shù):

intfflushFILE*stream;

intflushall;

fflush函數(shù)將除掉由stream指向的文件緩沖區(qū)里的內(nèi)容,常用于寫完一些數(shù)據(jù)后,立刻用該函數(shù)除掉緩沖區(qū),以免誤操作時,破壞原來的數(shù)據(jù)。

flushall將除掉全體開啟文件所對應(yīng)的文件緩沖區(qū)。

2.設(shè)置文件緩沖區(qū)函數(shù)

voidsetbufFILE*stream,char*buf;

voidsetvbufFILE*stream,char*buf,inttype,unsignedsize;

這兩個函數(shù)將使得開啟文件后,用戶可建立自己的文件緩沖區(qū),而不使用fopen函數(shù)開啟文件設(shè)定的默認(rèn)緩沖區(qū)。

對于setbuf函數(shù),buf指出的緩沖區(qū)長度由頭文件stdio.h中定義的宏BUFSIZE的值抉擇,缺省值為512字節(jié)。選中定buf為空時,setbuf函數(shù)將使的文件I/O不帶緩沖。而對setvbuf函數(shù),那么由malloc函數(shù)來調(diào)配緩沖區(qū)。參數(shù)size指領(lǐng)略緩沖區(qū)的長度務(wù)必大于0,而參數(shù)type那么表示了緩沖的類型,其值可以取如下值:

type值含義

_IOFBF文件全部緩沖,即緩沖區(qū)裝滿后,才能對文件讀寫

_IOLBF文件行緩沖,即緩沖區(qū)接收到一個換行符時,才能對文件讀寫

_IONBF文件不緩沖,此時疏忽buf,size的值,直接讀寫文件,不再經(jīng)過文件緩沖區(qū)緩沖

5.文件的隨機讀寫函數(shù)

前面介紹的文件的字符/字符串讀寫,均是舉行文件的依次讀寫,即總是從文件的開頭開頭舉行讀寫。這鮮明不能得志我們的要求,C語言供給了移動文件指針和隨機讀寫的.函數(shù),它們是:

1.移動文件指針函數(shù):

longftellFILE*stream;

intrewindFILE*stream;

fseekFILE*stream,longoffset,intorigin;

函數(shù)ftell用來得到文件指針離文件開頭的偏移量。當(dāng)返回值是-1時表示出錯。

rewind函數(shù)用于文件指針移到文件的開頭,當(dāng)移動告成時,返回0,否那么返回一個非0值。

fseek函數(shù)用于把文件指針以origin為起點移動offset個字節(jié),其中origin指出的位置可有以下幾種:

origin數(shù)值代表的概括位置

SEEK_SET0文件開頭

SEEK_CUR1文件指針當(dāng)前位置

SEEK_END2文件尾

例如:

fseekfp,10L,0;

把文件指針從文件開頭移到第10字節(jié)處,由于offset參數(shù)要求是長整型數(shù),故其數(shù)后帶L。

fseekfp,-15L,2;

把文件指針從文件尾向前移動15字節(jié)。

2.文件隨機讀寫函數(shù)

intfreadvoid*ptr,intsize,intnitems,FILE*stream;

intfwritevoid*ptr,intsize,intnitems,FILE*stream;

fread函數(shù)從流指針指定的文件中讀取nitems個數(shù)據(jù)項,每個數(shù)據(jù)項的長度為size個字節(jié),讀取的nitems數(shù)據(jù)項存入由ptr指針指向的內(nèi)存緩沖區(qū)中,在執(zhí)行fread函數(shù)時,文件指針隨著讀取的字節(jié)數(shù)而向后移動,結(jié)果移動終止的位置等于實際讀出的字節(jié)數(shù)。該函數(shù)執(zhí)行終止后,將返回實際讀出的數(shù)據(jù)項數(shù),這個數(shù)據(jù)項數(shù)不確定等于設(shè)置的nitems,由于若文件中沒有足夠的數(shù)據(jù)項,或讀中間出錯,都會導(dǎo)致返回的數(shù)據(jù)項數(shù)少于設(shè)置的nitems。當(dāng)返回數(shù)不等于nitems時,可以用feof或ferror函數(shù)舉行檢查。

fwrite函數(shù)從ptr指向的緩沖區(qū)中取出長度為size字節(jié)的nitems個數(shù)據(jù)項,寫入到流指針stream指向的文件中,執(zhí)行該操作后,文件指針將向后移動,移動的字節(jié)數(shù)等于寫入文件的字節(jié)數(shù)目。該函數(shù)操作完成后,也將返回寫入的數(shù)據(jù)項數(shù)。

二、非標(biāo)準(zhǔn)文件的讀寫

這類函數(shù)最早用于UNIX操作系統(tǒng),ANSI標(biāo)準(zhǔn)未定義,但有時也經(jīng)常用到,DOS3.0以上版本支持這些函數(shù)。它們的頭文件為io.h。

由于我們不常用這些函數(shù),所以在這里就簡樸說一下。

1.文件的開啟和關(guān)閉

open函數(shù)的作用是開啟文件,其調(diào)用格式為:

intopenchar*filename,intaccess;

該函數(shù)表示按access的要求開啟名為filename的文件,返回值為文件描述字,其中access有兩片面內(nèi)容:

根本模式和修飾符,兩者用或方式連接。修飾符可以有多個,但根本模式只能有一個。

access的規(guī)定

根本模式含義修飾符含義

O_RDONLY只讀O_APPEND文件指針指向末尾

O_WRONLY只寫O_CREA

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論