C程序設(shè)計:CH13 文件_第1頁
C程序設(shè)計:CH13 文件_第2頁
C程序設(shè)計:CH13 文件_第3頁
C程序設(shè)計:CH13 文件_第4頁
C程序設(shè)計:CH13 文件_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第十三章文件掌握文件以及緩沖文件系統(tǒng)、文件指針的概念;學(xué)會使用文件打開、關(guān)閉、讀、寫等文件操作函數(shù)。文件的分類按數(shù)據(jù)的組織形式:ASCII文件(文本文件):每一個字節(jié)放一個ASCII代碼二進制文件:把內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲形式原樣輸出到磁盤上存放.例:整數(shù)10000在內(nèi)存中的存儲形式以及分別按ASCII碼形式和二進制形式輸出如下圖所示:§13.1C文件概述(續(xù))§13.1C文件概述(續(xù))文件的分類ASCII文件和二進制文件的比較:ASCII文件便于對字符進行逐個處理,也便于輸出字符。但一般占存儲空間較多,而且要花費轉(zhuǎn)換時間。二進制文件可以節(jié)省外存空間和轉(zhuǎn)換時間,但一個字節(jié)并不對應(yīng)一個字符,不能直接輸出字符形式。三、文件的基本操作

打開文件∶把文件名等目錄信息從磁盤上讀入內(nèi)存并存入結(jié)構(gòu)體。⑵關(guān)閉文件∶把內(nèi)存結(jié)構(gòu)體中的文件名等目錄信息寫入磁盤。(3)寫文件∶向文件寫內(nèi)容。(4)讀文件∶從文件讀內(nèi)容。四、文件的輸入輸出方式

C語言對文件進行處理分為:

非緩沖文件系統(tǒng)緩沖文件系統(tǒng)§13.2C文件類型指針一、文件類型(FILE)

每個被使用的文件都在內(nèi)存中開辟一個區(qū),用來存放文件的有關(guān)信息(如文件名,狀態(tài),當(dāng)前位置等)。這些信息保存在一個結(jié)構(gòu)體類型的變量中。結(jié)構(gòu)體類型由系統(tǒng)定義為“FILE”。有的C版本在stdio.h文件中有如下定義:typedef

struct{int_fd;;/*文件號*/

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

int_mode;/*文件操作模式*/char*_nexttc;/*下一個字符位置*/char*_buff;/*文件緩沖區(qū)位置*/}FILE;二、定義FILE類型指針變量FILE類型的指針變量定義方法∶FILE*指針變量名;例如:FILE*fp;含義:fp是一個指向FILE類型結(jié)構(gòu)體的指針變量。

可以使fp指向某個文件的結(jié)構(gòu)體變量,從而通過該結(jié)構(gòu)體變量中的文件信息能夠訪問該文件。

#include<stdio.h>§13.3文件的打開和關(guān)閉函數(shù)一、文件的打開函數(shù)(fopen函數(shù))(1)調(diào)用方式:

FILE*fp;fp=fopen(文件名,文件的使用方式);所要打開的文件名。必須是用雙引號引起的字符串常量。

具有特定含意的符號也必須由雙引號引起用戶定義的文件類型指針變量⑵功能:以指定的方式打開指定的文件,若操作成功,則返回一個指向該文件的指針,若打開文件時出現(xiàn)錯誤,則返回空指針NULL。

例∶FILE*fp;

fp=fopen("stu.dat","r");⑶文件使用方式P333

基本方式字符(單獨使用是對文本文件):

r

僅為讀而打開。(只讀文件)

w

僅為寫而打開。(建立新文件)

a

僅為添加而打開。(寫舊文件)

按二進制格式讀寫文件(基本方式字符+“b”)∶

b

輔助說明,按二進制格式讀寫文件。

同時進行讀寫文件(基本方式字符+[“b”]+“+”)∶+

輔助說明,可同時進行讀和寫文件。

例如:fp=(“stu.dat”,“rb”);例如:fp=(“stu.dat”,“r+”);例:#include<stdio.h>main(){FILE*fp;

if((fp=fopen("stu.dat","r"))==NULL){printf("filenotfound.");exit(0);}else{printf("fileopenedok!");

fclose(fp);}}程序運行結(jié)果:如果磁盤上存在文件stu.dat,屏幕上會顯示fileopenok!,否則屏幕上顯示filenotfound.。常使用此方法打開一個文件exit函數(shù)的功能是關(guān)閉所有文件,終止程序運行。exit(0)為正常終止程序二、文件的關(guān)閉函數(shù)(fclose函數(shù))(1)調(diào)用方式:

fclose(文件指針);

⑵功能:關(guān)閉由文件指針指定的文件,把緩沖區(qū)中的數(shù)據(jù)(未裝滿緩沖區(qū)的數(shù)據(jù))輸出到磁盤上,釋放文件指針。例如:FILE*fp;

