C課件第9章文件_第1頁
C課件第9章文件_第2頁
C課件第9章文件_第3頁
C課件第9章文件_第4頁
C課件第9章文件_第5頁
已閱讀5頁,還剩85頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C

語言程序設(shè)計第

9

章文件煙臺大學(xué)計算機學(xué)院1C語言程序設(shè)計第9章文件煙臺大學(xué)計算機學(xué)院1第9章文件9.1文件的概念9.2文本文件的讀寫9.3二進制文件的讀寫2022/12/102第9章文件9.1文件的概念2022/12/102文件:存儲在外部存儲介質(zhì)上相關(guān)數(shù)據(jù)的集合。 例如:程序文件中保存著程序,數(shù)據(jù)文件中保存著數(shù)據(jù)。 *.C C語言的源程序 文本文件 *.OBJ 目標(biāo)文件 二進制文件 *.EXE 可執(zhí)行文件 二進制文件文件的存儲特性

文件是一個有序的數(shù)據(jù)序列。C語言把文件作為一個字符(字節(jié))序列處理,對文件的存取是以字符(字節(jié))為單位進行的。

9.1文件的概述9.1.1文件和文件指針1.什么是文件

2022/12/103文件:存儲在外部存儲介質(zhì)上相關(guān)數(shù)據(jù)的集合。9.1文件的概述按文件存儲數(shù)據(jù)的形式ASCII文件(或稱文本文件)

ASCII碼文件中每個字節(jié)存放一個ASCII代碼,代表一個字符,此種存儲形式便于輸出顯示,在DOS操作系統(tǒng)下可以直接閱讀。二進制文件

二進制文件中的數(shù)據(jù)是按照在內(nèi)存中的二進制存儲格式存放的,此種存儲形式節(jié)省存儲單元。二進制文件在DOS操作系統(tǒng)下不能直接閱讀。9.1文件的概述9.1.1文件和文件指針2.文件的種類

2022/12/104按文件存儲數(shù)據(jù)的形式9.1文件的概述9.1.1文件和文件例如將整數(shù)1949分別存儲在這兩種數(shù)據(jù)文件中。ASCII文件:ASCII碼二進制文件:補碼占用4個字節(jié)占用2個字節(jié)9.1文件的概述9.1.1文件和文件指針2.文件的種類

2022/12/105例如將整數(shù)1949分別存儲在這兩種數(shù)據(jù)文件中。ASCII文件按照對文件的處理方式緩沖文件

利用緩沖文件系統(tǒng)處理的文件稱為緩沖文件。系統(tǒng)處理方法是在內(nèi)存中為每個正在使用的緩沖文件開辟一個緩沖區(qū),其大小是512個字節(jié)?,F(xiàn)在的標(biāo)準(zhǔn)C對文件讀寫大都采用緩沖文件系統(tǒng)處理。非緩沖文件利用非緩沖文件系統(tǒng)處理的文件稱為非緩沖文件。系統(tǒng)處理非緩沖文件時,不為文件開辟緩沖區(qū),需要程序員自行設(shè)計并管理緩沖區(qū)。9.1文件的概述9.1.1文件和文件指針2.文件的種類

2022/12/106按照對文件的處理方式9.1文件的概述9.1.1文件和文件

系統(tǒng)對文件的處理過程就是對文件進行輸入/輸出操作的過程。從文件讀數(shù)據(jù)時,先一次性從磁盤文件中讀取一批數(shù)據(jù)到緩沖區(qū),然后再從緩沖區(qū)逐個將數(shù)據(jù)送入變量。向文件寫數(shù)據(jù)時,也是先將變量中數(shù)據(jù)送到緩沖區(qū),待緩沖區(qū)裝滿后,再一起存到磁盤文件中。9.1文件的概述9.1.1文件和文件指針3.緩沖文件和文件指針

磁盤文件

輸出

輸入圖10.2系統(tǒng)對緩沖文件的處理

輸入輸出程序區(qū)數(shù)據(jù)區(qū)文件

緩沖區(qū)外存內(nèi)存2022/12/107系統(tǒng)對文件的處理過程就是對文件進行輸入/輸出操作的9.1文件的概述3文件類型指針

在緩沖文件系統(tǒng)中,對每個正在使用的文件都自動分配一個FILE類型的結(jié)構(gòu)體變量,用于存放文件的有關(guān)信息,如文件號、文件狀態(tài)、緩沖區(qū)地址和大小等。

C系統(tǒng)已經(jīng)在“stdio.h”頭文件中按格式進行了定義typedefstruct{intfd; /*文件描述符*/intcleft; /*緩沖區(qū)中剩下的字符*/intmode; /*文件操作模式*/char*nextc; /*下一個字符位置*/char*buff; /*文件緩沖區(qū)位置*/}FILE;2022/12/1089.1文件的概述3文件類型指針C系統(tǒng)已經(jīng)在“stdio.在C語言中,無論對磁盤文件操作,還是對設(shè)備文件的讀/寫都要通過FILE類型的結(jié)構(gòu)體變量進行。因此對于每個使用中的磁盤文件必須先定義一個FILE類型的文件指針變量。文件型指針的定義格式如下:

FILE*文件指針變量名;例:FILE*fp1;或FILE*fp[5];

9.1文件的概述9.1.1文件和文件指針2022/12/109在C語言中,無論對磁盤文件操作,還是對設(shè)備文件的讀/寫都要通常用的調(diào)用形式:

FILE

*fp;fp=fopen(文件名,文件使用方式);

文件名:需要打開的文件名稱(字符串)。

文件使用方式:是具有特定含義的符號。9.1文件的概述9.1.2文件的打開與關(guān)閉1.文件打開函數(shù)fopen(

)函數(shù)功能:

按指定的文件使用方式打開指定的文件。若文件打開成功,為該文件分配一個文件緩沖區(qū)和一個FILE類型變量,返回一個FILE類型指針;

