第16章 文件處理_第1頁
第16章 文件處理_第2頁
第16章 文件處理_第3頁
第16章 文件處理_第4頁
第16章 文件處理_第5頁
已閱讀5頁,還剩26頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論