fp=fopen(“output.dat”,“r+”);

……/*進行讀寫操作*/

fclose(fp);注意:fopen函數(shù)和fclose函數(shù)總是成對出現(xiàn)的。無fclose函數(shù)時會導(dǎo)致部分數(shù)據(jù)丟失!以讀寫方式打開一個已有的文本文件file1,下面fopen函數(shù)正確的調(diào)用方式是()。A)FILE*fpfp=fopen("file1","r")B)FILE*fpfp=fopen("file1","r+")C)FILE*fpfp=fopen("file1","rb")D)FILE*fpfp=fopen("file1","rb+")§13.4文件的讀寫函數(shù)一、fputc函數(shù)和fgetc函數(shù)這兩個函數(shù)是以字符為單位進行文件讀寫的函數(shù)。1.fputc函數(shù)一般調(diào)用形式:

fputc(字符常量或變量,文件指針);功能:把指定字符存入文件指針?biāo)傅奈募小H绻敵鍪?,則返回一個EOF(-1)。例如:fputc(ch,fp);(其中ch為字符變量,fp為文件指針)

含義:將ch的值輸出到fp所指向的文件中去。(EOF是在stdio.h文件中定義的符號常量,值為-1)2.fgetc函數(shù)一般調(diào)用形式:

字符變量=fgetc(文件指針);功能:從文件指針?biāo)肝募凶x一個字符賦給指定的字符變量。當(dāng)遇文件結(jié)束符,返回一個文件結(jié)束標(biāo)志EOF(-1)。例如:ch=fgetc(fp);

其中ch為字符變量,fp為文件指針。含義:從fp所指向的文件中讀入一個字符賦給字符變量ch。例:閱讀程序。

#include"stdio.h"#defineNULL0main(){FILE*fp;intcount=0;charc;if((fp=fopen("stu.txt","r"))==NULL){printf("Can’tOpenFile\n");exit(0);}c=fgetc(fp);while(c!=EOF){count++;c=fgetc(fp);}printf("count=%d\n",count);fclose(fp);}若文件file.txt的內(nèi)容是:abcd1234ABCD輸出結(jié)果:12這是讀一個文本文件中字符,并判斷文件是否結(jié)束的常用方法

關(guān)于文件讀寫狀態(tài)的檢測

檢測函數(shù)調(diào)用是否成功,可有兩種手段來檢測:1.由函數(shù)的返回值來確定2.用文件狀態(tài)檢測函數(shù)feof、ferror、fclearerrfeof(fp):測試fp所指向的文件的位置是否是文件尾。若已達到文件尾,函數(shù)返回非零值,否則返回0。常用程序段:while(!feof(fp))……ferror(fp):測試對fp所指向的文件的操作是否出錯。若出錯,函數(shù)返回非零值,否則返回0。fclearerr(fp):使ferror和feof函數(shù)值置0。EOF和feof區(qū)別1.EOF不是可輸出字符,因此不能在屏幕上顯示。由于字符的ASCII碼不可能出現(xiàn)-1,因此EOF定義為-1是合適的。當(dāng)讀入的字符值等于-1時,表示讀入的已不是正常的字符而是文件結(jié)束符。2.但是二進制文件讀入一個字節(jié)中的二進制數(shù)據(jù)有可能是-1,這恰好是EOF值,所以提供一個feof來測試fp所指向文件是否結(jié)束3.所以EOF只能對文本文件,feof文本和二進制文件都可以§13.4文件的讀寫(續(xù))fputc和fgetc函數(shù)使用舉例:例13.2將一個磁盤文件中的信息復(fù)制到另一個磁盤文件中

。

#include<stdlib.h>#include<stdio.h>main(){FILE*in,*out;charch,infile[10],outfile[10];

printf("Entertheinfilename:\n");

scanf("%s",infile);

printf("Entertheoutfilename:\n");in

scanf("%s",outfile);

if((in=fopen(infile,"r"))==NULL){ printf("cannotopeninfile\n");exit(0);}

if((out=fopen(outfile,"w"))==NULL){ printf("cannotopenoutfile\n");exit(0);}

while(!feof(in))fputc(fgetc(in),out);

fclose(in);

