一文詳解C語(yǔ)言中文件相關(guān)函數(shù)的使用_第1頁(yè)
一文詳解C語(yǔ)言中文件相關(guān)函數(shù)的使用_第2頁(yè)
一文詳解C語(yǔ)言中文件相關(guān)函數(shù)的使用_第3頁(yè)
一文詳解C語(yǔ)言中文件相關(guān)函數(shù)的使用_第4頁(yè)
一文詳解C語(yǔ)言中文件相關(guān)函數(shù)的使用_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第一文詳解C語(yǔ)言中文件相關(guān)函數(shù)的使用目錄一、文件和流1、程序文件2、數(shù)據(jù)文件3、流二、文件組成三、文件的打開和關(guān)閉1、文件的打開fopen2、文件關(guān)閉fclose四、文件的順序讀寫1、使用fputc和fgetc寫入/讀取單個(gè)字符2、使用fputs和fgets寫入/讀取一串字符3、使用fprintf和fscanf按照指定的格式寫入/讀取4、使用fwrite和fread按照二進(jìn)制的方式寫入/讀取5、使用sprintf和sscanf將格式化數(shù)據(jù)和字符串互相轉(zhuǎn)換(文件無(wú)關(guān))五、文件的隨機(jī)讀寫1、fseek(指定文件指針的位置)2、ftell(求文件指針與起始位置的偏移量)3、rewind(讓文件指針回到起始位置)六、文本文件和二進(jìn)制文件的區(qū)別七、文件讀取結(jié)束的標(biāo)志八、文件緩沖區(qū)

一、文件和流

1、程序文件

包括源程序文件(后綴為.c)

目標(biāo)文件(windows環(huán)境后綴為.obj)

可執(zhí)行程序(windows環(huán)境后綴為.exe)

2、數(shù)據(jù)文件

文件的內(nèi)容不一定是程序,而是程序運(yùn)行時(shí)讀寫的數(shù)據(jù),比如程序運(yùn)行需要從中讀取數(shù)據(jù)的文件,或者輸出內(nèi)容的文件。

3、流

任何一個(gè)C程序,運(yùn)行起來(lái)就會(huì)默認(rèn)打開3個(gè)流

1、FILE*stdin(標(biāo)準(zhǔn)輸入流,鍵盤)

2、FILE*stdout(標(biāo)準(zhǔn)輸出流,顯示器)

3、FILE*stderr(標(biāo)準(zhǔn)錯(cuò)誤流,顯示器)

流可以理解為輸入/輸出緩沖區(qū)

二、文件組成

每個(gè)被使用的文件都在內(nèi)存中開辟了一個(gè)相應(yīng)的文件信息區(qū),用來(lái)存放文件的相關(guān)信息(如文件的名字,文件狀態(tài)及文件當(dāng)前的位置等)。這些信息是保存在一個(gè)結(jié)構(gòu)體變量中的。該結(jié)構(gòu)體類型是由系統(tǒng)聲明的,取名FILE

FILE*就是文件指針類型,可以通過(guò)文件指針找到它指向的文件信息區(qū)(FILE類型的結(jié)構(gòu)體),文件信息區(qū)用于維護(hù)一個(gè)文件(每個(gè)文件都是獨(dú)立的文件信息區(qū))

三、文件的打開和關(guān)閉

1、文件的打開fopen

filename是文件名

mode是文件打開方式

文件打開方式含義如果指定文件不存在r(只讀)為了輸入數(shù)據(jù),打開一個(gè)已經(jīng)存在的文本文件出錯(cuò)w(只寫)為了輸出數(shù)據(jù),打開一個(gè)文本文件建立一個(gè)新的文件a(追加)向文本文件尾添加數(shù)據(jù)建立一個(gè)新的文件rb(只讀)為了輸入數(shù)據(jù),打開一個(gè)二進(jìn)制文件出錯(cuò)wb(只寫)為了輸出數(shù)據(jù),打開一個(gè)二進(jìn)制文件建立一個(gè)新的文件ab(追加)向一個(gè)二進(jìn)制文件尾添加數(shù)據(jù)出錯(cuò)r+(讀寫)為了讀和寫,打開一個(gè)文本文件出錯(cuò)w+(讀寫)為了讀和寫,新建一個(gè)文本文件建立一個(gè)新的文件a+(讀寫)打開一個(gè)文件,在文件尾進(jìn)行讀寫建立一個(gè)新的文件rb+(讀寫)為了讀和寫打開一個(gè)二進(jìn)制文件出錯(cuò)wb+(讀寫)為了讀和寫,新建一個(gè)新的二進(jìn)制文件建立一個(gè)新的文件ab+(讀寫)打開一個(gè)二進(jìn)制文件,在文件尾進(jìn)行讀和寫建立一個(gè)新的文件