若文件打開失敗,返回NULL。2022/12/1010常用的調(diào)用形式:9.1文件的概述9.1.2文件的打開文本文件的三種基本使用方式”r”:只讀方式打開一個已存在的文本文件。只能讀取數(shù)據(jù)。”w”:只寫方式打開一個文本文件。只能寫入數(shù)據(jù)。若文件不存在,則自動建立一個新文件接收寫入的數(shù)據(jù);若文件已存在,則刪除舊文件,建立一個同名的新文件,接收寫入的數(shù)據(jù)?!盿”:追加方式打開一個已存在的文本文件。只能寫入數(shù)據(jù)并追加在文件尾部。9.1文件的概述9.1.2文件的打開與關(guān)閉2022/12/1011文本文件的三種基本使用方式9.1文件的概述文件的概述9.1.2文本文件的使用方式”r+”:讀寫方式打開一個已存在的文本文件。可以讀取數(shù)據(jù)。也可以寫入數(shù)據(jù)?!眞+”:讀寫方式打開一個已存在的文本文件。可以讀取數(shù)據(jù)。也可以寫入數(shù)據(jù)。若文件不存在,則自動建立一個新文件接收寫入的數(shù)據(jù);若文件存在,則刪除舊文件,建立一個同名的新文件,接收寫入的數(shù)據(jù)?!盿+”:讀寫方式打開一個已存在的文本文件??梢宰x取數(shù)據(jù)。也可以追加在文件尾部。2022/12/10129.1文件的概述9.1.2文本文件的使用方式”r+”rb”:讀寫方式打開一個已存在的二進制文件。只能讀取數(shù)據(jù)?!眞b”:只寫方式打開一個二進制文件。只能寫入數(shù)據(jù)。若文件不存在,則自動建立一個新文件接收寫入的數(shù)據(jù);若文件已存在,則刪除舊文件,建立一個同名的新文件,接收寫入的數(shù)據(jù)?!盿b”:追加方式打開一個已存在的二進制文件。只能寫入數(shù)據(jù)并追加在文件尾部。9.1.2文本文件的使用方式2022/12/1013”rb”:讀寫方式9.1.2文本文件的使用方式2022/1二進制文件的三種基本使用方式”rb+”:打開一個已存在的二進制文件。可以讀取數(shù)據(jù)。也可以寫入數(shù)據(jù)?!眞b+”:讀寫方式打開一個二進制文件??梢宰x取數(shù)據(jù)。也可以寫入數(shù)據(jù)。若文件不存在,則自動建立一個新文件接收寫入的數(shù)據(jù);若文件存在,則刪除舊文件,建立一個同名的新文件,接收寫入的數(shù)據(jù)?!盿b+”:讀寫方式打開一個已存在的二進制文件??梢宰x取數(shù)據(jù)。也可以追加數(shù)據(jù)到文件尾部。9.1文件的概述9.1.2文件的打開與關(guān)閉2022/12/1014二進制文件的三種基本使用方式9.1文件的概述文件的概述9.1.2文件的打開與關(guān)閉操作文件的一般步驟

打開文件

讀寫文件

關(guān)閉文件打開文件:建立用戶程序與文件的聯(lián)系,為文件分

配一個文件緩沖區(qū)。讀寫文件:是指對文件的讀、寫、追加和定位操作。關(guān)閉文件:切斷文件與程序的聯(lián)系,釋放文件緩沖

區(qū)。C語言的輸入輸出函數(shù)庫中提供了大量的函數(shù),用于完成對數(shù)據(jù)文件的建立、數(shù)據(jù)的讀寫、數(shù)據(jù)的追加等操作。在程序中調(diào)用這些函數(shù)時,必須先用include命令包含stdio.h文件。

2022/12/10159.1文件的概述9.1.2文件的打開與關(guān)閉操作文件的一般

標(biāo)準(zhǔn)文件是外部設(shè)備中的三個特殊的設(shè)備文件。它們的文件指針是系統(tǒng)定義的,并由系統(tǒng)自動打開和關(guān)閉。這三個標(biāo)準(zhǔn)文件分別是:①標(biāo)準(zhǔn)輸入文件,文件指針為stdin,系統(tǒng)指定為鍵盤。②標(biāo)準(zhǔn)輸出文件,文件指針為stdout,系統(tǒng)指定為顯示器。③標(biāo)準(zhǔn)錯誤輸出文件,文件指針為stderr,系統(tǒng)指定為顯示器,輸出錯誤信息。9.1文件的概述9.1.1文件和文件指針4.標(biāo)準(zhǔn)文件

2022/12/1016 標(biāo)準(zhǔn)文件是外部設(shè)備中的三個特殊的設(shè)備文件。它們的文檢查文件打開操作是否成功if((fp=fopen("filename","r"))==NULL){printf(”Cannotopenfile.\n”);

exit(0); } 檢查以只讀方式打開文件名為filename的文件是否成功。

exit函數(shù)的作用:結(jié)束程序的執(zhí)行,并將實參0作為函數(shù)返回值傳給操作系統(tǒng)。

9.1文件的概述9.1.2文件的打開與關(guān)閉2022/12/1017檢查文件打開操作是否成功9.1文件的概述9.1.2常用的調(diào)用形式:

FILE

*fp;fclose(fp);fp:已經(jīng)打開的文件指針。9.1文件的概述9.1.2文件的打開與關(guān)閉2.文件關(guān)閉函數(shù)fclose(

)函數(shù)功能:關(guān)閉fp指定的文件,釋放該文件的緩沖區(qū)、FILE類型變量及文件指針。若文件關(guān)閉成功,則返回0;若文件關(guān)閉失敗,則返回非0值。2022/12/1018常用的調(diào)用形式:9.1文件的概述9.1.2文件的打開FILE*fp;/**/┆if((fp=fopen("文件名","文件使用方式"))==NULL)/**/{printf("filecannotopen!\n");/**/exit(0);/**/}┆/**/fclose(fp);/**/}2022/12/1019FILE*fp;/**/2022/常用的調(diào)用形式:

FILE

*fp;fputc(ch,fp);

ch:需要輸出的字符,可以是字符常量或字符變量;fp:文件指針變量。對文本文件的讀寫操作,必須按文件中字符的先后順序進行,只能在操作了第i個字符之后,才能操作第i+1個字符。在對文件操作時,文件的讀寫指針由系統(tǒng)自動向后移動。9.2文本文件的讀寫9.2.1文件的字符輸入輸出函數(shù)1.字符輸出函數(shù)fputc(

)(或putc(

))函數(shù)功能:

將一個字符(ASCII碼)寫入到fp所指向的文件(該文件必須是以寫或讀寫方式打開的)中。若輸出操作成功,函數(shù)返回寫入的字符;否則,返回EOF。系統(tǒng)定義的文本文件結(jié)束標(biāo)志,其值為(-1)。

①putc函數(shù)與fputc函數(shù)的功能相同。在stdio.h文件中被定義為#defineputc(c,f)fputc((c),f)②標(biāo)準(zhǔn)文件中用的putchar函數(shù)是fputc函數(shù)的特殊用法,它在stdio.h文件中被定義為#defineputchar(c)putc((c),stdout)2022/12/1020常用的調(diào)用形式:對文本文件的讀寫操作,必須按文件中字常用的調(diào)用形式:

FILE

*fp;

ch

=fgetc(fp);

ch:可以是字符變量或整型變量;fp:文件指針變量。9.2文本文件的讀寫9.2.1文件的字符輸入輸出函數(shù)2.字符輸入函數(shù)fgetc(

)(或getc(

))函數(shù)功能:從fp所指向的文件(該文件必須是以讀或讀寫方式打開的)中讀取一個字符。若輸入操作成功,函數(shù)返回讀入的字符;若文件結(jié)束或輸入操作失敗,則返回EOF。

