C語言PPT第8章 文件_第1頁
C語言PPT第8章 文件_第2頁
C語言PPT第8章 文件_第3頁
C語言PPT第8章 文件_第4頁
C語言PPT第8章 文件_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第8章文件北京科技大學計算機系C語言程序設計1文件

文件和文件類型指針

文件的打開與關閉

文本文件的讀寫

二進制文件的讀寫

文件讀寫指針定位函數(shù)

小結2023/3/72文件前幾章中的程序數(shù)據(jù)輸入:鍵盤數(shù)據(jù)輸出:顯示器實際應用中,需要將數(shù)據(jù)以文件的形式長期保存在計算機外存中C語言提供輸入/輸出函數(shù),用于完成數(shù)據(jù)文件的建立、讀寫、追加等處理2023/3/738.2文件和文件類型指針文件是指存儲在外部存儲介質上相關數(shù)據(jù)的集合1何謂文件磁盤,光盤,閃盤…每個文件必須賦以一個文件名,它是文件的重要標識程序通過文件名訪問文件,處理數(shù)據(jù)操作系統(tǒng)按文件名對文件進行管理C語言把文件作為一個字符(字節(jié))序列處理對文件的存取是以字符(字節(jié))為單位進行的2023/3/748.2文件和文件類型指針按其存放內容分程序文件數(shù)據(jù)文件按照對文件的不同處理方式分緩沖文件非緩沖文件2文件的種類2023/3/758.2文件和文件類型指針按其存放的代碼形式分ASCII文件二進制文件2文件的種類每個字節(jié)存放一個ASCII值,代表一個字母按其在內存中的存儲形式存放2023/3/768.2文件和文件類型指針用緩沖文件系統(tǒng)處理的文件稱為緩沖文件系統(tǒng)在內存中為每個正在使用的緩沖文件開辟一個緩沖區(qū),其大小是512字節(jié)對文件讀寫數(shù)據(jù)都通過緩沖區(qū)進行3緩沖文件和文件指針2023/3/778.2文件和文件類型指針文件指針是指向含有文件信息的結構體類型指針此結構體類型由系統(tǒng)定義在stdio.h文件中將其定義為FILE類型

緩沖文件系統(tǒng)自動為每一個正在使用中的文件分配一個FILE類型變量,用于存放該文件的有關信息定義形式為:FILE*fp;3緩沖文件和文件指針2023/3/788.2文件和文件類型指針外部設備中的3個特殊的設備文件①標準輸入文件文件指針為stdin,系統(tǒng)指定為鍵盤②標準輸出文件文件指針為stdout,系統(tǒng)指定為顯示器③標準錯誤輸出文件文件指針為stderr,系統(tǒng)指定為顯示器輸出錯誤信息4標準文件2023/3/798.2文件和文件類型指針利用非緩沖文件系統(tǒng)處理的文件系統(tǒng)處理非緩沖文件時不為文件開辟緩沖區(qū)需要程序員自行設計并管理緩沖區(qū)非緩沖文件系統(tǒng)處理的文件大都是二進制文件即使使用非緩沖文件系統(tǒng)建立ASCII文件,其文件結尾處也和二進制文件一樣,沒有文件結束標志,系統(tǒng)靠文件長度判斷其是否結束5非緩沖文件2023/3/7108.3

文件的打開與關閉對文件的操作一般都需要經(jīng)過3個步驟:打開文件讀寫文件關閉文件C語言中分別用不同的函數(shù)實現(xiàn)這些文件操作2023/3/7118.3文件的打開與關閉調用的一般格式為:fopen(文件名,文件使用方式)功能:按指定的使用方式打開指定的文件,并為該文件分配一個文件緩沖區(qū)和一個FILE類型變量若成功地打開指定文件,則返回一個指向該文件的FILE類型指針(即系統(tǒng)為其分配的FILE類型變量的首地址)若文件打開失敗,則返回NULL