fclose(out);}運行情況如下:Entertheinfilenamefile1.c(輸入原有磁盤文件名Entertheoutfilename:file2.c(輸入新復(fù)制的磁盤文件名)程序運行結(jié)果是將file1.c文件中的內(nèi)容復(fù)制到file2.c中去。

二、fread函數(shù)和fwrite函數(shù)

fread(buffer,size,count,fp);

fwrite(buffer,size,count,fp);buffer:是一個指針。(是起始地址)。對fread來說,它是讀入數(shù)據(jù)的存放地址。對fwrite來說,它是輸出數(shù)據(jù)的地址。size:要讀寫的字節(jié)數(shù)。count:要進行讀寫多少個size字節(jié)的數(shù)據(jù)項。功能:對fp所指的文件讀寫buffer所指的size*count

個字節(jié)數(shù)據(jù)。

例如:fread(f,4,2,fp);(其中f是實型數(shù)組名):這個函數(shù)從fp所指向的文件讀入2個4個字節(jié)的數(shù)據(jù),存儲到數(shù)組f中。fwrite(f,4,2,fp):這個函數(shù)從數(shù)組f中讀入2個4個字節(jié)的數(shù)據(jù)(即2個數(shù)組元素),寫入到fp所指向的文件中。fread和fwrite一般對二進制文件讀寫例1把數(shù)組a寫入文件fa;再從fa讀入數(shù)組b。

#include"stdio.h"main(){FILE*fp;

inta[100]={1,5,6,78,21,34,67,87,23},b[100],i;

fp=fopen("tmp","wb");fwrite(a,sizeof(a),1,fp);/*fwrite(a,sizeof(int),100,fp);*/

fclose(fp);

fp=fopen("tmp","rb");fread(b,sizeof(a),1,fp);for(puts(""),i=0;i<10;i++)printf("%6d",b[i]);

fclose(fp);}整數(shù)塊輸入函數(shù)fread(&Iarray,2,16,fp)的功能是()。A)從數(shù)組Iarray中讀取16次2字節(jié)數(shù)據(jù)存儲到fp所指的文件中。B)從fp所指的數(shù)據(jù)文件中讀取16次2字節(jié)的數(shù)據(jù)存儲到數(shù)組Iarray中。C)從數(shù)組Iarray中讀取2次16字節(jié)數(shù)據(jù)存儲到fp所指文件中。D)從fp所指的數(shù)據(jù)文件中讀取2次16字節(jié)的數(shù)據(jù)存儲到數(shù)組Iarray中。已知函數(shù)的調(diào)用形式:fread(buffer,size,count,fp);其中buffer代表()。A)一個整型變量,代表要讀入的數(shù)據(jù)項總數(shù)。B)一個文件指針,指向要讀的文件。C)一個存儲區(qū),存放要讀的數(shù)據(jù)項。D)一個指針變量,它指向要讀入數(shù)據(jù)的存放地址。三、fprintf

函數(shù)和fscanf函數(shù)這兩個函數(shù)是進行格式讀寫文件的函數(shù)。一般調(diào)用形式:

fprintf(文件指針,格式字符串,輸出表列);

fscanf(文件指針,格式字符串,輸入表列);例如:fprintf(fp,“%d,%6.2f”,i,x);功能:按指定格式將數(shù)據(jù)寫到指定文件中?;驈闹付ㄎ募锤袷捷斎霐?shù)據(jù)。又如:fscanf(fp,“%d,%f”,&i,&x);四、fputs函數(shù)和fgets函數(shù)這兩個函數(shù)是以字符串為單位進行文件讀寫的函數(shù)。一般調(diào)用形式:

fputs(字符串,文件指針);

1.fputs函數(shù)功能:向指定文件輸入一個字符串。例如:fputs(str,fp);(其中str是字符數(shù)組名)含義:向fp

所指向的文件中輸出str中的字符串。2.fgets函數(shù)fgets(字符串,字符串長度,文件指針);

功能:從指定文件中讀入一個字符串。

例如:fgets(str,n,fp);(其中str是字符數(shù)組名)含義:從fp指向的文件讀取長度為n-1的字符串,最后加一個‘\0’存入字符數(shù)組str中。調(diào)用形式:

putw和getw函數(shù)putw()和getw()函數(shù)調(diào)用:putw(int

i,FILE*fp);inti=getw(FILE*fp);函數(shù)功能:

對磁盤文件中讀寫一個字(整數(shù))到fp所指向的文件中。例:putw(10,fp);i=getw(fp);整數(shù)字輸出函數(shù)putw(32767,fpoint)的功能是()。A)讀取fpoint指針?biāo)肝募械恼麛?shù)字32767。B)將兩字節(jié)整數(shù)32767,輸出到文件fpoint中。C)將兩字節(jié)整數(shù)32767輸出到fpoint所指的文件中。D)從文件fpoint中讀取整數(shù)字32767。五、文件的定位函數(shù)1.rewind函數(shù)一般調(diào)用形式:

rewind(文件指針);

功能:使位置指針重新返回文件的開頭。2.fseek函數(shù)一般調(diào)用形式:

fseek(文件指針,位移量,起始點

溫馨提示

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

評論

0/150

提交評論