①getc函數(shù)與fgetc函數(shù)的功能相同。在stdio.h文件中被定義為#definegetc(f)fgetc(f)②標(biāo)準(zhǔn)文件中用的getchar函數(shù)是fgetc函數(shù)的特殊用法,它在stdio.h文件中被定義為#definegetchar()getc(stdin)2022/12/1021常用的調(diào)用形式:9.2文本文件的讀寫9.2.1文件的【例9.1】利用fputc和fgetc函數(shù)建立一個文本文件,并顯示文件中的內(nèi)容。#include<stdio.h>main(){FILE*fp;/*定義一個文件指針變量fp*/intc;/*c為存放字符的變量*/charfilename[40];/*filename用于存放數(shù)據(jù)文件名*/printf("filename:");/*提示輸入磁盤文件名*/gets(filename);

if((fp=fopen(filename,"w"))==NULL){printf("Can'topenthe%s\n",filename);exit(0);}9.2文本文件的讀寫9.2.1文件的字符輸入輸出函數(shù)測試打開文件是否成功2022/12/1022【例9.1】利用fputc和fgetc函數(shù)建立一個文本文件,while((c=getchar())!=EOF)/*鍵盤文件結(jié)束標(biāo)志:輸入Ctrl+z,顯示^Z后回車*/putc(c,fp);/*將鍵盤輸入的字符寫到文件中*/fclose(fp);/*建立文件結(jié)束,關(guān)閉文件*/printf("outfile:\n");fp=fopen(filename,"r");/*以讀方式打開文本文件*/while((c=getc(fp))!=EOF)/*未讀到文件結(jié)束標(biāo)志時*/putchar(c);/*在顯示器顯示讀出的字符*/fclose(fp);/*讀文件結(jié)束,關(guān)閉文件*/}9.2文本文件的讀寫9.2.1文件的字符輸入輸出函數(shù)2022/12/1023while((c=getchar())!=EOF)9.2常用的調(diào)用形式:

FILE

*fp;

feof(fp);

fp:文件指針變量。9.2文本文件的讀寫9.2.2文件結(jié)束測試函數(shù)函數(shù)功能:測試fp所指向的文件是否已讀到文件尾部。若該文件沒有結(jié)束,則返回0;若文件結(jié)束,則返回非0值。對文本文件進行讀操作時,例如fgetc(

)返回EOF,即可作文件結(jié)束處理。但在二進制文件中-1是合法數(shù)據(jù),所以系統(tǒng)提供了一個適用對象更普遍的文件結(jié)束測試函數(shù)feof。2022/12/1024常用的調(diào)用形式:9.2文本文件的讀寫9.2.2文件結(jié)例如:復(fù)制一個磁盤文件。#include<stdio.h>main(

){FILE*infp,*outfp;charinfile[40],outfile[40];intch;printf("inputfilename:");scanf("%s",infile);printf("outputfilename:");scanf("%s",outfile);if((infp=fopen(infile,"r"))==NULL)

/*打開源文件*/{ printf("infileopenerror.\n");exit(0);}if((outfp=fopen(outfile,"w"))==NULL)/*打開目標(biāo)文件*/{ printf("outfileopenerror.\n");exit(0);}ch=fgetc(infp);/*從源文件中讀一個字符*/while(!feof(infp))/*源文件未讀完*/

{fputc(ch,outfp);ch=fgetc(infp);}/*復(fù)制文件*/fclose(infp);fclose(outfp);}9.2文本文件的讀寫9.2.2文件結(jié)束測試函數(shù)2022/12/1025例如:復(fù)制一個磁盤文件。9.2文本文件的讀寫9.2.2常用的調(diào)用形式:

FILE*fp;

fputs(

str,

fp

);

str:需要輸出的字符串,可以是字符串常量或字符串指針;fp:文件指針變量。

fputs與puts函數(shù)的功能類似,它們的區(qū)別:puts函數(shù)能將字符串的結(jié)束標(biāo)志'\0'轉(zhuǎn)換成'\n'

輸出,因此字符串在顯示器輸出后,光標(biāo)移至下一行;而fputs函數(shù)對字符串結(jié)束標(biāo)志'\0'的處理僅僅是將其舍去。9.2文本文件的讀寫9.2.3文件的字符串輸入輸出函數(shù)1.字符串輸出函數(shù)fputs(

)函數(shù)功能:將字符串(不包括字符串結(jié)束標(biāo)志'\0')寫到文件指針fp所指向的文件中。若輸出操作成功,返回非0值;若輸出操作失敗,則返回0。2022/12/1026常用的調(diào)用形式:fputs與puts函數(shù)的功能類似常用的調(diào)用形式:

FILE*fp;

fgets(

str,

n,

fp

);

str:字符指針,可以是字符數(shù)組名或字符指針變量;n:讀取字符個數(shù)(n-1)。fp:文件指針變量。9.2文本文件的讀寫9.2.3文件的字符串輸入輸出函數(shù)2.字符串輸入函數(shù)fgets(

)函數(shù)功能:從fp所指向的文件中,讀取n-1個字符后,加上字符串結(jié)束標(biāo)志'\0'組成一個字符串,存入字符數(shù)組中。若輸入操作成功,返回字符數(shù)組的首地址;若文件結(jié)束或輸入操作失敗,則返回NULL。①

從文件讀取字符的過程中,如果讀到回車符('\15')舍去,如果讀到換行符('\12')仍按字符讀出,再加上'\0'

作為一個字符串,同時結(jié)束文本行讀取操作,函數(shù)正常返回。當(dāng)讀到文件結(jié)束時,直接加上'\0'作為一個字符串,函數(shù)正常返回。②

fgets與gets函數(shù)的區(qū)別:gets函數(shù)以換行符作為行結(jié)束標(biāo)志,并舍去換行符。fgets函數(shù)也以換行符作為行的讀結(jié)束標(biāo)志,但換行符同時還作為字符串的內(nèi)容。因此可將含有換行符的文本文件看作是由一行一行字符組成的。2022/12/1027常用的調(diào)用形式:9.2文本文件的讀寫9.2.3文件的【例9.3】應(yīng)用fputs和fgets函數(shù),建立和讀取文本文件。#include"stdio.h"#include"string.h"main(){FILE*fp;/*定義一個文件指針變量fp*/charfilename[40],str[81];printf("filename:");/*提示輸入磁盤文件名*/gets(filename);if((fp=fopen(filename,"w"))==NULL)/*

在磁盤中新建并打開一個文本文件,同時測試是否成功