1文件打開函數(shù)fopen()2023/3/7128.3文件的打開與關閉說明:①調用函數(shù)時,文件名應是字符串表示形式②文件使用方式也應是字符串表示形式③調用該函數(shù)時,必須用include命令包含stdio.h文件調用時通常采用的形式:fp=fopen(文件名,文件使用方式);/*設fp已定義為FILE類型指針*/1文件打開函數(shù)fopen()2023/3/7138.3文件的打開與關閉1文件打開函數(shù)fopen()文件使用方式說明“r”或“rt”以只讀方式打開一個文本文件,此文件必須存在“w”或“wt”以只寫方式建立并打開一個新文本文件。若文件已經(jīng)存在,則打開時清除原內容“a”或“at”以追加寫方式打開一個文本文件,并將寫入的內容添加到文件尾部。若文件不存在,則新建一個文本文件“r+”以讀/寫方式打開一個文本文件,此文件必須存在“w+”以讀/寫方式建立并打開一個新文本文件。若文件已存在,則打開時清除原內容“a+”以讀/追加寫方式打開一個文本文件。若文件不存在,則新建一個文本文件“rb”以只讀方式打開一個二進制文件,此文件必須存在“wb”以只寫方式建立并打開一個新二進制文件。若文件已存在,則打開時清除原內容“ab”以追加寫方式打開一個二進制文件。若文件不存在,則新建一個二進制文件“rb+”以讀/寫方式打開一個二進制文件,此文件必須存在“wb+”以讀/寫方式建立并打開一個新二進制文件。若文件已存在,則打開時清除原內容“ab+”以讀/追加寫方式打開一個二進制文件。若文件不存在,則新建一個二進制文件2023/3/7148.3文件的打開與關閉打開文件過程中存在出錯的可能性

1文件打開函數(shù)fopen()檢查的常用方法:if((fp=fopen("filel.dat","w"))==NULL) {printf("Can'topenthisfile\n"); exit(0); }判斷以寫方式新建并打開“filel.dat”文件是否成功其中exit函數(shù)的作用是結束程序的執(zhí)行,并將實參0作為函數(shù)返回值傳給操作系統(tǒng)2023/3/7158.3文件的打開與關閉調用的一般格式為:fclose(文件指針);功能:關閉文件指針所指向的文件,釋放該文件的緩沖區(qū)及FILE類型變量若成功地關閉文件,則返回0若文件關閉失敗,則返回EOF

2文件關閉函數(shù)fclose()2023/3/7168.3文件的打開與關閉說明:文件指針是FILE類型的指針,且必須是fopen()返回的文件指針EOF是系統(tǒng)定義的文本文件結束標志,其值為(-1)調用該函數(shù)時,必須用include命令包含stdio.h文件2文件關閉函數(shù)fclose()2023/3/7178.3文件的打開與關閉應及時關閉不再使用的文件2文件關閉函數(shù)fclose()操作系統(tǒng)允許同時打開的文件個數(shù)是有限的

在程序設計中應養(yǎng)成及時關閉文件的習慣

系統(tǒng)配置的緩沖區(qū)個數(shù)也是有限的

程序對文件的讀寫都是通過緩沖區(qū)進行的

2023/3/7188.4文本文件的讀寫8.4.1文件的字符輸入/輸出函數(shù)運用字符輸入輸出函數(shù)、字符串輸入輸出函數(shù)和格式輸入輸出函數(shù)可以實現(xiàn)對文本文件的讀寫它們的原型說明都在stdio.h文件中因此調用這些函數(shù)時,必須在程序中加入預處理命令:#include<stdio.h>或#include“stdio.h”2023/3/7198.4.1文本的字符輸入/輸出函數(shù)1字符輸出函數(shù)fputc()fputc(ch,fp)其中ch是字符數(shù)據(jù),可以是自負常量,也可以是字符變量fp是文件指針變量,指向以寫方式打開的文件功能:把ch所表示的字符的ASCII值寫入fp所指向的文件,并返回寫入文件的字符代碼值若調用失敗,則返回EOF2023/3/7208.4.1文本的字符輸入/輸出函數(shù)1字符輸出函數(shù)fputc()說明:①putc函數(shù)與fputc函數(shù)的功能相同在stdio.h文件中被定義為:

#defineputc(c,f)fputc((c),f)②標準文件中用的putchar函數(shù)是fputc函數(shù)的特殊用法在stdio.h文件中被定義為:

#defineputchar(c)putc((c),stdout)2023/3/7218.4.1文本的字符輸入/輸出函數(shù)2字符輸入函數(shù)fgetc()調用的一般格式為:

fgetc(fp)

其中fp是文件指針變量,并且它指向的文件是以讀方式打開的文件功能:從fp所指向的文件中讀取一個字符的ASCII值,并返回從文件中讀出的字符代碼值若文件結束或調用失敗,則返回EOF2023/3/7228.4.1文本的字符輸入/輸出函數(shù)2字符輸入函數(shù)fgetc()說明:①getc函數(shù)與fgetc函數(shù)的功能相同在stdio.h文件中被定義為:

