c語(yǔ)言程序設(shè)計(jì) 文件_第1頁(yè)
c語(yǔ)言程序設(shè)計(jì) 文件_第2頁(yè)
c語(yǔ)言程序設(shè)計(jì) 文件_第3頁(yè)
c語(yǔ)言程序設(shè)計(jì) 文件_第4頁(yè)
c語(yǔ)言程序設(shè)計(jì) 文件_第5頁(yè)
已閱讀5頁(yè),還剩29頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

國(guó)守錨甌盥器

#include<math.h>

?第九章

#defineEPS1

voidmain

[對(duì)月目定義函數(shù)原型說(shuō)明

scan

doub

double

while(

n=n+l;

信息科學(xué)技術(shù)學(xué)院C語(yǔ)言程序設(shè)計(jì)教學(xué)組

±||

第九章文件

內(nèi)容提要:

文本文件與二進(jìn)制文件文件分類(lèi)

緩沖文件系統(tǒng)概念緩沖文件系統(tǒng)

文件的指針文件的指針

文件的打開(kāi)與關(guān)閉文件打開(kāi)與關(guān)閉

文件應(yīng)用文件應(yīng)用

第九章文件

文件是指存儲(chǔ)在外部介質(zhì)

上,且按文件名訪問(wèn)的一組

信息序列。

一、文件分類(lèi)

?文本文件(字符代碼文件或ASCII代碼文件)

由一個(gè)一個(gè)字符組成,每一個(gè)字符用一個(gè)

ASCII代碼表示,如123.45以ASCII代碼形式

存儲(chǔ)到磁盤(pán)需要6個(gè)字節(jié)。

特點(diǎn):可通過(guò)顯示器或打印機(jī)顯示,即可讀,

比較直觀。

一、文件分類(lèi)

?非文本文件(二進(jìn)制文件):是指以數(shù)據(jù)

在內(nèi)存中的存儲(chǔ)形式原樣輸出存儲(chǔ)到磁盤(pán)上的

文件。如123.45在內(nèi)存中以浮點(diǎn)數(shù)形式存儲(chǔ)占

4個(gè)字節(jié),不管一個(gè)實(shí)數(shù)多大都占4字節(jié)。

特點(diǎn):節(jié)省存儲(chǔ)空間,輸入輸出無(wú)需轉(zhuǎn)換

速度快,不便閱讀。

說(shuō)明:

?一個(gè)c文件是一個(gè)字節(jié)流或二進(jìn)制流,它把

數(shù)據(jù)看作是一連串的字符序列(字節(jié)),而不

考慮記錄的界限,即c文件并不是由記錄組成的。

?由于對(duì)文件的操作要與各種外部設(shè)備發(fā)生聯(lián)

系,因此對(duì)文件的輸入輸出(讀寫(xiě))過(guò)程是通

過(guò)操作系統(tǒng)來(lái)實(shí)現(xiàn)的。對(duì)文件的讀寫(xiě)都是通過(guò)

標(biāo)準(zhǔn)的I/O函數(shù)進(jìn)行的。

二、緩沖文件系統(tǒng)(標(biāo)準(zhǔn)I/O)和非緩沖文件系統(tǒng)

?緩沖文件系統(tǒng)(又稱(chēng)標(biāo)準(zhǔn)或高層文件系統(tǒng))

特點(diǎn):對(duì)程序中的每一個(gè)文件都在內(nèi)存中開(kāi)辟

一個(gè)“緩沖區(qū)”。

作用:從磁盤(pán)文件讀入的數(shù)據(jù)先送到“輸入緩

沖區(qū)”中,然后再?gòu)木彌_區(qū)依次將數(shù)據(jù)送給接

收變量。

程序數(shù)據(jù)區(qū)(512KB)

在向磁盤(pán)文件輸出數(shù)據(jù)時(shí),先將程序數(shù)據(jù)區(qū)中變量

或表達(dá)式的值送到“輸出文件緩沖區(qū)”中,待裝滿(mǎn)后

才一起輸出給磁盤(pán)文件。目的減少對(duì)磁盤(pán)的讀寫(xiě)次數(shù),

即一次可以讀入一批數(shù)據(jù)或輸出一批數(shù)據(jù)。

二、緩沖文件系統(tǒng)(標(biāo)準(zhǔn)I/O)和非緩沖文件系統(tǒng)

?非緩沖文件系統(tǒng):不由系統(tǒng)自動(dòng)設(shè)置所需

緩沖區(qū),而由用戶(hù)自己根據(jù)需要設(shè)置。

?新的ANSI標(biāo)準(zhǔn)只建議使用緩沖系統(tǒng),并對(duì)

緩沖文件系統(tǒng)的功能進(jìn)行了擴(kuò)充,使既能用于

處理字符代碼文件,也能處理二進(jìn)制文件。

三、文件型指針類(lèi)型

對(duì)文件的操作是通過(guò)文件指針實(shí)現(xiàn)的。關(guān)鍵

的概念是“”。

調(diào)用一個(gè)文件需要的信息:.

?文件當(dāng)前讀寫(xiě)的位置;

?與該文件對(duì)應(yīng)的內(nèi)存緩沖區(qū)的地址;

?緩沖區(qū)未被處理的字符數(shù)(字符指針);

?文件的操作方式等

JL>1II1I11y.x-lilLlASP]\生