2、文件關(guān)閉fclose

stream是文件指針,文件使用完后一定要fclose關(guān)閉,并把文件指針置空。(用起來(lái)像free)

intmain()

FILE*pf=fopen("text.txt","r");//文件路徑可以是相對(duì)路徑或絕對(duì)路徑

if(pf==NULL)

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

exit(-1);

fclose(pf);//不關(guān)閉文件可能會(huì)造成數(shù)據(jù)丟失

pf=NULL;

return0;

四、文件的順序讀寫

字符輸入函數(shù)fgetc所有輸入流字符輸出函數(shù)fputc所有輸出流文本行輸入函數(shù)fgets所有輸入流文本行輸出函數(shù)fputs所有輸出流格式化輸入函數(shù)fscanf所有輸入流格式化輸出函數(shù)fprintf所有輸出流二進(jìn)制輸入fread文件二進(jìn)制輸出fread文件

1、使用fputc和fgetc寫入/讀取單個(gè)字符

寫入單個(gè)字符到文件

character:要寫入的字符

stream:指向輸出流FILE對(duì)象的指針。

intmain()

FILE*pf=fopen("text.txt","w");//文件路徑可以是相對(duì)路徑或絕對(duì)路徑

if(pf==NULL)

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

//perror("fopen");//voidperror(constchar*str)用來(lái)將上一個(gè)函數(shù)發(fā)生錯(cuò)誤的原因輸出到標(biāo)準(zhǔn)設(shè)備(stderr)

exit(-1);

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

fputc(i,pf);//輸出

fclose(pf);

pf=NULL;

}

讀取文件中的單個(gè)字符

stream:指向輸入流FILE對(duì)象的指針。

intmain()

pf=fopen("text.txt","r");//文件路徑可以是相對(duì)路徑或絕對(duì)路徑

if(pf==NULL)

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

exit(-1);

printf("%c\n",fgetc(pf));//輸入,也可以寫一個(gè)循環(huán)讀取

printf("%c\n",fgetc(pf));

printf("%c\n",fgetc(pf));

printf("%c\n",fgetc(pf));

printf("%c\n",fgetc(pf));

fclose(pf);

pf=NULL;

return0;

}

2、使用fputs和fgets寫入/讀取一串字符

寫入一串字符到文件

str:要寫入的字符串的地址

stream:指向輸出流FILE對(duì)象的指針。

intmain()

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

if(pf==NULL)

perror("fopen:");

exit(-1);

chararr[]="abcde";//text.txt文件被寫入abcde

fputs(arr,pf);

fclose(pf);

pf=NULL;

return0;

}

讀取文件中num個(gè)字符

str:讀到的字符串放到str指向的空間里去

num:讀取的字符串個(gè)數(shù)

stream:指向輸入流FILE對(duì)象的指針。

讀取成功:返回str的地址

讀取失敗或錯(cuò)誤:返回空指針

監(jiān)視發(fā)現(xiàn),我們從文件中讀取5個(gè)字符,實(shí)際只讀了4個(gè),最后一個(gè)補(bǔ)了\0

3、使用fprintf和fscanf按照指定的格式寫入/讀取

stream:指向輸出流FILE對(duì)象的指針。

后續(xù)參數(shù)使用方法與printf一樣

structS

charname[20];

inttele;

floatscores;

intmain()

structSs={"zhangsan",1510,66.5f};

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

if(pf==NULL)

perror("fopen:");

exit(-1);

fprintf(pf,"%s%d%f",,s.tele,s.scores);//打印到txt文件

fprintf(stdout,"%s%d%f",,s.tele,s.scores);//打印到屏幕

fclose(pf);

pf=NULL;

return0;

}

stream:指向輸入流FILE對(duì)象的指針。

后續(xù)參數(shù)使用方法和scanf一樣