*/{printf("Can'topenthe%s\n",filename);exit(0);}9.2文本文件的讀寫9.2.3文件的字符串輸入輸出函數(shù)2022/12/1028【例9.3】應(yīng)用fputs和fgets函數(shù),建立和讀取文本文while(strlen(gets(str))>0)/*鍵盤輸入空串(即僅輸入回車)則輸入全部結(jié)束*/{fputs(str,fp);/*將鍵盤輸入的字符串寫到文件中*/fputc('\n',fp);/*在文件中加入換行符作為字符串分隔符*/}fclose(fp);/*建立文件結(jié)束,關(guān)閉文件*/printf("outfile:\n");fp=fopen(filename,"r");/*以讀方式打開文本文件*/while((fgets(str,81,fp))!=NULL)/*從文件讀取字符串并測試文件是否已讀完*/printf("%s",str);/*將文件中讀取的字符串分行顯示*/fclose(fp);/*讀文件結(jié)束,關(guān)閉文件*/}9.2文本文件的讀寫9.2.3文件的字符串輸入輸出函數(shù)2022/12/1029while(strlen(gets(str))>0)9.與標(biāo)準(zhǔn)文件的格式輸入輸出函數(shù)scanf和printf相對應(yīng),文本文件也有格式輸入輸出函數(shù)fscanf和fprintf。它們的功能和格式基本相同,不同之處在于scanf和printf的讀寫對象是終端(鍵盤和顯示器),fscanf和fprintf的讀寫對象是磁盤文件。常用的調(diào)用形式:

FILE*fp;

fprintf(

fp,

格式控制串,輸出項參數(shù)表

);fp:文件指針變量。

格式控制串和輸出項參數(shù)表的規(guī)定和使用方法與printf函數(shù)相同。9.2文本文件的讀寫9.2.4文件的格式輸入輸出函數(shù)1.格式輸出函數(shù)fprintf(

)函數(shù)功能:將輸出項按指定格式寫入fp所指向的文件中。若輸出操作成功,返回寫入的字節(jié)數(shù);若輸出操作失敗,則返回EOF。2022/12/1030與標(biāo)準(zhǔn)文件的格式輸入輸出函數(shù)scanf和print常用的調(diào)用形式:

FILE*fp;

fscanf(

fp,

格式控制串,

地址表);

fp:文件指針變量。

格式控制串和地址表的規(guī)定和使用方法與scanf函數(shù)相同。9.2文本文件的讀寫9.2.4文件的格式輸入輸出函數(shù)2.格式輸入函數(shù)fscanf(

)函數(shù)功能:按格式控制串所描述的格式,從fp所指向的文件中讀取數(shù)據(jù),送到指定的內(nèi)存地址單元中。若輸入操作成功,返回實際讀出的數(shù)據(jù)項個數(shù),不包括數(shù)據(jù)分隔符。若沒有讀數(shù)據(jù)項,則返回0。若文件結(jié)束或調(diào)用失敗,則返回EOF。2022/12/1031常用的調(diào)用形式:9.2文本文件的讀寫9.2.4文件的

二進制文件存儲信息的形式與內(nèi)存中存儲信息的形式是一致的,如果需要在內(nèi)存與磁盤文件之間頻繁交換數(shù)據(jù),最好采用二進制文件。二進制文件一般是同類型數(shù)據(jù)集合,數(shù)據(jù)之間無分隔符,每個數(shù)據(jù)所占字節(jié)數(shù)是一個定值,因此二進制文件除了可以順序存取外,還可運用定位函數(shù)方便地進行隨機存取。常用的調(diào)用形式:

FILE*fp;

putw(

w,

fp

);

w:要輸出的整型數(shù)據(jù),可以是常量或變量。fp:文件指針變量。9.3二進制文件的讀寫9.3.1文件的字輸入輸出函數(shù)1.字輸出函數(shù)putw(

)函數(shù)功能:把整型數(shù)w寫入fp所指向的文件(以寫方式打開的二進制文件)。若輸出操作成功,返回w值;若輸出操作失敗,則返回EOF。由于EOF(-1)是一個合法的整數(shù),因此應(yīng)該用ferror函數(shù)檢測函數(shù)調(diào)用是否出錯。

2022/12/1032二進制文件存儲信息的形式與內(nèi)存中存儲信息的形式是一致常用的調(diào)用形式:

FILE*fp;

getw(

fp

);

fp:文件指針變量。9.3二進制文件的讀寫9.3.1文件的字輸入輸出函數(shù)2.字輸入函數(shù)getw(

)函數(shù)功能:從fp所指向的文件(以讀方式打開的二進制文件)中讀取一個整型數(shù)。若輸入操作成功,返回從文件中讀取的整數(shù)。若文件結(jié)束或調(diào)用失敗,則返回EOF。EOF(-1)是getw函數(shù)可能返回的合法值,所以應(yīng)該用feof函數(shù)或ferror函數(shù)檢測文件是否結(jié)束或調(diào)用失敗。

2022/12/1033常用的調(diào)用形式:9.3二進制文件的讀寫9.3.1文件常用的調(diào)用形式:

FILE*fp;

ferror(

fp

);

fp:文件指針變量。9.3二進制文件的讀寫9.3.1文件的字輸入輸出函數(shù)3.文件操作錯誤函數(shù)ferror(

)函數(shù)功能:檢測文件讀寫是否出錯。若出錯,則指示器置1,否則指示器置0。函數(shù)返回錯誤指示器值。說明:錯誤指示器若置1后,只有調(diào)用clearerr函數(shù)或

rewind函數(shù)才能將其清0。

2022/12/1034常用的調(diào)用形式:9.3二進制文件的讀寫9.3.1文件常用的調(diào)用形式:

FILE*fp;

clearerr(

fp

);

fp:文件指針變量。9.3二進制文件的讀寫9.3.1文件的字輸入輸出函數(shù)4.清除錯誤標(biāo)志函數(shù)clearerr(

)函數(shù)功能:將文件的錯誤指示器和文件結(jié)束指示器清0。該函數(shù)無返回值。

2022/12/1035常用的調(diào)用形式:9.3二進制文件的讀寫9.3.1文件【例9.5】應(yīng)用putw和getw函數(shù)建立二進制整型數(shù)據(jù)文件并讀取其中的數(shù)據(jù)。#include"stdio.h"main(){FILE*fp;/*定義一個文件指針變量fp*/charfilename[40];/*filename用于存放數(shù)據(jù)文件名*/inti,n1=5,n2,x[5]={10,22,36,48,59},y[5];printf("filename:");gets(filename);if((fp=fopen(filename,"wb"))==NULL)/*新建并打開一個二進制文件,并測試是否成功*/{printf("Can'topenthe%s\n",filename);exit(0);}9.3二進制文件的讀寫9.3.1文件的字輸入輸出函數(shù)2022/12/1036【例9.5】應(yīng)用putw和getw函數(shù)建立二進制整型數(shù)據(jù)文件putw(n1,fp);/*向二進制文件寫入一個整數(shù)*/for(i=0;i<n1;i++)putw(x[i],fp);/*將x數(shù)組的5個整數(shù)寫入二進制文件*/fclose(fp);/*建立文件結(jié)束,關(guān)閉文件*/printf("outfile:\n");