#definegetc(f)fgetc(f)②標準文件中用的getchar函數(shù)是fgetc函數(shù)的特殊用法在stdio.h文件中被定義為:

#definegetchar()getc(stdin)2023/3/7238.4.1文本的字符輸入/輸出函數(shù)【例8-1】利用fputc和fgetc函數(shù)建立一個文本文件,并顯示文件中的內容#include"stdio.h"#include"stdlib.h"main(){FILE*fp; /*定義一個文件指針變量fp*/

int

c; /*c為存放字符的變量*/charfilename[40]; /*filename用于存放數(shù)據(jù)文件名*/

printf("filename:"); /*提示輸入磁盤文件名*/

gets(filename);

if((fp=fopen(filename,"w"))==NULL) {printf("Can'topenthe%s\n",filenameexit(1);}/*新建并打開一個文本文件,同時測試是否成功*/2023/3/7248.4.1文本的字符輸入/輸出函數(shù)

while((c=getchar())!=EOF) putc(c,fp); /*將鍵盤輸入的字符寫到文件中*/

fclose(fp); /*建立文件結束,關閉文件*/

printf("outfile:\n");

fp=fopen(filename,"r"); /*以讀方式打開文本文件*/

while((c=getc(fp))!=EOF) /*當未讀到文件結束標志時*/

putchar(c); /*在顯示器顯示讀出的字符*/

fclose(fp); /*讀文件結束,關閉文件*/}先把鍵盤文件讀取的內容逐個字符地保存到一個新建立的磁盤文件中,然后再以讀方式打開磁盤文件,將文件內容原樣顯示

2023/3/7258.4.1文本的字符輸入/輸出函數(shù)3文件結束測試函數(shù)feof()EOF是文本文件結束標志在stdio.h文件中定義為:#defineEOF(-1)對文本文件進行讀操作時當fgetc()返回EOF,即可作文件結束處理在二進制文件中不設EOF標志2023/3/7268.4.1文本的字符輸入/輸出函數(shù)3文件結束測試函數(shù)feof()調用的一般格式為:

feof(fp)其中fp是文件指針變量,指向一個打開的文件功能:測試fp所指向的文件是否已讀到文件尾部若該文件沒有結束,則返回0若文件結束,則返回非0值2023/3/7278.4.1文本的字符輸入/輸出函數(shù)【例8-1】復制一個磁盤文件#include"stdio.h"#include"stdlib.h"voidmain(int