structS

charname[20];

inttele;

floatscores;

intmain()

structSs={0};

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

if(pf==NULL)

perror("fopen:");

exit(-1);

fscanf(pf,"%s%d%f",,s.tele,s.scores);//將文件中的內(nèi)容讀取到結(jié)構(gòu)體中

printf("%s%d%f",,s.tele,s.scores);

fclose(pf);

pf=NULL;

return0;

}

4、使用fwrite和fread按照二進(jìn)制的方式寫入/讀取

ptr:從ptr指向的當(dāng)前位置開始寫入

size:每個(gè)元素的大小

count:要寫入的元素個(gè)數(shù)

stream:指向輸出流FILE對(duì)象的指針。

structS

charname[20];

inttele;

floatscores;

intmain()

structSs={"zhangsan",1510,66.5f};

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

if(pf==NULL)

perror("fopen:");

exit(-1);

fwrite(s,sizeof(structS),1,pf);

fclose(pf);

pf=NULL;

return0;

}

fread參數(shù)和fwrite一樣

ptr:從ptr指向的當(dāng)前位置開始讀取

structS

charname[20];

inttele;

floatscores;

intmain()

structSs={0};

FILE*pf=fopen("text.txt","rb");

if(pf==NULL)

perror("fopen:");

exit(-1);

fread(s,sizeof(structS),1,pf);

printf("%s%d%f",,s.tele,s.scores);

fclose(pf);

pf=NULL;

return0;

}

5、使用sprintf和sscanf將格式化數(shù)據(jù)和字符串互相轉(zhuǎn)換(文件無(wú)關(guān))

將格式化數(shù)據(jù)轉(zhuǎn)換為字符串

str:將格式化數(shù)據(jù)放到目標(biāo)地址

后續(xù)參數(shù)和使用方式和printf一樣

structS

charname[20];

inttele;

floatscores;

intmain()

structSs={"zhangsan",1510,66.5f};

chararr[60]={0};

sprintf(arr,"%s%d%f",,s.tele,s.scores);

printf("%s",arr);

return0;

}

將字符串轉(zhuǎn)換為格式化數(shù)據(jù)

s:指向字符串的指針

后續(xù)參數(shù)和使用方式和scanf一樣

structS

charname[20];

inttele;

floatscores;

intmain()

structSs={0};

chararr[60]={"zhangsan151066.5f"};

sscanf(arr,"%s%d%f",,s.tele,s.scores);

printf("%s%d%f",,s.tele,s.scores);

return0;

五、文件的隨機(jī)讀寫

1、fseek(指定文件指針的位置)

注意:每次文件讀取完畢后,文件指針++

stream:指向標(biāo)識(shí)流的FILE對(duì)象的指針

offset:指針偏移量

origin:指針起始點(diǎn),如下圖:

SEEK_SET文件開頭SEEK_CUR文件指針的當(dāng)前所處的位置SEEK_END文件結(jié)尾

intmain()

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

if(pf==NULL)

perror("fopen:");

exit(-1);

fputs("abcde",pf);

fseek(pf,2,SEEK_SET);

intch=fgetc(pf);//該語(yǔ)句執(zhí)行完畢后,指針++,指向d

printf("%c",ch);//打印c

fseek(pf,0,SEEK_CUR);

ch=fgetc(pf);//該語(yǔ)句執(zhí)行完畢后,指針++,指向e

printf("%c",ch);//打印d

fseek(pf,-1,SEEK_END);//這里SEEK_END是指向e的后一個(gè)

ch=fgetc(pf);//該語(yǔ)句執(zhí)行完畢后,指針++,指向e的后一個(gè)

printf("%c",ch);//打印e

fclose(pf);

pf=NULL;

return0;

}

2、ftell(求文件指針與起始位置的偏移量)

intmain()

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

if(pf==NULL)

perror("fopen:");

exit(-1);

fputs("abcde",pf);

fseek(pf,-1,SEEK_END);//這里SEEK_END是指向e的后一個(gè)

intch=fgetc(pf);//該語(yǔ)句執(zhí)行完畢后,指針++,指向e的后一個(gè)

printf("%c",ch);//打印e

printf("%d",ftell(pf));//打印5,當(dāng)前指針在e的后一個(gè),相對(duì)于a

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論