fp=fopen(filename,"rb");/*以讀方式打開二進制文件*/n2=getw(fp);/*從二進制文件讀取一個整數(shù)*/for(i=0;i<n2;i++){y[i]=getw(fp);/*從文件讀取一個整數(shù)賦給y數(shù)組元素*/printf("%d",y[i]);}printf("\n");fclose(fp);/*讀文件結(jié)束,關(guān)閉文件*/

}9.3二進制文件的讀寫9.3.1文件的字輸入輸出函數(shù)2022/12/1037putw(n1,fp);常用的調(diào)用形式:

fwrite(p,size,n,fp);

p:某類型指針;

size:某類型數(shù)據(jù)存儲空間的字節(jié)數(shù)(數(shù)據(jù)項大?。?/p>

n:此次寫入文件的數(shù)據(jù)項數(shù);fp:文件指針變量。9.3二進制文件的讀寫9.3.2文件的數(shù)據(jù)塊輸入輸出函數(shù)1.數(shù)據(jù)塊輸出函數(shù)fwrite(

)函數(shù)功能:將p指向的存儲區(qū)中n個數(shù)據(jù)項寫入fp所指向的文件。若輸出操作成功,返回寫入的數(shù)據(jù)項數(shù);若輸出操作失敗,則返回0。運用數(shù)據(jù)塊輸入輸出函數(shù)可建立整型、實型、結(jié)構(gòu)體類型等各種類型的二進制文件。

2022/12/1038常用的調(diào)用形式:9.3二進制文件的讀寫9.3.2文件常用的調(diào)用形式:

fread(p,size,n,fp);

p:某類型指針;

size:某類型數(shù)據(jù)存儲空間的字節(jié)數(shù)(數(shù)據(jù)項大?。?;

n:此次從文件中讀取的數(shù)據(jù)項數(shù);fp:文件指針變量。9.3二進制文件的讀寫9.3.2文件的數(shù)據(jù)塊輸入輸出函數(shù)2.數(shù)據(jù)塊輸入函數(shù)fread(

)函數(shù)功能:從fp所指向的文件中,讀取n個數(shù)據(jù)項,存放到p所指向的存儲區(qū)域。若輸入操作成功,返回實際讀出的數(shù)據(jù)項個數(shù)。若文件結(jié)束或調(diào)用失敗,則返回0。2022/12/1039常用的調(diào)用形式:9.3二進制文件的讀寫9.3.2文件【例9.6】應(yīng)用fwrite與fread函數(shù)建立一個存放學(xué)生電話簿的二進制數(shù)據(jù)文件并讀取其中的數(shù)據(jù)。#include"stdio.h"main(){FILE*fp;inti;charfilename[40];/*filename用于存放數(shù)據(jù)文件名*/structtel{charname[20],tel[9];}in[5],out[5];printf("filename:");gets(filename);if((fp=fopen(filename,"wb"))==NULL){printf("Can'topenthe%s\n",filename);exit(0);}9.3二進制文件的讀寫9.3.2文件的數(shù)據(jù)塊輸入輸出函數(shù)新建并打開一個二進制文件,并測試是否成功

2022/12/1040【例9.6】應(yīng)用fwrite與fread函數(shù)建立一個存放學(xué)生for(i=0;i<5;i++){printf("name:");gets(in[i].name);printf("tel:");gets(in[i].tel);}fwrite(in,sizeof(structtel),5,fp);/*文件中寫入5個學(xué)生的電話*/fclose(fp);/*建立文件結(jié)束,關(guān)閉文件*/printf("outfile:\n");

fp=fopen(filename,"rb");/*以讀方式打開二進制文件*/fread(out,sizeof(structtel),5,fp);/*從文件讀取5個結(jié)構(gòu)體數(shù)據(jù)*/printf("nametelephone\n");for(i=0;i<5;i++)printf("%-20s%-8s\n",out[i].name,out[i].tel);fclose(fp);/*讀文件結(jié)束,關(guān)閉文件*/}9.3二進制文件的讀寫2022/12/1041for(i=0;i<5;i++)9.3二進制文件的讀◆順序讀寫操作■在順序讀寫文件時,文件的讀寫指針由系統(tǒng)自動控制,每次讀寫操作后,系統(tǒng)都會將讀寫指針移到下一個數(shù)據(jù)的位置?!粑募x寫操作的內(nèi)部機制■文件的讀寫是通過文件系統(tǒng)內(nèi)部的“讀寫指針”進行的?!霎?dāng)打開一個文件時,系統(tǒng)自動為該文件分配的FILE結(jié)構(gòu)體變量中有一個讀寫指針成員,對該文件的讀寫操作均通過讀寫指針進行?!鰂open后讀寫指針指向文件中第1個(將要讀寫的)字節(jié)。

文件結(jié)束時,讀寫指針指向文件最后1個字節(jié)的后面。9.3二進制文件的讀寫9.3.3文件讀寫指針定位函數(shù)◆隨機讀寫操作

■通過改變文件讀寫指針的指向,可在文件的任意位置進行讀寫操作。2022/12/1042◆順序讀寫操作◆文件讀寫操作的內(nèi)部機制9.3二進制文件的常量標(biāo)識符值起始位置SEEK_SET0文件開始位置SEEK_CUR1文件讀寫指針當(dāng)前位置SEEK_END2文件結(jié)束位置函數(shù)功能:將文件讀寫指針從base標(biāo)識的位置移動offset個字節(jié),并將文件結(jié)束指示器清0。若移動成功,返回0;若移動失敗,則返回非0值。

常用的調(diào)用形式:

fseek(fp,offset,base);

fp:文件指針變量;

offset:位移量(字節(jié),長整型);

base:起始位置標(biāo)志。9.3二進制文件的讀寫9.3.3文件讀寫指針定位函數(shù)1.文件讀寫指針移動函數(shù)fseek(

)是正數(shù),文件讀寫指針向文件尾部方向移動;是負(fù)數(shù)向文件頭部移動

該函數(shù)僅適用于二進制文件。

fseek(fp,30,0)從文件開始位置向文件結(jié)束方向移動30個字節(jié)fseek(fp,-10,1) 從當(dāng)前位置向文件開始方向移動10個字節(jié)fseek(fp,-8,2)從文件結(jié)束位置向文件開始方向移動8個字節(jié)2022/12/1043常量標(biāo)識符值起始位置函數(shù)功能:常用的調(diào)用函數(shù)功能:將文件讀寫指針移到文件開始位置,并將文件結(jié)束指示器和錯誤指示器清0。該函數(shù)無返回值。常用的調(diào)用形式:

rewind(fp);

fp:文件指針變量;9.3二進制文件的讀寫9.3.3文件讀寫指針定位函數(shù)2.文件讀寫指針回繞函數(shù)rewind(

)該函數(shù)適用于二進制文件和文本文件。