argc,char*argv[]){FILE*infp,*outfp;charinfile[40],outfile[40];intc;

if(argc<3) if(argc==2) {printf("outputfilename:"); gets(outfile); argv[2]=outfile; } else {printf("inputfilename:");

gets(infile);

printf("outputfilename:"); gets(outfile); argv[1]=infile; argv[2]=outfile; }定義源文件指針和目標文件指針定義字符數(shù)組,存放源文件名和目標文件名如果只有一個數(shù)據(jù)文件名,則提示輸入目標文件名如果沒有數(shù)據(jù)文件名,則提示輸入源文件名和目標文件名2023/3/7288.4.1文本的字符輸入/輸出函數(shù)

if((infp=fopen(argv[1],"r"))==NULL {printf("Can'topenthe%s\n",argv[1]); exit(1); }if((outfp=fopen(argv[2],"w"))==NULL {printf("Can'topenthe%s\n",argv[2]); exit(2); }c=getc(infp);while(!feof(infp)) {putc(c,outfp); c=getc(infp);}fclose(infp);fclose(outfp);printf("ok\n");}該程序采用了帶參主函數(shù)。

以讀方式打開源文件并測試是否成功新建并打開目標文件,測試是否成功將源文件讀取的字符寫到目標文件中2023/3/7298.4.2文本的字符串輸入輸出函數(shù)1字符串輸出函數(shù)fputs()調用的一般格式為:

fputs(str,fp)str是字符串形式可以是字符串常量也可以是存放字符串的字符數(shù)組名或指向字符串的指針fp是文件指針變量指向以寫方式打開的文件2023/3/7308.4.2文本的字符串輸入輸出函數(shù)1字符串輸出函數(shù)fputs()功能:將字符串(不包括字符串結束標志’\0’)寫到文件指針fp所指向的文件中若調用成功,則返回非0值若調用失敗,則返回0說明:fputs與puts函數(shù)的功能類似,亦有區(qū)別2023/3/7318.4.2文本的字符串輸入輸出函數(shù)2字符串輸入函數(shù)fgets()調用的一般格式為:

fgets(str,n,fp)str是字符指針形式可以是字符數(shù)組名或指向字符數(shù)組的指針變量fp是文件指針指向以讀方式打開的文件n指定讀取n-1個字符2023/3/7328.4.2文本的字符串輸入輸出函數(shù)2字符串輸入函數(shù)fgets()功能:從文件指針fp所指向的文件中,讀取n-1個字符后,加上字符串結束標志’\0’組成一個字符串,存入字符數(shù)組中若調用成功,則返回字符數(shù)組的首地址若文件結束或調用失敗,則返回NULL2023/3/7338.4.2文本的字符串輸入輸出函數(shù)2字符串輸入函數(shù)fgets()fgets與gets函數(shù)的區(qū)別

gets函數(shù)以換行符作為行結束標志,并舍去換行符

fgets函數(shù)也以換行符作為行的讀結束標志,但換行符同時還作為字符串的內容2023/3/7348.4.2文本的字符串輸入/輸出函數(shù)【例8-3】應用fputs和fgets函數(shù),建立和讀取文本文件

main(){FILE*fp; /*定義一個文件指針變量fp*/charfilename[40],str[81]; /*filename用于存放數(shù)據(jù)文件名*/while(strlen(gets(str))>0){fputs(str,fp);

fputc('\n',fp); }

fclose(fp);

/*將鍵盤輸入的字符串寫到文件中,加入換行符作為字符串分隔符,直到鍵盤輸入空串(即回車)*/fp=fopen(filename,"r");while((fgets(str,81,fp))!=NULL

printf("%s",str);fclose(fp);

/*將文件中讀取的字符串在屏幕上分行顯示*/2023/3/7358.4.3文本的格式輸入/輸出函數(shù)1格式輸出函數(shù)fprintf()調用的一般格式為:fprintf(文件指針,格式控制串,輸出項參數(shù)表)功能:將輸出項按指定格式寫入由文件指針所指向的文件中若調用成功,則返回寫入的字節(jié)數(shù)若調用失敗,則返回EOF

說明:寫入文件的信息均是ASCII值形式2023/3/7368.4.3文本的格式輸入/輸出函數(shù)2格式輸入函數(shù)fscanf()調用的一般格式為:fscanf(文件指針,格式控制串,地址表)功能:按格式控制串所描述的格式,從文件指針所指向的文件中讀取數(shù)據(jù),送到指定的內存地址單元中若調用成功,則返回實際讀出的數(shù)據(jù)項個數(shù)若沒有讀數(shù)據(jù)項,則返回0

若文件結束,則返回EOF2023/3/7378.5二進制文件的讀寫如果需要在內存與磁盤文件之間頻繁交換數(shù)據(jù),最好采用二進制文件二進制文件存儲信息的形式與內存中存儲信息的形式是一致的二進制文件一般是同類型數(shù)據(jù)的集合,數(shù)據(jù)之間無分隔符,每個數(shù)據(jù)所占字節(jié)數(shù)是一個定值調用這些函數(shù)時,必須在程序中加入#include<stdio.h>2023/3/7388.5.1文件的字輸入/輸出函數(shù)1字輸出函數(shù)putw()調用的一般格式為:putw(w,fp)w是要輸出的整型數(shù)據(jù),它可以是常量,也可以是變量fp是文件指針,指向以寫方式打開的二進制文件把整型數(shù)w寫入fp所指向的文件若調用成功,則返回w值若調用失敗,則返回EOF2023/3/7398.5.1文件的字輸入/輸出函數(shù)2字輸入出函數(shù)getw()調用的一般格式為:getw(fp)fp是文件指針,指向以讀方式打開的二進制文件若調用成功,則返回從文件中讀取的整數(shù)若文件結束或調用失敗,則返回EOF2023/3/7408.5.1文件的字輸入/輸出函數(shù)3文件操作錯誤函數(shù)ferror()調用的一般格式為:ferror(fp)fp為文件指針,指向已打開并需要進行檢測的文件若出錯,則指示器置l否則指示器置0若錯誤指示器置1后,只有調用clearerr函數(shù)或rewind函數(shù)才能將其清02023/3/7418.5.1文件的字輸入/輸出函數(shù)4清除錯誤標志函數(shù)clearerr()調用的一般格式為clearerr(fp)其中fp為文件指針,指向已打開的文件將文件的錯誤指示器和文件結束指示器清0該函數(shù)無返回值2023/3/7428.5.2文件的數(shù)據(jù)塊輸入/輸出函數(shù)C程序中除了可以建立整型二進制文件外,還可建立實型二進制文件結構體類型二進制文件對于這些文件的讀寫,可運用數(shù)據(jù)塊輸入輸出函數(shù)實現(xiàn)2023/3/7438.5.2文件的數(shù)據(jù)塊輸入/輸出函數(shù)1數(shù)據(jù)塊輸出函數(shù)fwrite()調用的一般格式為:fwrite(p,size,n,fp)p是某類型指針size是該類型數(shù)據(jù)在內存中所占字節(jié)數(shù),可用sizeof運算獲得n是此次寫入文件的數(shù)據(jù)項數(shù)fp是文件指針變量,指向以寫方式打開的文件將p指向的內存存儲區(qū)中n個數(shù)據(jù)項寫入文件指針fp所指向的文件,每個數(shù)據(jù)項的大小為size個字節(jié)若調用成功,則返回實際寫入的數(shù)據(jù)項數(shù)若調用失敗,則返回0值2023/3/7448.5.2文件的數(shù)據(jù)塊輸入/輸出函數(shù)2數(shù)據(jù)塊輸入函數(shù)fread()調用的一般格式為:fread(p,size,n,fp)p是某類型指針size是該類型數(shù)據(jù)在存儲時所需字節(jié)數(shù)n是此次讀取的數(shù)據(jù)項數(shù)fp是文件指針變量,指向以讀方式打開的文件從文件指針fp所指向的文件中,讀取n個數(shù)據(jù)項,存放到p所指向的存儲區(qū)域。每個數(shù)據(jù)項的大小為size個字節(jié)若調用成功,則返回實際讀取的數(shù)據(jù)項數(shù)若文件結束或調用失敗,則返回0值2023/3/7458.5二進制文件的讀寫【例8-5】應用putw和getw

函數(shù)建立二進制整型數(shù)據(jù)文件并讀取其中的數(shù)據(jù)【例8-6】應用fwrite與fread函數(shù)建立一個存放學生電話簿的二進制數(shù)據(jù)文件并讀取其中的數(shù)據(jù)2023/3/7468.6文件讀寫指針定位函數(shù)C語言將文件作為字符流處理要對文件進行隨機存取,就需要借助于文件讀寫指針的移動,其移動單位是字節(jié)2023/3/7478.6文件讀寫指針定位函數(shù)1文件讀寫指針移動函數(shù)fseek()調用的一般格式為:fseek(fp,offset,whence)fp是文件指針,指向被操作的文件offset是位移量,單位是字節(jié)如果是正整數(shù),文件讀寫指針向文件尾部方向移動如果是負整數(shù),則向文件頭部移動whence是起始位置標志將文件讀寫指針從whence標識的位置移動offset個字節(jié),并將文件結束指示器清0若調用成功,則返回0若調用失敗,則返回非0值2023/3/7488.6文件讀寫指針定位函數(shù)1文件讀寫指針移動函數(shù)fseek()說明:①起始位置標志,在stdio.h文件中有定義②該函數(shù)僅適用于二進制文件常量標識符 值 起始位置SEEK_SET 0

文件開始位置SEEK_CUR 1

文件讀寫指針的當前位置SEEK_END 2

文件結束位置2023/3/7498.6文件讀寫指針定位函數(shù)2文件讀寫回繞函數(shù)rewind()調用的一般格式為:rewind(fp)其中fp是文件指針,指向被操作的文件將文件讀寫指針移到文件開始位置,并將文件結束指示器和錯誤指示器清0該函數(shù)無返回值

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

2023/3/7508.6文件讀寫指針定位函數(shù)3文件讀寫指針位置函數(shù)ftell()調用的一般格式為:ftell(fp)其中fp是文件指針,指向被操作的文件

返回fp指向的文件中的讀寫指針當前位置,即相對于文件開始處的位移量,單位是字節(jié)若調用成功,則返回文件讀寫指針當前值若調用失敗,

溫馨提示

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

評論

0/150

提交評論