




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第10單元文件摘要10.1文件概述10.1.1文件分類10.1.2文件指針10.2文件的打開和關閉10.3文件的讀寫數(shù)10.3.1字符讀寫函10.3.2字符串讀寫函數(shù)10.3.3數(shù)據(jù)塊讀寫函數(shù)10.3.4格式化讀寫函數(shù)10.4文件的定位實例分析與實現(xiàn)10.1文件概述10.1.1文件分類什么是文件?所謂“文件”是指一組相關數(shù)據(jù)的有序集合。這個數(shù)據(jù)集有一個名稱,叫做文件名。實際上在前面的各章中我們已經(jīng)多次使用了文件,例如源程序文件、目標文件、可執(zhí)行文件、庫文件(頭文件)等。文件通常是駐留在外部介質(zhì)(如磁盤等)上的,在使用時才調(diào)入內(nèi)存中來。什么是文件?文件分類1.從用戶的角度看,文件可分為普通文件和設備文件兩種。普通文件是指駐留在磁盤或其它外部介質(zhì)上的一個有序數(shù)據(jù)集,可以是源文件、目標文件、可執(zhí)行程序。設備文件是指與主機相聯(lián)的各種外部設備,如顯示器、打印機、鍵盤等。文件分類2.從文件編碼的方式來看,文件可分為ASCII碼文件和二進制碼文件兩種。ASCII文件也稱為文本文件,這種文件在磁盤中存放時每個字符對應一個字節(jié),用于存放對應的ASCII碼??勺x。文件分類二進制文件是按二進制的編碼方式來存放文件的。不可讀。例如,數(shù)5678的存儲形式為:
00010110
00101110文件分類3.從文件的邏輯結構看,文件可分為流式文件和記錄文件。流式文件:由一個個字符(字節(jié))數(shù)據(jù)順序組成,如視頻流
記錄文件:有具有一定結構的記錄組成,如word文件,pdf文件本章討論流式文件的打開、關閉、讀、寫、定位等各種操作。10.1文件概述10.1.2文件指針文件指針在C語言中用一個指針變量指向一個文件,這個指針稱為文件指針。通過文件指針就可對它所指的文件進行各種操作。定義說明文件指針的一般形式為:
FILE*指針變量標識符;文件指針其中FILE應為大寫,它實際上是由系統(tǒng)定義的一個結構,該結構中含有文件名、文件狀態(tài)和文件當前位置等信息。在編寫源程序時不必關心FILE結構的細節(jié)。例如:FILE*fp;fp稱為指向一個文件的指針。10.2文件的打開和關閉所謂打開文件,實際上是建立文件的各種有關信息,并使文件指針指向該文件,以便進行其它操作。關閉文件則斷開指針與文件之間的聯(lián)系,也就禁止再對該文件進行操作。文件的打開(fopen函數(shù))fopen用來打開一個文件,其調(diào)用形式為:文件指針名=fopen(文件名,使用文件方式);其中,“文件指針名”必須是被說明為FILE類型的指針變量;“文件名”是被打開文件的文件名,是字符串常量或字符串數(shù)組;“使用文件方式”是指文件的類型和操作要求。文件的打開(fopen函數(shù))例如:
1.FILE*fp;fp=(“file_a”,“r”);//當前目錄打開文件file_a,只“讀”
2.FILE*fphzkfphzk=(“c:\\hzk16”,“rb”);//二進制只讀兩個反斜線“\\”中的第一個表示轉(zhuǎn)義字符,第二個表示根目錄。文件使用方式文件使用方式意
義“rt”只讀打開一個文本文件,只允許讀數(shù)據(jù)“wt”只寫打開或建立一個文本文件,只允許寫數(shù)據(jù)“at”追加打開一個文本文件,并在文件末尾寫數(shù)據(jù)“rb”只讀打開一個二進制文件,只允許讀數(shù)據(jù)“wb”只寫打開或建立一個二進制文件,只允許寫數(shù)據(jù)“ab”追加打開一個二進制文件,并在文件末尾寫數(shù)據(jù)“rt+”讀寫打開一個文本文件,允許讀和寫“wt+”讀寫打開或建立一個文本文件,允許讀寫“at+”讀寫打開一個文本文件,允許讀,或在文件末追加數(shù)據(jù)“rb+”讀寫打開一個二進制文件,允許讀和寫“wb+”讀寫打開或建立一個二進制文件,允許讀和寫“ab+”讀寫打開一個二進制文件,允許讀,或在文件末追加數(shù)據(jù)
說明:(1)文件使用方式由r,w,a,t,b,+六個字符拼成,各字符的含義是:
r(read):
讀
w(write):
寫
a(append):
追加
t(text):
文本文件,可省略不寫
b(banary):
二進制文件+:
讀和寫
說明:(2)凡用“r”打開一個文件時,該文件必須已經(jīng)存在,且只能從該文件讀出。(3)用“w”打開的文件只能向該文件寫入。若打開的文件不存在,則以指定的文件名建立該文件,若打開的文件已經(jīng)存在,則將該文件刪去,重建一個新文件。(4)若要向一個已存在的文件追加新的信息,只能用“a”方式打開文件。但此時該文件必須是存在的,否則將會出錯。
打開文件常用以下方法方式一if((fp=fopen("file","r"))==NULL){ printf("不能打開該文件。\n"); exit(0);}
打開文件常用以下方法方式二
if((fp=fopen("c:\\hzk16","rb")==NULL)
{
printf("erroronopenc:\\hzk16file!");
getch();
exit(1);}文件關閉函數(shù)(fclose函數(shù))文件使用完畢,用關閉文件函數(shù)把文件關閉,以避免文件的數(shù)據(jù)丟失等錯誤。fclose函數(shù)調(diào)用的一般形式是:fclose(文件指針);例如:fclose(fp);正常關閉時,fclose返回值為0。返回非零表示有錯誤發(fā)生。10.3文件的讀寫數(shù)10.3.1字符讀寫函讀字符函數(shù)fgetcfgetc函數(shù)的功能是從指定的文件中讀一個字符,函數(shù)調(diào)用的形式為:字符變量=fgetc(文件指針);例如:ch=fgetc(fp);其意義是從打開的文件fp中讀取一個字符并送入ch中。fgetc函數(shù)的使用有以下幾點說明(1)讀取的文件必須是以讀或讀寫方式打開的。(2)讀取字符的結果可以不賦值,但讀出的字符不能保存。(3)在文件內(nèi)部有一個位置指針。用來指向文件的當前讀寫字節(jié)。在文件打開時,該指針總是指向文件的第一個字節(jié)。使用fgetc函數(shù)后,該位置指針將向后移動一個字節(jié)。因此可連續(xù)多次使用fgetc函數(shù),讀取多個字符。fgetc函數(shù)的使用有以下幾點說明文件指針和文件內(nèi)部的位置指針。文件指針是指向整個文件的,須在程序中定義說明,只要不重新賦值,文件指針的值是不變的。文件內(nèi)部的位置指針用以指示文件內(nèi)部的當前讀寫位置,每讀寫一次,該指針均向后移動,它不需在程序中定義說明,而是由系統(tǒng)自動設置的。IloveCprogramming!…fpfgetc(fp)實例【例10.1】讀入文件d:\\cproj\\myfile.txt,在屏幕上輸出。IloveCprogramming!…fpfgetc(fp)
寫字符函數(shù)fputcfputc函數(shù)的功能是把一個字符寫入指定的文件中,函數(shù)調(diào)用的形式為:
fputc(字符量,文件指針);
其中,待寫入的字符量可以是字符常量或變量例如:fputc('a',fp);其意義是把字符a寫入fp所指向的文件中。fputc函數(shù)的使用有以下幾點說明(1)被寫入的文件可以用寫、讀寫,追加方式打開。用寫或讀寫方式打開一個已存在的文件時將清除原有的文件內(nèi)容,寫入字符從文件首開始。如需保留原有文件內(nèi)容,必須以追加方式打開文件。被寫入的文件若不存在,則創(chuàng)建該文件。(2)每寫入一個字符,文件內(nèi)部位置指針向后移動一個字節(jié)。(3)fputc函數(shù)有一個返回值,如寫入成功則返回寫入的字符,否則返回一個EOF。可用此來判斷寫入是否成功。實例【例10.2】從鍵盤輸入一行字符,寫入一個文件,再把該文件內(nèi)容讀出顯示在屏幕上?!纠?0.3】把命令行參數(shù)中的前一個文件名標識的文件,復制到后一個文件名標識的文件中,如命令行中只有一個文件名則把該文件寫到標準輸出文件(顯示器)中。10.3文件的讀寫數(shù)10.3.2字符串讀寫函數(shù)讀字符串函數(shù)fgets功能是從指定的文件中讀一個字符串到字符數(shù)組中,函數(shù)調(diào)用的形式為:
fgets(字符數(shù)組名,n,文件指針);其中的n是一個正整數(shù)。從文件中讀出不超過n-1個字符。最后加上一個串結束標志'\0'。例如: fgets(str,n,fp);從fp所指的文件中讀出n-1個字符送入字符數(shù)組str中。實例【例10.4】從myfile.txt文件中讀入一個含10個字符的字符串。對fgets函數(shù)有兩點說明:(1)在讀出n-1個字符之前,如遇到了換行符或EOF,則讀出結束。(2)fgets函數(shù)也有返回值,其返回值是字符數(shù)組的首地址。寫字符串函數(shù)fputsfputs函數(shù)的功能是向指定的文件寫入一個字符串,其調(diào)用形式為:
fputs(字符串,文件指針);其中字符串可以是字符串常量,也可以是字符數(shù)組名,或指針變量,例如:fputs(“abcd“,fp);其意義是把字符串“abcd”寫入fp所指的文件之中。實例【例10.5】在例13.2中建立的文件string中追加一個字符串。10.3文件的讀寫數(shù)10.3.3數(shù)據(jù)塊讀寫函數(shù)C語言還提供了用于整塊數(shù)據(jù)的讀寫函數(shù)。可用來讀寫一組數(shù)據(jù),如一個數(shù)組元素,一個結構變量的值等。讀數(shù)據(jù)塊函數(shù)調(diào)用的一般形式為:
fread(buffer,size,count,fp);寫數(shù)據(jù)塊函數(shù)調(diào)用的一般形式為:
fwrite(buffer,size,count,fp);數(shù)據(jù)塊讀寫函數(shù)其中:buffer是一個指針,在fread函數(shù)中,它表示存放輸入數(shù)據(jù)的首地址。在fwrite函數(shù)中,它表示存放輸出數(shù)據(jù)的首地址。size表示數(shù)據(jù)塊的字節(jié)數(shù)。count表示要讀寫的數(shù)據(jù)塊塊數(shù)。fp表示文件指針。例如: fread(fa,4,5,fp);其意義是從fp所指的文件中,每次讀4個字節(jié)(一個實數(shù))送入實數(shù)組fa中,連續(xù)讀5次,即讀5個實數(shù)到fa中。數(shù)據(jù)塊讀寫函數(shù)實例【例10.6】從鍵盤輸入兩個學生數(shù)據(jù),寫入一個文件中,再讀出這兩個學生的數(shù)據(jù)顯示在屏幕上。structstu{
charname[10];
intnum;
intage;
charaddr[15];}boya[2],boyb[2],*pp,*qq;10.3文件的讀寫數(shù)10.3.4格式化讀寫函數(shù)fscanf函數(shù),fprintf函數(shù)與前面使用的scanf和printf函數(shù)的功能相似,都是格式化讀寫函數(shù)。兩者的區(qū)別在于fscanf函數(shù)和fprintf函數(shù)的讀寫對象不是鍵盤和顯示器,而是磁盤文件。這兩個函數(shù)的調(diào)用格式為:fscanf(文件指針,格式字符串,輸入表列);fprintf(文件指針,格式字符串,輸出表列);格式化讀寫函數(shù)例如:
fscanf(fp,"%d%s",i,s);fprintf(fp,"%d%c",j,ch);格式化讀寫函數(shù)實例【例10.7】用fscanf和fprintf函數(shù)完成例10.6的問題?!纠?0.6】從鍵盤輸入兩個學生數(shù)據(jù),寫入一個文件中,再讀出這兩個學生的數(shù)據(jù)顯示在屏幕上。structstu{
charname[10];
intnum;
intage;
charaddr[15];}boya[2],boyb[2],*pp,*qq;10.4文件的定位前面介紹的對文件的讀寫方式都是順序讀寫,即讀寫文件只能從頭開始,順序讀寫各個數(shù)據(jù)。但在實際問題中常要求只讀寫文件中某一指定的部分。為了解決這個問題可移動文件內(nèi)部的位置指針到需要讀寫的位置,再進行讀寫,這種讀寫稱為隨機讀寫。實現(xiàn)隨機讀寫的關鍵是要按要求移動位置指針,這稱為文件的定位。文件定位移動文件內(nèi)部位置指針的函數(shù)主要有兩個,即rewind函數(shù)和fseek函數(shù)。文件的定位文件的定位IloveCprogramming!…fpRewind()/fseek()rewind(fp),它的功能是把文件內(nèi)部的位置指針移到文件首。fseek函數(shù)用來移動文件內(nèi)部位置指針,其調(diào)用形式為:fseek(文件指針,位移量,起始點);其中:“文件指針”指向被移動的文件?!拔灰屏俊北硎疽苿拥淖止?jié)數(shù),要求位移量是long型數(shù)據(jù),以便在文件長度大于64KB時不會出錯。當用常量表示位移量時,要求加后綴“L”?!捌鹗键c”表示從何處開始計算位移量,規(guī)定的起始點有三種:文件首,當前位置和文件尾。文件的定位起始點
表示符號
數(shù)字表示───────────────────文件首SEEK—SET0當前位置SEEK—CUR1文件末尾SEEK—END2例如:fseek(fp,100L,0);其意義是把位置指針移到離文件首100個字節(jié)處。fseek函數(shù)一般用于二進制文件。文件的定位【小提示】在文本文件中由于要進行轉(zhuǎn)換,故往往計算的位置會出現(xiàn)錯誤。文件的隨機讀寫在移動位置指針之后,即可用前面介紹的任一種讀寫函數(shù)進行讀寫。由于一般是讀寫一個數(shù)據(jù)據(jù)塊,因此常用fread和fwrite函數(shù)。文件的定位實例【例10.8】在學生文件myfile中讀出第二個學生的數(shù)據(jù)。structstu{
charname[10];
intnum;
intage;
charaddr[15];}boy,*qq;10.5文件的檢錯與處理函數(shù)
常用的文件的檢錯與處理函數(shù)為ferror函數(shù)與clearerr函數(shù):
1.ferror函數(shù)ferror函數(shù)是讀寫文件出錯檢測函數(shù),其調(diào)用格式為:ferror(文件指針);
功能:檢查文件在用各種輸入和輸出函數(shù)進行讀寫時是否出錯,如ferror返回值為0表示未出錯,否則表示有錯。
對同一個文件每一次調(diào)用輸入和輸出函數(shù),都會產(chǎn)生一個新的ferror函數(shù)值,因此應當在調(diào)用一個輸入或輸出函數(shù)后立即檢查ferror函數(shù)的值,否則信息會丟失。在執(zhí)行fopen函數(shù)時,ferror函數(shù)的初始值自動置為0。2.clearerr函數(shù)clearerr函數(shù)的作用是使文件出錯標志和文件結束標志置0,其調(diào)用格式為:clearerr(文件指針);
功能:用于清除文件出錯標志和文件結束標志,使它們?yōu)?值。
假設在調(diào)用一個輸入或輸出函數(shù)時出現(xiàn)錯誤,ferror函數(shù)值為一個非0值,應該立即調(diào)用clearerr(fp),使ferror(fp)的值變成0,以便進行下一次的檢測?!纠?0.9】下面是一個使用ferror函數(shù)和clearerr函數(shù)的示例。#include<stdio.h>#include<stdlib.h>intmain(){FILE*fp;intc;fp=fopen("file.txt","r");if(fp==NULL){perror("Errorinopeningfile");return(-1);}while(1){c=fgetc(fp);if(feof(fp)){break;}printf("%c",c);
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度醫(yī)院心理咨詢師勞動合同規(guī)范
- 二零二五礦山股份合作信息合同:礦山信息資源共享與數(shù)據(jù)安全合作協(xié)議
- 二零二五年度房屋買賣合同房屋買賣合同終止補充協(xié)議
- 勞動合同續(xù)簽中的約定事項
- 兼職活動執(zhí)行人合同
- 農(nóng)用貨車租賃合同
- 品牌推廣協(xié)議范本
- 2025至2030年中國實驗室超能粉碎機數(shù)據(jù)監(jiān)測研究報告
- 2025年中國黃蠟石市場調(diào)查研究報告
- 2025至2031年中國粗梳絲光柔軟羊毛針織紗行業(yè)投資前景及策略咨詢研究報告
- 消防設施定期檢查、檢測、維修保養(yǎng)記錄
- 論十大關系全文
- 涂裝工技能鑒定考試題庫匯總-下(多選、判斷題部分)
- 2021年山東能源集團西北礦業(yè)有限公司招聘筆試試題及答案解析
- 售后服務流程圖
- 建筑地基處理技術規(guī)范JGJ79-2012
- 印象主義、后印象主義課件
- 日常監(jiān)督檢查表
- 隊列訓練教程ppt課件(PPT 86頁)
- 第三章-農(nóng)村公共管理組織課件
- 注塑員工培訓
評論
0/150
提交評論