三、文件型指針類(lèi)型

系統(tǒng)內(nèi)部定義了一個(gè)稱(chēng)FILE的結(jié)構(gòu)型類(lèi)型。

typedefstruct{

int_fd;//文件號(hào)

int_cleft;//緩沖區(qū)中剩余的字符

int_mode;//文件操作模式

char*nextc;//下一個(gè)字符位置

char*_buff;//文件緩沖區(qū)位置

1FILE;

四、文件的打開(kāi)和關(guān)閉

1.打開(kāi)文件:是在用戶(hù)程序和操作系統(tǒng)之

間建立起聯(lián)系,程序要把操作的文件的一些信

息通知操作系統(tǒng),如文件名、文件操作方式

(讀/寫(xiě)):

需要先確認(rèn)此文件是否已存在,并

將讀當(dāng)前位置設(shè)定為文件的開(kāi)頭。

寫(xiě)文件:需要檢查原來(lái)是否有同名文件,如

有則將該文件原有內(nèi)容刪除,如無(wú)同名文件就

建立一個(gè)新文件,然后將寫(xiě)當(dāng)前位置設(shè)定于文

件的開(kāi)頭,以便從文件開(kāi)頭寫(xiě)入數(shù)據(jù)。

1.文件的打開(kāi)方式:

FILE*fp;

if((fp二"pen(〃文件名〃,〃使用文件方式〃))二二NULL){

printf(z,cannotopenthisfile.'n");

exit(0);

)

說(shuō)明:

?文件名可以是字符串常量、數(shù)組名或字符指針。

?使用文件方式參見(jiàn)附表。

FILE*fp;

if((fp=fopen(〃文件名〃,〃使用文件方式〃))二二NULL){

printf(,zcannotopenthisfile.'n");exit(0);

)

文件使用方式含義

r(只讀)為輸入打開(kāi)一個(gè)字符文件

w(只寫(xiě))為輸出打開(kāi)一個(gè)字符文件

a(追加)向字符文件尾部增補(bǔ)數(shù)據(jù)

rb(只讀)為輸入打開(kāi)一個(gè)二進(jìn)制文件

wb(只寫(xiě))為輸出打開(kāi)一個(gè)二進(jìn)制文件

ab(追加)向二進(jìn)制文件尾部增補(bǔ)數(shù)

r+(讀寫(xiě))為讀/寫(xiě)打開(kāi)一個(gè)字符文件

w+(讀寫(xiě))為讀/寫(xiě)建立一個(gè)新的字符文件

a+(讀寫(xiě))為讀/寫(xiě)打開(kāi)一個(gè)字符文件

rb+(讀寫(xiě))為讀/寫(xiě)打開(kāi)一個(gè)二進(jìn)制文件

wb+(讀寫(xiě))為讀/寫(xiě)建立一個(gè)新的二進(jìn)制文件

ab+(讀寫(xiě))為讀/寫(xiě)打開(kāi)一個(gè)二進(jìn)制文件

2.文件的關(guān)閉

文件的關(guān)閉形式:

fclose(fp);

功能:將fp所指文件關(guān)閉。

?釋放文件有關(guān)信息區(qū);

?將輸出文件緩沖區(qū)的內(nèi)容(無(wú)論緩沖區(qū)是否為滿(mǎn))

都輸出寫(xiě)入文件,然后關(guān)閉文件,這樣可防止丟

失本來(lái)應(yīng)寫(xiě)入文件的數(shù)據(jù)。

五、文件應(yīng)用示例

[例1]:格式化的輸入輸出。

功能:將輸出按格式串規(guī)定輸出到fp所指文件。

功能:從fp所指文件按格式串讀入數(shù)據(jù)。函數(shù)執(zhí)行成功

返回讀得的數(shù)據(jù)項(xiàng)個(gè)數(shù);若在讀第一項(xiàng)前已到達(dá)文件

結(jié)束處,則返回EOF。

#incIude<stdio.h>

#incIude<process.h>

#incIude<string.h>

voidmain(){

FILE*fp;charname[10];intnum;fIoatscore;

if((fp=fopen("fiIe3.txt",〃w+"))二二NULL){

printf(z,cannotopenthisfile.\n〃);

exit(0);

)

printf(z,entername,num,score:,z);

,z

scanf(%s%d%f〃,name,&num,&score);

whiIe(strIen(name)>1){

fprintf(fp,"%s%d%f\n,z,name,num,score);

printf(z,entername,num,score:;

scanf(,z%s%d%f,z,name,&num,&score);

rewind(fp);

while(fscanf(fp,z,%s%d%f〃,

name,&num,&score)!=EOF)

printf(z,%-10s%6d%6.2f\n,z,name,num,score);

fcIose(fp);

)

輸入:entername,num,score:zhangsan050190/

entername,num,score:liming050285/

entername,num,score:gaofei050395/

entername,num,score:000/

輸出:zhangsan050190.00

1iming050285.00

gaofei050395.00

[例2]:數(shù)據(jù)塊(二進(jìn)制形式)的讀寫(xiě)。

功能:從指定文件讀入count個(gè)大小為size的字

節(jié)數(shù)據(jù)塊,存入buffer所指存儲(chǔ)單元。返回所

讀的數(shù)據(jù)項(xiàng)個(gè)數(shù),如遇文件結(jié)束或出錯(cuò)返回0。

功能:buffer所指存儲(chǔ)單元的數(shù)據(jù)取

size*count個(gè)字節(jié)送fp所指文件。返回寫(xiě)到fp

所指文件中的數(shù)據(jù)項(xiàng)個(gè)數(shù)。

[例2]:數(shù)據(jù)塊(二進(jìn)制形式)的讀寫(xiě)。

說(shuō)明:

?buffer'為輸入輸出在內(nèi)存中存放的首地址。

?siz為讀、寫(xiě)的字節(jié)數(shù),即數(shù)據(jù)塊的大小。

?count為輸入輸出的數(shù)據(jù)項(xiàng)個(gè)數(shù)。

?fread()和-riteO用于二進(jìn)制文件的輸入

輸出

#incIude<stdio.h>

#incIude<process.h>

#defineSIZE4

structstudent{

charname[10];intnum,age;charaddr[15];

}stud[SIZE];

voidsave_Ioad(){

FILE*fp;inti;

,,

if((fp=fopen(stu_Iist","wb+〃))=二NULL){

printf("cannotopenfile.'n");exit(0);

1

for(i=0;i<SIZE;i++)

if(fwrite(&stud[i],sizeof(structstudent),1,fp)!=1){

printf(,,fiIewriteerror!\n,");exit(0);

rewind(fp);

for(i=0;i<SIZE;i++)

if(fread(&stud[i],sizeof(structstudent),1,fp)!=0)

printf-1Os%4d%4d%75s\n”,stud[i].name,

stud[i].num,stud[i].age,stud[i].addr);

)

voidmain(){

inti;

for(i=0;i<SIZE;i++)

scanf(,z%s%d%d%s”,stud[i].name,&stud[i].num,

&stud[i].age,stud[i].addr);

save_Ioad();

)

輸入:

zhang100119room_101/

Ii100220room_102/

wang100321room_103/

zhao100421room104/

輸出:

zhang100119room_101

Ii100220room_102

wang100321room_103

zhao100421room104

[例3]:具有文件拷貝功能的程序fiIecopy.c

說(shuō)明兩個(gè)問(wèn)題:命令行參數(shù)的應(yīng)用和文件的字

符輸入與輸出應(yīng)用。

功能:從指定文件讀入一個(gè)字符。

功能:把一個(gè)字符寫(xiě)到指定文件中去。

[例3]:具有文件拷貝功能的程序fiIecopy.c

#incIude<stdio.h>

#incIude<process.h>

#incIude<string.h>

filecopy(FILE*fp1,FILE*fp2){

charc;

whiIe((c=fgetc(fp1))!=EOF)

fputc(c,fp2);

voidmain(intargc,char*argv[]){

filecopy(FILE*fp1,FILE*fp2);

FILE*fp1,*fp2;

if(argc>1){

if((fp1=fopen(*++argv,〃r"))二二NULL){

printf(〃can\'tfopen%s\n',*argv);exit(0);

1

if((fp2=fopen(*++argv,"w"))二二NULL){

printf(,,can\,tfopen%s\n”,*argv);exit(0);

1

fiIecopy(fp1,fp2);

)

運(yùn)行時(shí)情況:

$vifiIecopy.c/

$ccfiIe.c-ofiIecopy/

$/

運(yùn)行時(shí)數(shù)據(jù)狀態(tài):argc

3

argv[]

argv[0]

argv[1]

argv[2]

[例4]:文件的字符串的輸入輸出處理

fgets(str,n9fp)字符串輸入函數(shù)。

,其功能是從fp指定的文件中讀取一個(gè)串,若滿(mǎn)足以

下條件讀取結(jié)束:①已讀取n-1個(gè)字符、②當(dāng)前讀取

到的字符是回車(chē)符、③已讀取到文件尾。

/讀取的字符個(gè)數(shù)至多n-1個(gè),余下的一個(gè)字節(jié)空間作

為加''0'串結(jié)束符。

/讀取回車(chē)符時(shí),也作為一個(gè)字符送入由str所指的內(nèi)

存緩沖區(qū)。然后再加一個(gè)字符串結(jié)束符'\0'

str為數(shù)組名或字符指針;n為讀取字符個(gè)數(shù)。

[例4]:文件的字符串的輸入輸出處理

字符串輸出(寫(xiě))函數(shù)

其功能是將str所指定的字符串寫(xiě)到fp指向的文件中。

與fgets。函數(shù)在輸入字符串末尾自動(dòng)加(\Of特性

對(duì)應(yīng),fputs。函數(shù)在將C字符串寫(xiě)入文件時(shí),其末尾

的‘\0’字符自動(dòng)舍去。

fputs。與puts。功能不同,fputs。舍去串結(jié)束符

而puts。把它轉(zhuǎn)換成回車(chē)符輸出。

#

溫馨提示

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

評(píng)論

0/150

提交評(píng)論