版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第16章文件學(xué)習(xí)目標(biāo)(1)理解文件的概念、操作種類和讀寫的基本原理。(2)理解C語言中流的概念,掌握文件打開模式。(3)理解順序文件的概念,能使用標(biāo)準(zhǔn)庫函數(shù)fprintf和
fputc建立順序文件,掌握順序文件的讀(使用fscanf
和fgetc)、寫(使用fprintf和fputc)和修改(使用臨時(shí)文件)操作。(4)理解隨機(jī)文件的概念,能使用標(biāo)準(zhǔn)庫函數(shù)fwrite建立隨機(jī)文件,掌握隨機(jī)文件的讀(使用fseek和fread)、寫(
使用fseek和fwrite)、修改和刪除操作。所謂文件----存儲(chǔ)在外部介質(zhì)上的數(shù)據(jù)的集合。
C語言把文件看作是一個(gè)字符(字節(jié))的序列,即由一個(gè)一個(gè)字符(字節(jié))的數(shù)據(jù)順序組成。
C語言中的文件存儲(chǔ)方式分為:ASCII文件和二進(jìn)制文件。ASCII文件(文本文件):每個(gè)字節(jié)存放一個(gè)ASCII代碼,代表一個(gè)字符。二進(jìn)制文件:把內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲(chǔ)形式原樣輸出到磁盤上存放。16.1C文件概述操作系統(tǒng)是以文件為單位對數(shù)據(jù)進(jìn)行管理。以前各章中使用的輸入輸出,都是以終端為對象的,即從終端輸入數(shù)據(jù),運(yùn)行結(jié)果輸出到終端上。從操作系統(tǒng)的角度看,每一個(gè)與主機(jī)相連的輸入輸出設(shè)備都看是一個(gè)文件。例如:終端鍵盤為輸入文件,顯示器和打印機(jī)為輸出文件。例如:整數(shù)100000010011100010000001100010011000000110000
00110000
001100000010011100010000二進(jìn)制存儲(chǔ)形式(2個(gè)字節(jié))ASCII內(nèi)存存儲(chǔ)形式ASCII文件便于字符處理和輸出,,二進(jìn)制文件節(jié)省存儲(chǔ)空間。'1''0''0''0''0'其中:
'0'-----ASCII碼為48'1'-----ASCII碼為49存儲(chǔ)形式(5個(gè)字節(jié))二進(jìn)制數(shù)2.C語言中對文件的存取是以字符(字節(jié))為單位的輸入輸出數(shù)據(jù)流僅受程序控制,不受物理符號控制(如回車換行符)稱這樣的文件為流文件。說明:
1.一個(gè)文件是一個(gè)字符流或二進(jìn)制流。每個(gè)被使用的文件都在內(nèi)存中開辟一個(gè)區(qū),用來存放文件的有關(guān)信息(如:文件的名字,文件狀態(tài)與文件當(dāng)前位置等)。這些信息保存在一個(gè)結(jié)構(gòu)體類型的變量中。結(jié)構(gòu)體類型是由系統(tǒng)定義的,名為FILE
的類型。stdio.h
文件中有以下定義:16.2文件類型指針typedef
struct{ charlevel;/*緩沖區(qū)"滿"或"空"*/ unsignedflags;/*文件狀態(tài)標(biāo)志*/ charfd;/*文件描述字(文件號)*/ unsignedcharhold; charbsize;/*緩沖區(qū)大小*/ unsignedchar*buffer;/*緩沖區(qū)位置*/ unsignedchar*curp;/*下一個(gè)字符的位置*/ unsignedistemp; chartoken;}FILE;例如:
FILE*fp;
表示定義了一個(gè)指向FILE類型結(jié)構(gòu)體的指針變量
fp,可以使fp指向某個(gè)文件的結(jié)構(gòu)體變量,從而通過該結(jié)構(gòu)體變量中的文件信息來訪問該文件
(也就是通過文件指針變量能夠找到與它相關(guān)的文件)。有了FILE類型之后,就可以用它來定義FILE類型的變量,數(shù)組或指針變量。C語言中用fopen()函數(shù)來實(shí)現(xiàn)打開文件,fopen函數(shù)的調(diào)用方法:FILE*fp;
fp=fopen(文件名,使用文件方式);例如:
(1)文件名為A1,是字符串,稱為外部文件名。
(2)使用方式為:只讀方式
(3)fopen函數(shù)帶回指向文件A1的指針,并賦給fp,
使得fp指向A1。
fp
稱為內(nèi)部文件名。fp=fopen("A1","r");16.3文件操作函數(shù)16.3.1文件的打開和關(guān)閉函數(shù)
1.fopen函數(shù)
通過fopen()使內(nèi)部文件名fp和外部文件名A1聯(lián)系上。如果fopen
函數(shù)打開文件失敗,則返回一個(gè)空指針值NULLif(fp=fopen("A1","r")==NULL){printf("打開文件失敗");exit(0);}注意程序中應(yīng)作以下判斷:程序出口文件主要使用方式:r只讀方式,為輸入打開已存在的文本文件。
w只寫方式,為輸出創(chuàng)建新文件,(若文件已存在,則文件內(nèi)容被清空)。
a追加數(shù)據(jù)方式,只用于向已存在的文件的末尾添加數(shù)據(jù)。
rb
為輸入打開一個(gè)已存在的二進(jìn)制文件。wb
為輸出打開一個(gè)二進(jìn)制文件。若文件不存在,則創(chuàng)建新文件
ab
為追加數(shù)據(jù)打開一個(gè)已存在的二進(jìn)制文件.r+為讀/寫方式只能打開一個(gè)已存在的文本文件。
w+為讀/寫方式,建立一個(gè)新文件(若文件已存在,則文件內(nèi)容被清空)。a+為讀/寫方式,保留已存在的文件,可以添加數(shù)據(jù),也可以讀取數(shù)據(jù)
rb+為讀/寫方式打開一個(gè)已存在的二進(jìn)制文件。
wb+為讀/寫方式,建立一個(gè)新的二進(jìn)制文件,若文件已存在,則文件內(nèi)容被清空
ab+為讀/寫方式,保留已存在的文件,可以添加數(shù)據(jù),也可以讀取數(shù)據(jù)在用戶登錄時(shí),系統(tǒng)自動(dòng)打開3個(gè)標(biāo)準(zhǔn)文件:stdin:標(biāo)準(zhǔn)輸入文件,指向終端輸入(例如,鍵盤輸入)。stdout:標(biāo)準(zhǔn)輸出文件,指向終端輸出(例如,顯示器和打印機(jī))。stderr:標(biāo)準(zhǔn)出錯(cuò)文件,指向終端輸出(例如,顯示器)。
關(guān)閉文件---使文件指針不再指向該文件,也就是使文件指針變量與文件脫鉤。
C語言中用fclose()函數(shù)來關(guān)閉文件,fclose函數(shù)的調(diào)用形式: fclose(文件指針);
例如:fclose(fp);
關(guān)閉fp所指的文件。2.文件的關(guān)閉(fclose函數(shù))如果fclose函數(shù)關(guān)閉文件成功,則返回零值;如果fclose函數(shù)關(guān)閉文件失敗,則返回非零值
EOF(-1).EOF為文件結(jié)束符。用戶應(yīng)該養(yǎng)成在程序結(jié)束以前關(guān)閉所有文件的習(xí)慣,如果不關(guān)閉文件將會(huì)丟失數(shù)據(jù)。
fclose函數(shù)在程序結(jié)束以前先把文件緩沖區(qū)中的數(shù)據(jù)輸出到磁盤文件,然后才釋放文件指針變量。注意(1).
fputc函數(shù)把一個(gè)字符寫到磁盤文件上去。定義:int
fputc(ch,fp) charch; FILE*fp;16.3.2文件的讀寫文件打開之后就可以進(jìn)行讀寫,讀寫函數(shù)如下:1.字符輸入輸出函數(shù)把
ch
字符變量中的字符輸出到fp所指向的文件中去。如果輸出成功,則返回ch,否則,返回EOF(即-1)。在stdio.h中有如下定義:
#defineputchar(c)fputc(c,stdout)
所以putchar()
實(shí)際是宏指令。調(diào)用方式為:
fputc(ch,fp);(2).fgetc
函數(shù)從指定的文件讀入一個(gè)字符。該文件必須是以“讀”或“讀寫”方式打開,
定義:int
fgetc(fp) FILE*fp;
調(diào)用方式為:
ch=fgetc(fp);
fgetc函數(shù)從fp
所指定文件的當(dāng)前位置讀入一個(gè)字符賦給ch;同時(shí),文件的當(dāng)前位置加1,如果讀入時(shí)遇到文件結(jié)束符,則返回EOF(即-1)。fgetc()在stdio.h中有如下定義:
#definegetchar()fgetc(stdin)所以getchar()
實(shí)際也是宏指令,因此在文件頭上必須加:#include<stdio.h>....ch=fgetc(fp);while(ch!=EOF){
putchar(ch);
ch=fgetc(fp);}....EOF定義為-1,為文件結(jié)束符只適用于文本文件例如:順序讀入一個(gè)文本文件中的字符顯示在屏幕上。EOF
是在stdio.h中定義的符號常量,值為-1。while(!feof(fp)){c=fgetc(fp);
putchar(c);…..}但對于二進(jìn)制文件,某個(gè)字節(jié)中的數(shù)有可能是-1,因此難于用EOF判斷結(jié)束,這時(shí)可以用函數(shù)feof(fp)來測試fp所指的文件當(dāng)前是否“文件結(jié)束”,是則返回1。不是則返回0;feof()也適用于文本文件(3).fputs()函數(shù)把一個(gè)字符串寫到磁盤文件上去。定義:int
fputs(str,fp) char*str; FILE*fp; 調(diào)用方式為:
fputs(str,fp);字符串結(jié)束符不寫入文件。如果輸出成功,則返回0,否則,返回EOF(即-1)。注意(4).fgets()函數(shù)從指定的文件讀入一個(gè)字符串。定義:char*fgets(str,n,fp)charstr[];
intn; FILE*fp;從fp指定的文件讀入一個(gè)最大長度為n-1的字符串存入數(shù)組str,并在數(shù)組str中加‘
\0
’作為字符串結(jié)束符。調(diào)用方式為:
fgets(str,n,fp);
如果輸出成功,則返回str,否則,返回NULL。#include<stdio.h>voidmain(){FILE*fp;charch,filename[10];
printf(”Inputfilename:");
scanf("%s",filename);if((fp=fopen(filename,"w"))==NULL){printf(”Cannotopenfile\n");exit(0);}
ch=getchar();
while(ch!='#'){fputc(ch,fp);
putchar(ch);
ch=getchar();}
fclose(fp);}將鍵盤輸入的一些字符存入磁盤文件,直到輸入一個(gè)#為止清除緩沖區(qū),關(guān)閉文件,結(jié)束程序?qū)⒆址麑懭胛募⒆址敵龅浇K端exit()是出口函數(shù)。存放創(chuàng)建的新文件名例16.1
#include<stdio.h>main(){FILE*p;charch,fname[10];printf("\ninputfilename:");gets(fname);fp=fopen(fname,"w");printf("\nEnterdata:\n");while(ch=getchar()
!=`#`)fputc(ch,fp
);fclose(fp);}下面的程序用來統(tǒng)計(jì)文件“a.dat”中字符的個(gè)數(shù)
#include<stdio.h>
main()
{FILE*fp;
longnum=0;
if((fp=fopen("a.dat","r"))==NULL)
{printf("Can'topenfile!\n");exit(0);}
while(!feof(fp))
{fgetc(fp);num++;}
printf("num=%d\n",num);
fclose(fp);
}運(yùn)行情況如下:Inputfilename:file1(輸入磁盤文件名)computerandc#(輸入一個(gè)字符串寫到磁盤文件
file1中去)computerandc(顯示一個(gè)字符串)最后說明一點(diǎn),為了書寫方便,系統(tǒng)在stdio.h把fputc
和fgetc定義為宏名putc
和getc: #defineputc(ch,fp)fputc(ch,fp) #definegetc(fp)fgetc(fp)#include<stdio.h>voidmain(){FILE*in,*out;charch,infile[10],outfile[10];
printf("Entertheinfilename:\n");
scanf("%s",infile);
printf("Entertheoutfilename:\n");
scanf("%s",outfile);if((in=fopen(infile,"rb"))==NULL){printf("canntopeninfile\n"); exit(0);}if((out==fopen(outfile,"wb"))==NULL){printf("canntopenoutfile\n"); exit(0);}while(!feof(in)){ch=fgetc(in); fputc(ch,out);}
fclose(in);fclose(out);}運(yùn)行情況如下:Entertheinfilename:file1<CR>Entertheoutfilename:file2<CR>準(zhǔn)備工作打開文件復(fù)制
將一個(gè)二進(jìn)制磁盤文件的信息復(fù)制到另一個(gè)磁盤文件中。例16.2
fgetc函數(shù)和fputc函數(shù)用來讀寫文件中的一個(gè)字符。當(dāng)要求一次讀寫一個(gè)數(shù)據(jù)塊時(shí),可以用fread函數(shù)和fwrite
函數(shù)定義形式:int
fread(buffer,size,count,fp);
int
fwrite(buffer,size,count,fp);
其中:buffer是指針,數(shù)組的入口地址。
charbuffer[]:1.對于fread,把從fp所指定的文件中讀出數(shù)據(jù),
存放在內(nèi)存數(shù)組buffer[]中;2.對于fwrite,把buffer[]中的數(shù)據(jù)輸出到
fp所指定的文件中去.
(5).fread
函
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 內(nèi)蒙古開魯縣高中生物 第四章 種群和群落 4.1 種群的特征教案 新人教版必修3
- 年九年級語文上冊 第一單元 5《我看》教案 新人教版五四制
- 5 國家機(jī)構(gòu)有哪些 教學(xué)設(shè)計(jì)-2024-2025學(xué)年道德與法治六年級上冊統(tǒng)編版
- 兩位數(shù)加兩位數(shù)進(jìn)位加法練習(xí)(教學(xué)設(shè)計(jì))-2023-2024學(xué)年二年級上冊數(shù)學(xué)人教版
- 外研版(2019) 必修第二冊 Unit 3 On the Move Starting out 教案
- 蛋品加工廠市場營銷策略
- Unit 2 Going to school 第一課時(shí)(教學(xué)設(shè)計(jì))-2024-2025學(xué)年滬教牛津版(深圳用)英語五年級上冊
- 尋找“黏斗士”(教學(xué)設(shè)計(jì))-2023-2024學(xué)年四年級下冊綜合實(shí)踐活動(dòng)滬科黔科版
- 1 古詩三首 村晚教案-2023-2024學(xué)年五年級下冊語文統(tǒng)編版
- Unit 5 綜合閱讀提升2024-2025學(xué)年九年級上冊英語配套教學(xué)設(shè)計(jì)(人教新目標(biāo)Go For It!)
- 酒體設(shè)計(jì)課件
- 2024年廣東越秀集團(tuán)招聘筆試參考題庫含答案解析
- 危巖穩(wěn)定性計(jì)算表格-滑移式-傾倒式-墜落式-完整版
- 極限配合與測量技術(shù)期末考試試卷題庫及答案
- 《太陽出來喜洋洋》課件
- 強(qiáng)迫癥的共病現(xiàn)象
- 小學(xué)數(shù)學(xué)教學(xué)中融入思政元素的行動(dòng)研究
- 塑料打磨房除塵設(shè)計(jì)方案
- Unit1-Unit2作文模版 人教版九年級英語全冊
- 2023年河南省農(nóng)業(yè)科學(xué)院招聘68人筆試參考題庫(共500題)答案詳解版
- 動(dòng)脈粥樣硬化斑塊的篩查與臨床管理專家共識(shí)(2022版)
評論
0/150
提交評論