2022/12/1044函數(shù)功能:常用的調(diào)用形式:9.3二進制文件的讀寫9.3函數(shù)功能:返回fp指向的文件中的讀寫指針當(dāng)前位置,即相對于文件開始處的位移量,單位是字節(jié)。若調(diào)用成功,則返回文件讀寫指針當(dāng)前值(長整型);若調(diào)用失敗,則返回-1L。常用的調(diào)用形式:

ftell(fp);

fp:文件指針變量;9.3二進制文件的讀寫9.3.3文件讀寫指針定位函數(shù)3.文件讀寫指針位置函數(shù)ftell(

)該函數(shù)適用于二進制文件和文本文件。

2022/12/1045函數(shù)功能:常用的調(diào)用形式:9.3二進制文件的讀寫9.3C

語言程序設(shè)計第

9

章文件煙臺大學(xué)計算機學(xué)院46C語言程序設(shè)計第9章文件煙臺大學(xué)計算機學(xué)院1第9章文件9.1文件的概念9.2文本文件的讀寫9.3二進制文件的讀寫2022/12/1047第9章文件9.1文件的概念2022/12/102文件:存儲在外部存儲介質(zhì)上相關(guān)數(shù)據(jù)的集合。 例如:程序文件中保存著程序,數(shù)據(jù)文件中保存著數(shù)據(jù)。 *.C C語言的源程序 文本文件 *.OBJ 目標(biāo)文件 二進制文件 *.EXE 可執(zhí)行文件 二進制文件文件的存儲特性

文件是一個有序的數(shù)據(jù)序列。C語言把文件作為一個字符(字節(jié))序列處理,對文件的存取是以字符(字節(jié))為單位進行的。

9.1文件的概述9.1.1文件和文件指針1.什么是文件

2022/12/1048文件:存儲在外部存儲介質(zhì)上相關(guān)數(shù)據(jù)的集合。9.1文件的概述按文件存儲數(shù)據(jù)的形式ASCII文件(或稱文本文件)

ASCII碼文件中每個字節(jié)存放一個ASCII代碼,代表一個字符,此種存儲形式便于輸出顯示,在DOS操作系統(tǒng)下可以直接閱讀。二進制文件

二進制文件中的數(shù)據(jù)是按照在內(nèi)存中的二進制存儲格式存放的,此種存儲形式節(jié)省存儲單元。二進制文件在DOS操作系統(tǒng)下不能直接閱讀。9.1文件的概述9.1.1文件和文件指針2.文件的種類

2022/12/1049按文件存儲數(shù)據(jù)的形式9.1文件的概述9.1.1文件和文件例如將整數(shù)1949分別存儲在這兩種數(shù)據(jù)文件中。ASCII文件:ASCII碼二進制文件:補碼占用4個字節(jié)占用2個字節(jié)9.1文件的概述9.1.1文件和文件指針2.文件的種類

2022/12/1050例如將整數(shù)1949分別存儲在這兩種數(shù)據(jù)文件中。ASCII文件按照對文件的處理方式緩沖文件

利用緩沖文件系統(tǒng)處理的文件稱為緩沖文件。系統(tǒng)處理方法是在內(nèi)存中為每個正在使用的緩沖文件開辟一個緩沖區(qū),其大小是512個字節(jié)?,F(xiàn)在的標(biāo)準(zhǔn)C對文件讀寫大都采用緩沖文件系統(tǒng)處理。非緩沖文件利用非緩沖文件系統(tǒng)處理的文件稱為非緩沖文件。系統(tǒng)處理非緩沖文件時,不為文件開辟緩沖區(qū),需要程序員自行設(shè)計并管理緩沖區(qū)。9.1文件的概述9.1.1文件和文件指針2.文件的種類

2022/12/1051按照對文件的處理方式9.1文件的概述9.1.1文件和文件

系統(tǒng)對文件的處理過程就是對文件進行輸入/輸出操作的過程。從文件讀數(shù)據(jù)時,先一次性從磁盤文件中讀取一批數(shù)據(jù)到緩沖區(qū),然后再從緩沖區(qū)逐個將數(shù)據(jù)送入變量。向文件寫數(shù)據(jù)時,也是先將變量中數(shù)據(jù)送到緩沖區(qū),待緩沖區(qū)裝滿后,再一起存到磁盤文件中。9.1文件的概述9.1.1文件和文件指針3.緩沖文件和文件指針

磁盤文件

輸出

輸入圖10.2系統(tǒng)對緩沖文件的處理

輸入輸出程序區(qū)數(shù)據(jù)區(qū)文件

緩沖區(qū)外存內(nèi)存2022/12/1052系統(tǒng)對文件的處理過程就是對文件進行輸入/輸出操作的9.1文件的概述3文件類型指針

在緩沖文件系統(tǒng)中,對每個正在使用的文件都自動分配一個FILE類型的結(jié)構(gòu)體變量,用于存放文件的有關(guān)信息,如文件號、文件狀態(tài)、緩沖區(qū)地址和大小等。

C系統(tǒng)已經(jīng)在“stdio.h”頭文件中按格式進行了定義typedefstruct{intfd; /*文件描述符*/intcleft; /*緩沖區(qū)中剩下的字符*/intmode; /*文件操作模式*/char*nextc; /*下一個字符位置*/char*buff; /*文件緩沖區(qū)位置*/}FILE;2022/12/10539.1文件的概述3文件類型指針C系統(tǒng)已經(jīng)在“stdio.在C語言中,無論對磁盤文件操作,還是對設(shè)備文件的讀/寫都要通過FILE類型的結(jié)構(gòu)體變量進行。因此對于每個使用中的磁盤文件必須先定義一個FILE類型的文件指針變量。文件型指針的定義格式如下:

FILE*文件指針變量名;例:FILE*fp1;或FILE*fp[5];

9.1文件的概述9.1.1文件和文件指針2022/12/1054在C語言中,無論對磁盤文件操作,還是對設(shè)備文件的讀/寫都要通常用的調(diào)用形式:

FILE

*fp;fp=fopen(文件名,文件使用方式);

文件名:需要打開的文件名稱(字符串)。

文件使用方式:是具有特定含義的符號。9.1文件的概述9.1.2文件的打開與關(guān)閉1.文件打開函數(shù)fopen(

)函數(shù)功能:

按指定的文件使用方式打開指定的文件。若文件打開成功,為該文件分配一個文件緩沖區(qū)和一個FILE類型變量,返回一個FILE類型指針;

若文件打開失敗,返回NULL。2022/12/1055常用的調(diào)用形式:9.1文件的概述9.1.2文件的打開文本文件的三種基本使用方式”r”:只讀方式打開一個已存在的文本文件。只能讀取數(shù)據(jù)。”w”:只寫方式打開一個文本文件。只能寫入數(shù)據(jù)。若文件不存在,則自動建立一個新文件接收寫入的數(shù)據(jù);若文件已存在,則刪除舊文件,建立一個同名的新文件,接收寫入的數(shù)據(jù)。”a”:追加方式打開一個已存在的文本文件。只能寫入數(shù)據(jù)并追加在文件尾部。9.1文件的概述9.1.2文件的打開與關(guān)閉2022/12/1056文本文件的三種基本使用方式9.1文件的概述文件的概述9.1.2文本文件的使用方式”r+”:讀寫方式打開一個已存在的文本文件??梢宰x取數(shù)據(jù)。也可以寫入數(shù)據(jù)。”w+”:讀寫方式打開一個已存在的文本文件??梢宰x取數(shù)據(jù)。也可以寫入數(shù)據(jù)。若文件不存在,則自動建立一個新文件接收寫入的數(shù)據(jù);若文件存在,則刪除舊文件,建立一個同名的新文件,接收寫入的數(shù)據(jù)?!盿+”:讀寫方式打開一個已存在的文本文件??梢宰x取數(shù)據(jù)。也可以追加在文件尾部。2022/12/10579.1文件的概述9.1.2文本文件的使用方式”r+”rb”:讀寫方式打開一個已存在的二進制文件。只能讀取數(shù)據(jù)?!眞b”:只寫方式打開一個二進制文件。只能寫入數(shù)據(jù)。若文件不存在,則自動建立一個新文件接收寫入的數(shù)據(jù);若文件已存在,則刪除舊文件,建立一個同名的新文件,接收寫入的數(shù)據(jù)?!盿b”:追加方式打開一個已存在的二進制文件。只能寫入數(shù)據(jù)并追加在文件尾部。9.1.2文本文件的使用方式2022/12/1058”rb”:讀寫方式9.1.2文本文件的使用方式2022/1二進制文件的三種基本使用方式”rb+”:打開一個已存在的二進制文件??梢宰x取數(shù)據(jù)。也可以寫入數(shù)據(jù)?!眞b+”:讀寫方式打開一個二進制文件。可以讀取數(shù)據(jù)。也可以寫入數(shù)據(jù)。若文件不存在,則自動建立一個新文件接收寫入的數(shù)據(jù);若文件存在,則刪除舊文件,建立一個同名的新文件,接收寫入的數(shù)據(jù)?!盿b+”:讀寫方式打開一個已存在的二進制文件??梢宰x取數(shù)據(jù)。也可以追加數(shù)據(jù)到文件尾部。9.1文件的概述9.1.2文件的打開與關(guān)閉2022/12/1059二進制文件的三種基本使用方式9.1文件的概述文件的概述9.1.2文件的打開與關(guān)閉操作文件的一般步驟

打開文件

讀寫文件

關(guān)閉文件打開文件:建立用戶程序與文件的聯(lián)系,為文件分

配一個文件緩沖區(qū)。讀寫文件:是指對文件的讀、寫、追加和定位操作。關(guān)閉文件:切斷文件與程序的聯(lián)系,釋放文件緩沖

區(qū)。C語言的輸入輸出函數(shù)庫中提供了大量的函數(shù),用于完成對數(shù)據(jù)文件的建立、數(shù)據(jù)的讀寫、數(shù)據(jù)的追加等操作。在程序中調(diào)用這些函數(shù)時,必須先用include命令包含stdio.h文件。

2022/12/10609.1文件的概述9.1.2文件的打開與關(guān)閉操作文件的一般

標(biāo)準(zhǔn)文件是外部設(shè)備中的三個特殊的設(shè)備文件。它們的文件指針是系統(tǒng)定義的,并由系統(tǒng)自動打開和關(guān)閉。這三個標(biāo)準(zhǔn)文件分別是:①標(biāo)準(zhǔn)輸入文件,文件指針為stdin,系統(tǒng)指定為鍵盤。②標(biāo)準(zhǔn)輸出文件,文件指針為stdout,系統(tǒng)指定為顯示器。③標(biāo)準(zhǔn)錯誤輸出文件,文件指針為stderr,系統(tǒng)指定為顯示器,輸出錯誤信息。9.1文件的概述9.1.1文件和文件指針4.標(biāo)準(zhǔn)文件

2022/12/1061 標(biāo)準(zhǔn)文件是外部設(shè)備中的三個特殊的設(shè)備文件。它們的文檢查文件打開操作是否成功if((fp=fopen("filename","r"))==NULL){printf(”Cannotopenfile.\n”);

exit(0); } 檢查以只讀方式打開文件名為filename的文件是否成功。

exit函數(shù)的作用:結(jié)束程序的執(zhí)行,并將實參0作為函數(shù)返回值傳給操作系統(tǒng)。

9.1文件的概述9.1.2文件的打開與關(guān)閉2022/12/1062檢查文件打開操作是否成功9.1文件的概述9.1.2常用的調(diào)用形式:

FILE

*fp;fclose(fp);fp:已經(jīng)打開的文件指針。9.1文件的概述9.1.2文件的打開與關(guān)閉2.文件關(guān)閉函數(shù)fclose(

)函數(shù)功能:關(guān)閉fp指定的文件,釋放該文件的緩沖區(qū)、FILE類型變量及文件指針。若文件關(guān)閉成功,則返回0;若文件關(guān)閉失敗,則返回非0值。2022/12/1063常用的調(diào)用形式:9.1文件的概述9.1.2文件的打開FILE*fp;/**/┆if((fp=fopen("文件名","文件使用方式"))==NULL)/**/{printf("filecannotopen!\n");/**/exit(0);/**/}┆/**/fclose(fp);/**/}2022/12/1064FILE*fp;/**/2022/常用的調(diào)用形式:

FILE

*fp;fputc(ch,fp);

ch:需要輸出的字符,可以是字符常量或字符變量;fp:文件指針變量。對文本文件的讀寫操作,必須按文件中字符的先后順序進行,只能在操作了第i個字符之后,才能操作第i+1個字符。在對文件操作時,文件的讀寫指針由系統(tǒng)自動向后移動。9.2文本文件的讀寫9.2.1文件的字符輸入輸出函數(shù)1.字符輸出函數(shù)fputc(

)(或putc(

))函數(shù)功能:

將一個字符(ASCII碼)寫入到fp所指向的文件(該文件必須是以寫或讀寫方式打開的)中。若輸出操作成功,函數(shù)返回寫入的字符;否則,返回EOF。系統(tǒng)定義的文本文件結(jié)束標(biāo)志,其值為(-1)。

①putc函數(shù)與fputc函數(shù)的功能相同。在stdio.h文件中被定義為#defineputc(c,f)fputc((c),f)②標(biāo)準(zhǔn)文件中用的putchar函數(shù)是fputc函數(shù)的特殊用法,它在stdio.h文件中被定義為#defineputchar(c)putc((c),stdout)2022/12/1065常用的調(diào)用形式:對文本文件的讀寫操作,必須按文件中字常用的調(diào)用形式:

FILE

*fp;

ch

=fgetc(fp);

ch:可以是字符變量或整型變量;fp:文件指針變量。9.2文本文件的讀寫9.2.1文件的字符輸入輸出函數(shù)2.字符輸入函數(shù)fgetc(

)(或getc(

))函數(shù)功能:從fp所指向的文件(該文件必須是以讀或讀寫方式打開的)中讀取一個字符。若輸入操作成功,函數(shù)返回讀入的字符;若文件結(jié)束或輸入操作失敗,則返回EOF。

①getc函數(shù)與fgetc函數(shù)的功能相同。在stdio.h文件中被定義為#definegetc(f)fgetc(f)②標(biāo)準(zhǔn)文件中用的getchar函數(shù)是fgetc函數(shù)的特殊用法,它在stdio.h文件中被定義為#definegetchar()getc(stdin)2022/12/1066常用的調(diào)用形式:9.2文本文件的讀寫9.2.1文件的【例9.1】利用fputc和fgetc函數(shù)建立一個文本文件,并顯示文件中的內(nèi)容。#include<stdio.h>main(){FILE*fp;/*定義一個文件指針變量fp*/intc;/*c為存放字符的變量*/charfilename[40];/*filename用于存放數(shù)據(jù)文件名*/printf("filename:");/*提示輸入磁盤文件名*/gets(filename);

if((fp=fopen(filename,"w"))==NULL){printf("Can'topenthe%s\n",filename);exit(0);}9.2文本文件的讀寫9.2.1文件的字符輸入輸出函數(shù)測試打開文件是否成功2022/12/1067【例9.1】利用fputc和fgetc函數(shù)建立一個文本文件,while((c=getchar())!=EOF)/*鍵盤文件結(jié)束標(biāo)志:輸入Ctrl+z,顯示^Z后回車*/putc(c,fp);/*將鍵盤輸入的字符寫到文件中*/fclose(fp);/*建立文件結(jié)束,關(guān)閉文件*/printf("outfile:\n");fp=fopen(filename,"r");/*以讀方式打開文本文件*/while((c=getc(fp))!=EOF)/*未讀到文件結(jié)束標(biāo)志時*/putchar(c);/*在顯示器顯示讀出的字符*/fclose(fp);/*讀文件結(jié)束,關(guān)閉文件*/}9.2文本文件的讀寫9.2.1文件的字符輸入輸出函數(shù)2022/12/1068while((c=getchar())!=EOF)9.2常用的調(diào)用形式:

FILE

*fp;

feof(fp);

fp:文件指針變量。9.2文本文件的讀寫9.2.2文件結(jié)束測試函數(shù)函數(shù)功能:測試fp所指向的文件是否已讀到文件尾部。若該文件沒有結(jié)束,則返回0;若文件結(jié)束,則返回非0值。對文本文件進行讀操作時,例如fgetc(

)返回EOF,即可作文件結(jié)束處理。但在二進制文件中-1是合法數(shù)據(jù),所以系統(tǒng)提供了一個適用對象更普遍的文件結(jié)束測試函數(shù)feof。2022/12/1069常用的調(diào)用形式:9.2文本文件的讀寫9.2.2文件結(jié)例如:復(fù)制一個磁盤文件。#include<stdio.h>main(

){FILE*infp,*outfp;charinfile[40],outfile[40];intch;printf("inputfilename:");scanf("%s",infile);printf("outputfilename:");scanf("%s",outfile);if((infp=fopen(infile,"r"))==NULL)

/*打開源文件*/{ printf("infileopenerror.\n");exit(0);}if((outfp=fopen(outfile,"w"))==NULL)/*打開目標(biāo)文件*/{ printf("outfileopenerror.\n");exit(0);}ch=fgetc(infp);/*從源文件中讀一個字符*/while(!feof(infp))/*源文件未讀完*/

{fputc(ch,outfp);ch=fgetc(infp);}/*復(fù)制文件*/fclose(infp);fclose(outfp);}9.2文本文件的讀寫9.2.2文件結(jié)束測試函數(shù)2022/12/1070例如:復(fù)制一個磁盤文件。9.2文本文件的讀寫9.2.2常用的調(diào)用形式:

FILE*fp;

fputs(

str,

fp

);

str:需要輸出的字符串,可以是字符串常量或字符串指針;fp:文件指針變量。

fputs與puts函數(shù)的功能類似,它們的區(qū)別:puts函數(shù)能將字符串的結(jié)束標(biāo)志'\0'轉(zhuǎn)換成'\n'

輸出,因此字符串在顯示器輸出后,光標(biāo)移至下一行;而fputs函數(shù)對字符串結(jié)束標(biāo)志'\0'的處理僅僅是將其舍去。9.2文本文件的讀寫9.2.3文件的字符串輸入輸出函數(shù)1.字符串輸出函數(shù)fputs(

)函數(shù)功能:將字符串(不包括字符串結(jié)束標(biāo)志'\0')寫到文件指針fp所指向的文件中。若輸出操作成功,返回非0值;若輸出操作失敗,則返回0。2022/12/1071常用的調(diào)用形式:fputs與puts函數(shù)的功能類似常用的調(diào)用形式:

FILE*fp;

fgets(

str,

n,

fp

);

str:字符指針,可以是字符數(shù)組名或字符指針變量;n:讀取字符個數(shù)(n-1)。fp:文件指針變量。9.2文本文件的讀寫9.2.3文件的字符串輸入輸出函數(shù)2.字符串輸入函數(shù)fgets(

)函數(shù)功能:從fp所指向的文件中,讀取n-1個字符后,加上字符串結(jié)束標(biāo)志'\0'組成一個字符串,存入字符數(shù)組中。若輸入操作成功,返回字符數(shù)組的首地址;若文件結(jié)束或輸入操作失敗,則返回NULL。①

從文件讀取字符的過程中,如果讀到回車符('\15')舍去,如果讀到換行符('\12')仍按字符讀出,再加上'\0'

作為一個字符串,同時結(jié)束文本行讀取操作,函數(shù)正常返回。當(dāng)讀到文件結(jié)束時,直接加上'\0'作為一個字符串,函數(shù)正常返回。②

fgets與gets函數(shù)的區(qū)別:gets函數(shù)以換行符作為行結(jié)束標(biāo)志,并舍去換行符。fgets函數(shù)也以換行符作為行的讀結(jié)束標(biāo)志,但換行符同時還作為字符串的內(nèi)容。因此可將含有換行符的文本文件看作是由一行一行字符組成的。2022/12/1072常用的調(diào)用形式:9.2文本文件的讀寫9.2.3文件的【例9.3】應(yīng)用fputs和fgets函數(shù),建立和讀取文本文件。#include"stdio.h"#include"string.h"main(){FILE*fp;/*定義一個文件指針變量fp*/charfilename[40],str[81];printf("filename:");

溫馨提示

  • 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

提交評論