c語言程序設(shè)計基礎(chǔ)8文件_第1頁
c語言程序設(shè)計基礎(chǔ)8文件_第2頁
c語言程序設(shè)計基礎(chǔ)8文件_第3頁
c語言程序設(shè)計基礎(chǔ)8文件_第4頁
c語言程序設(shè)計基礎(chǔ)8文件_第5頁
已閱讀5頁,還剩41頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第第8章章 文件文件2 第第8 8章章 文件文件 8.2 文件的打開與關(guān)閉文件的打開與關(guān)閉 8.3 文件的讀寫文件的讀寫 8.4 文件的指針定位文件的指針定位 8.1 文件概述文件概述 8.5 文件的其他檢測函數(shù)文件的其他檢測函數(shù) 8.6 特殊的文件名特殊的文件名38.1 8.1 文件概述文件概述v文件是存在計算機存儲介質(zhì)中的一些信息的集合文件是存在計算機存儲介質(zhì)中的一些信息的集合。 v文件是一些記錄(文件是一些記錄(recordrecord)的集合。記錄就是具)的集合。記錄就是具有一定關(guān)系的信息的集合。有一定關(guān)系的信息的集合。v在計算機中,將二進制代碼的集合稱為信息。在計算機中,將二進制代碼

2、的集合稱為信息。v文件的種類有很多。例如:文本文件,系統(tǒng)文件,文件的種類有很多。例如:文本文件,系統(tǒng)文件,圖形、圖像文件,視頻文件,音頻文件等等。圖形、圖像文件,視頻文件,音頻文件等等。v每個文件都有一個名字,稱之為文件名。每個文件都有一個名字,稱之為文件名。 v文件的名字由兩部分組成,文件名和擴展名(也文件的名字由兩部分組成,文件名和擴展名(也稱為文件后綴)。文件名和擴展名之間用一個稱為文件后綴)。文件名和擴展名之間用一個“ “ . ”. ”號分開。擴展名是說明文件的屬性。號分開。擴展名是說明文件的屬性。48.1 8.1 文件概述文件概述vc c語言在處理信息方面采用的是兩種處理方法,一語言

3、在處理信息方面采用的是兩種處理方法,一種是將文件看成是種是將文件看成是asciiascii碼的集合,在處理這個集碼的集合,在處理這個集合時以合時以asciiascii碼為單位處理。由碼為單位處理。由asciiascii碼組成的文碼組成的文件,又稱為文本文件。另一種是將文件看成是二件,又稱為文本文件。另一種是將文件看成是二進制代碼的集合。進制代碼的集合。 v所謂所謂文本文件文本文件,是把內(nèi)存中的數(shù)據(jù)轉(zhuǎn)變成相應(yīng)的,是把內(nèi)存中的數(shù)據(jù)轉(zhuǎn)變成相應(yīng)的asciiascii碼值碼值形式,然后存放在磁盤上。因此,每個形式,然后存放在磁盤上。因此,每個字節(jié)存放一個字符的字節(jié)存放一個字符的asciiascii碼值。

4、碼值。v所謂所謂二進制文件二進制文件,是把內(nèi)存中的數(shù)據(jù)按其在內(nèi)存,是把內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲形式原樣存放到磁盤上去中的存儲形式原樣存放到磁盤上去58.1 8.1 文件概述文件概述1111 11111111 11110 0111 1111111 1111 68.1 8.1 文件概述文件概述v數(shù)據(jù)按文本形式存儲在磁盤上,占用的存儲空間數(shù)據(jù)按文本形式存儲在磁盤上,占用的存儲空間多,存儲時要花費轉(zhuǎn)換時間。但以這種形式存儲,多,存儲時要花費轉(zhuǎn)換時間。但以這種形式存儲,一個字節(jié)代表一個字符,便于對字符進行逐個處一個字節(jié)代表一個字符,便于對字符進行逐個處理,也便于輸出顯示理,也便于輸出顯示 v數(shù)據(jù)按

5、二進制形式存儲在磁盤上時,無須花費轉(zhuǎn)數(shù)據(jù)按二進制形式存儲在磁盤上時,無須花費轉(zhuǎn)換時間,占用空間少。但字節(jié)不與字符對應(yīng),因換時間,占用空間少。但字節(jié)不與字符對應(yīng),因此不能直接輸出顯示此不能直接輸出顯示78.1 8.1 文件概述文件概述v 緩沖文件系統(tǒng)緩沖文件系統(tǒng)v 輸出時,先將數(shù)據(jù)送到內(nèi)存緩沖區(qū),緩沖區(qū)裝滿后,才將輸出時,先將數(shù)據(jù)送到內(nèi)存緩沖區(qū),緩沖區(qū)裝滿后,才將整個緩沖區(qū)的內(nèi)容一次寫入磁盤整個緩沖區(qū)的內(nèi)容一次寫入磁盤v 輸入時,先把磁盤中的一塊數(shù)據(jù)讀入到內(nèi)存緩沖區(qū),然后輸入時,先把磁盤中的一塊數(shù)據(jù)讀入到內(nèi)存緩沖區(qū),然后再從緩沖區(qū)中把需要的數(shù)據(jù)挑出來,送到程序數(shù)據(jù)區(qū)中再從緩沖區(qū)中把需要的數(shù)據(jù)挑出

6、來,送到程序數(shù)據(jù)區(qū)中磁盤磁盤輸入輸入輸出輸出輸入文件緩沖區(qū)輸入文件緩沖區(qū)輸出文件緩沖區(qū)輸出文件緩沖區(qū)輸出輸出輸入輸入程序數(shù)據(jù)區(qū)程序數(shù)據(jù)區(qū)內(nèi)存內(nèi)存88.2 8.2 文件的打開與關(guān)閉文件的打開與關(guān)閉vc c語言執(zhí)行程序在文件處理上有兩種方式:語言執(zhí)行程序在文件處理上有兩種方式:v一種是借助操作系統(tǒng)的外殼功能完成一種是借助操作系統(tǒng)的外殼功能完成c c程序在運行程序在運行的過程中,數(shù)據(jù)的輸入和輸出,方式簡單,條件的過程中,數(shù)據(jù)的輸入和輸出,方式簡單,條件比較苛刻。比較苛刻。 。v另一種方式是完全借助另一種方式是完全借助c c語言的一些文件處理函數(shù)語言的一些文件處理函數(shù)來完成來完成c c語言程序運行過程

7、中的數(shù)據(jù)讀入和輸出,語言程序運行過程中的數(shù)據(jù)讀入和輸出,比較復(fù)雜,但功能強大。比較復(fù)雜,但功能強大。v1 1利用操作系統(tǒng)命令打開輸入和輸出文件。利用操作系統(tǒng)命令打開輸入和輸出文件。v具有很大的局限性,比如:讀取數(shù)據(jù)只能從頭開具有很大的局限性,比如:讀取數(shù)據(jù)只能從頭開始讀取,不可剪裁讀取數(shù)據(jù),也不可對數(shù)據(jù)回讀,始讀取,不可剪裁讀取數(shù)據(jù),也不可對數(shù)據(jù)回讀,輸入和輸出的數(shù)據(jù)文件只能是文本文件等。(略)輸入和輸出的數(shù)據(jù)文件只能是文本文件等。(略)98.2 8.2 文件的打開與關(guān)閉文件的打開與關(guān)閉v2 2利用函數(shù)處理文件利用函數(shù)處理文件v 在緩沖文件系統(tǒng)中,對每個正在使用的文件都自動分配一在緩沖文件系統(tǒng)

8、中,對每個正在使用的文件都自動分配一個個filefile類型的結(jié)構(gòu)體變量,用于存放文件的有關(guān)信息,如類型的結(jié)構(gòu)體變量,用于存放文件的有關(guān)信息,如文件號、文件狀態(tài)、緩沖區(qū)地址和大小等文件號、文件狀態(tài)、緩沖區(qū)地址和大小等typedef struct int level; /*緩沖區(qū)緩沖區(qū)“滿滿”或或“空空”的程度的程度*/ unsigned flags; /*文件狀態(tài)標志文件狀態(tài)標志*/ char fd; /*文件描述符文件描述符*/ unsigned char hold; /*如無緩沖區(qū)不讀取字符如無緩沖區(qū)不讀取字符*/ int bsize; /*緩沖區(qū)大小緩沖區(qū)大小*/ unsigned ch

9、ar *buffer; /*數(shù)據(jù)緩沖區(qū)位置數(shù)據(jù)緩沖區(qū)位置*/ unsigned char *curp; /*文件定位指針文件定位指針*/ unsigned istemp; /*臨時文件指示器臨時文件指示器*/ short token; /*用于有效性檢查用于有效性檢查*/file; 108.2 8.2 文件的打開與關(guān)閉文件的打開與關(guān)閉vc語言對于每一個要操作的文件,都必須定義一個語言對于每一個要操作的文件,都必須定義一個指針變量,指向該文件結(jié)構(gòu)體變量,這個指針稱指針變量,指向該文件結(jié)構(gòu)體變量,這個指針稱為文件指針為文件指針file *指針變量標識符;指針變量標識符;v打開文件操作:打開文件操作

10、:vfile file * *fp;fp;vfp=fopen(fp=fopen(文件名稱,使用文件方式文件名稱,使用文件方式););v關(guān)閉文件操作:關(guān)閉文件操作:vfclose(fp);fclose(fp);11c c文件操作常用函數(shù)文件操作常用函數(shù)fopen 打開文件打開文件1fclose 關(guān)閉文件關(guān)閉文件2fgets 讀字符串讀字符串3fputs 寫字符串寫字符串4fgetc 讀字符讀字符5fputc 寫字符寫字符6feof 指針是否到尾指針是否到尾7fread 讀數(shù)據(jù)塊讀數(shù)據(jù)塊8fwrite 寫數(shù)據(jù)塊寫數(shù)據(jù)塊9fscanf 格式讀數(shù)據(jù)格式讀數(shù)據(jù)10fprintf 格式寫數(shù)據(jù)格式寫數(shù)據(jù)11

11、fseek 指針重定位指針重定位12rewind 指針移到頭指針移到頭13ftell 返回指針位置返回指針位置14128.2 8.2 文件的打開與關(guān)閉文件的打開與關(guān)閉文件類型文件類型使用方式使用方式意義意義備注備注文本文本文件文件”r”只讀:打開一個文本文件,只允許讀數(shù)據(jù)只讀:打開一個文本文件,只允許讀數(shù)據(jù)舊文件舊文件”w”只寫:打開或建立一個文本文件,只允許寫數(shù)據(jù)只寫:打開或建立一個文本文件,只允許寫數(shù)據(jù)新文件新文件”a”追加:打開一個文本文件,并在文件末尾寫數(shù)據(jù)追加:打開一個文本文件,并在文件末尾寫數(shù)據(jù)舊文件舊文件”r+”讀寫:打開一個文本文件,允許讀和寫讀寫:打開一個文本文件,允許讀和寫

12、舊文件舊文件”w+”讀寫:打開或建立一個文本文件,允許讀寫讀寫:打開或建立一個文本文件,允許讀寫新文件新文件”a+”讀寫:打開一個文本文件,允許讀,或在文件末追加數(shù)據(jù)讀寫:打開一個文本文件,允許讀,或在文件末追加數(shù)據(jù)舊文件舊文件”rb”只讀:打開一個二進制文件,只允許讀數(shù)據(jù)只讀:打開一個二進制文件,只允許讀數(shù)據(jù)舊文件舊文件”wb”只寫:打開或建立一個二進制文件,只允許寫數(shù)據(jù)只寫:打開或建立一個二進制文件,只允許寫數(shù)據(jù)新文件新文件”ab”追加:打開一個二進制文件,并在文件末尾寫數(shù)據(jù)追加:打開一個二進制文件,并在文件末尾寫數(shù)據(jù)舊文件舊文件138.2 8.2 文件的打開與關(guān)閉文件的打開與關(guān)閉#inc

13、lude void main() int a16,i,j,t; file *fp1,*fp2; fp1=fopen(in.dat, r); fp2=fopen(out.dat, w); for(i=0;i16;i+) fscanf(fp1,%d,&ai); fprintf(fp2,*input data are*n); for(i=1;i=16;i+) fprintf(fp2,%3d,ai-1); if(i%4=0)fprintf(fp2,n); 148.2 8.2 文件的打開與關(guān)閉文件的打開與關(guān)閉 for(i=0;i16;i+) for(j=i+1;j16;j+) if(aiaj)

14、t=ai;ai=aj;aj=t; fprintf(fp2,*output data are*n); for(i=1;i=16;i+) fprintf(fp2,%3d,ai-1); if(i%4=0) fprintf(fp2,n); fclose(fp1); fclose(fp2);158.2 8.2 文件的打開與關(guān)閉文件的打開與關(guān)閉v我們使用了兩個函數(shù)一個是我們使用了兩個函數(shù)一個是fscanffscanf,另一個是,另一個是fprintffprintf。我們在表對比一他們與標準輸入輸出函。我們在表對比一他們與標準輸入輸出函數(shù)數(shù)scanfscanf、printfprintf的區(qū)別。的區(qū)別。168

15、.2 8.2 文件的打開與關(guān)閉文件的打開與關(guān)閉v為了使得上述的程序更加完善,確保程序在運行為了使得上述的程序更加完善,確保程序在運行過程中的正確性。這里我們引入一個新的函數(shù)過程中的正確性。這里我們引入一個新的函數(shù)exit(0)exit(0),這個函數(shù)是結(jié)束程序的運行。,這個函數(shù)是結(jié)束程序的運行。 file *fp1,*fp2;if(fp1=fopen(in.dat, r)=null) printf(cannot open infilen); exit(0); /不正確退出運行if(fp2= fopen(out.dat, w)=null) printf(cannot open outfilen)

16、;exit(0); /不正確退出運行178.3 8.3 文件的讀寫文件的讀寫v1 1fscanf()fscanf()和和fprintf()fprintf()函數(shù)函數(shù)v在上一小節(jié)中我們看到了這個函數(shù)的使用,他們在上一小節(jié)中我們看到了這個函數(shù)的使用,他們的格式是:的格式是:vfscanf(fscanf(文件指針,格式字符串,輸入列表文件指針,格式字符串,輸入列表););vfprintf(fprintf(文件指針,格式字符串,輸出列表文件指針,格式字符串,輸出列表););v在他們的格式中,除了文件指針,其他的格式和在他們的格式中,除了文件指針,其他的格式和scanf()scanf()和和 print

17、f()printf()函數(shù)是一致的。但是在使用函數(shù)是一致的。但是在使用中要注意寫入的格式和讀出的格式有一定的區(qū)別。中要注意寫入的格式和讀出的格式有一定的區(qū)別。188.3 8.3 文件的讀寫文件的讀寫#include void main() file *fp; int i,k,n; fp=fopen(data.dat, w); for (i=1;i6;i+) fprintf(fp, %d,i); if(i%3=0) fprintf(fp,n); fclose(fp); fp=fopen(data.dat, r); fscanf(fp, %d%d,&k,&n); printf(k=

18、%d,n=%dn,k,n); fclose(fp);198.3 8.3 文件的讀寫文件的讀寫v2 2fputc()fputc()和和 fgetc()fgetc()v(1 1)函數(shù)的功能就是將字符寫入到)函數(shù)的功能就是將字符寫入到fpfp所指向的文所指向的文件中去。它在語言的頭文件件中去。它在語言的頭文件中定義的中定義的格式為:格式為:vint fputc(int c,file int fputc(int c,file * *fp);fp);v調(diào)用方式為:調(diào)用方式為:vfputc(ch,fpfputc(ch,fp); ;vchch是一個字符變量,也可是字符常量。是一個字符變量,也可是字符常量。f

19、pfp是文件是文件的指針。的指針。v如果輸出成功,這個函數(shù)返回的值就是這個函數(shù)如果輸出成功,這個函數(shù)返回的值就是這個函數(shù)輸出的字符,否則,返回輸出的字符,否則,返回eofeof(也就是(也就是-1-1)。)。20#include #include void main() file *fp; char ch,filename12; printf(please input filename:); scanf(%s,filename); if(fp= fopen(filename, w)=null) printf(cannot open input-file:%sn,filename); exit(

20、0); printf(please begin input string:n); ch=getchar(); while(ch=getchar()!=n) fputc(ch,fp); fclose(fp);218.3 8.3 文件的讀寫文件的讀寫v(2 2)fgetc()fgetc()函數(shù)是從一個打開的磁盤文件中讀函數(shù)是從一個打開的磁盤文件中讀取一個字符,它在語言的頭文件取一個字符,它在語言的頭文件中定中定義的格式為:義的格式為:vint fgetc(int fgetc(* *fp);fp);v調(diào)用方式為:調(diào)用方式為:vch=fgetc(fp);ch=fgetc(fp);v其中其中chch是一

21、個字符變量。是一個字符變量。fpfp是一個文件的指針。是一個文件的指針。22#include #include void main() file *fp; char ch,filename12; printf(please input filename:); scanf(%s,filename); if(fp= fopen(filename, r)=null) printf(cannot open input-file:%sn,filename); exit(0); printf(begin output string:n); while(ch=fgetc(fp)!=eof) putchar(

22、ch); putchar(n); fclose(fp);238.3 8.3 文件的讀寫文件的讀寫#include void main(int argc,char *argv) file *fp1,*fp2; char ch; if (argc!=3) printf(“input argument error!”);exit(0); if(fp1=fopen(argv1, “r”)=null) printf(“cannot open source-file:%sn”,in_file); exit(0); if(fp2= fopen(argv2, “w”)=null) printf(“cannot

23、 open object-file:%sn”,out_file); exit(0); while(ch=fgetc(fp1)!=eof) fputc(ch,fp2); fclose(fp1); fclose(fp2);完成文件復(fù)制完成文件復(fù)制248.3 8.3 文件的讀寫文件的讀寫v3 3fread() fread() 函數(shù)和函數(shù)和fwrite()fwrite()函數(shù)函數(shù)v這兩函數(shù)也是向一個打開的文件內(nèi)寫入和讀出數(shù)這兩函數(shù)也是向一個打開的文件內(nèi)寫入和讀出數(shù)據(jù)。但使用方式有所不同。據(jù)。但使用方式有所不同。v(1 1)fwrite()fwrite()是將某一個二進制數(shù)據(jù)寫入到磁盤是將某一個二進制數(shù)

24、據(jù)寫入到磁盤文件中。該函數(shù)的格式為:文件中。該函數(shù)的格式為:vint fwrite(void int fwrite(void * *buffer,int num_byte,int buffer,int num_byte,int count,fp);count,fp); void void * *buffer buffer 數(shù)據(jù)緩沖區(qū)。數(shù)據(jù)緩沖區(qū)。 int num_byte int num_byte 所要讀取文件的字節(jié)數(shù)。所要讀取文件的字節(jié)數(shù)。 int count int count 注明所要讀取數(shù)據(jù)的倍數(shù)。注明所要讀取數(shù)據(jù)的倍數(shù)。 fp fp 文件指針。文件指針。258.3 8.3 文件的讀寫

25、文件的讀寫v將下列矩陣的數(shù)據(jù)保存在給定的數(shù)據(jù)文件中。將下列矩陣的數(shù)據(jù)保存在給定的數(shù)據(jù)文件中。 1.12.13.14.15.16.17.18.19.1 10.1 11.1 12.1#include #include #include #define col 4#define row 3#define f 1626void main() file *fp;float a34=1.1,2.1,3.1,4.1,5.1,6.1,7.1,8.1,9.1,10.1,11.1,12.1; char w_name10; int i,j; float (*p)4; printf(please input w_na

26、me:); scanf(%s,w_name); if(fp=fopen(w_name,wb)=null) printf(cannot open filen);exit(0); p=a; for (i=0;irow;i+) fwrite(p+i,f,col,fp); fclose(fp);278.3 8.3 文件的讀寫文件的讀寫v(2 2)fread()fread()是將某一個二進制數(shù)據(jù)讀入到數(shù)據(jù)是將某一個二進制數(shù)據(jù)讀入到數(shù)據(jù)緩沖區(qū)。該函數(shù)的格式為:緩沖區(qū)。該函數(shù)的格式為:vint fread(void int fread(void * *buffer,int num_byte,int buff

27、er,int num_byte,int count,fp);count,fp);v該函數(shù)共有四個參數(shù)該函數(shù)共有四個參數(shù) void void * *buffer buffer 數(shù)據(jù)緩沖區(qū)。數(shù)據(jù)緩沖區(qū)。 int num_byte int num_byte 所要讀取文件的字節(jié)數(shù)。所要讀取文件的字節(jié)數(shù)。 int coun int coun 注明所要讀取數(shù)據(jù)的倍數(shù)。注明所要讀取數(shù)據(jù)的倍數(shù)。 fp fp 文件指針。文件指針。v我們用我們用fread()fread()函數(shù)將上題數(shù)據(jù)讀入到一個數(shù)組中函數(shù)將上題數(shù)據(jù)讀入到一個數(shù)組中去。去。#include #include #include #define co

28、l 4#define row 328void main() file *fp; float b34=0; /讀出用寫入的同種方式 char r_name10; int i,j; float (*p)4; printf(please input r_name:); scanf(%s,r_name); if(fp=fopen(r_name,rb)=null) printf(cannot open filen);exit(0); p=b; for (i=0;irow;i+) fread(p+i,sizeof(float),col,fp); /寫入的方式相同 fclose(fp); for (i=0;

29、irow;i+) /顯示讀出的結(jié)果 for (j=0;jcol;j+) printf(%4g ,bij); printf(n); 298.3 8.3 文件的讀寫文件的讀寫v4 4其他讀寫函數(shù)其他讀寫函數(shù)v(1 1)putw()putw()和和getw()getw()函數(shù)函數(shù)v這兩個函數(shù)是將一個整型數(shù)寫到文件中或者從一這兩個函數(shù)是將一個整型數(shù)寫到文件中或者從一個文件中讀取一個整數(shù)。注意一個整型數(shù)占用個文件中讀取一個整數(shù)。注意一個整型數(shù)占用2 2個個字節(jié)。但有一個必要條件,它所打開的文件一定字節(jié)。但有一個必要條件,它所打開的文件一定是二進制文件格式。它們的使用方式是:是二進制文件格式。它們的使用方

30、式是:vputw(a,fp);putw(a,fp);va=getw(fp);a=getw(fp);v其中其中a a為一個整數(shù),為一個整數(shù),fpfp為文件指針。也可直接將以為文件指針。也可直接將以整數(shù)寫入到文件中。其格式為:整數(shù)寫入到文件中。其格式為:vputw(10,fp);putw(10,fp);30#include #include void main() file *fp; int a,i; if(fp= fopen(data.dat,wb+)=null) printf(cannot open input-file: data.dat.n); exit(0); for(a=0;a=15;

31、a+) putw(a,fp); fclose(fp); if(fp= fopen(data.dat,rb+)=null) printf(cannot open output-file: data.dat.n); exit(0); for(i=0;i=15;i+) a=getw(fp); printf(%2xn,a); printf(n); fclose(fp); 318.3 8.3 文件的讀寫文件的讀寫v(2 2)fgets()fgets()和和fputs()fputs()函數(shù)函數(shù)v這兩個函數(shù)是將一個字符串寫入到一個文件中,這兩個函數(shù)是將一個字符串寫入到一個文件中,他們的格式為:他們的格式為:

32、vfgets(str,n,fp);fgets(str,n,fp);vfputs(str,fp);fputs(str,fp);vstrstr為字符串數(shù)組或者字符串指針。為字符串數(shù)組或者字符串指針。n n為讀出的字為讀出的字符個數(shù),符個數(shù),fpfp為文件指針。這里打開的文件方式?jīng)]為文件指針。這里打開的文件方式?jīng)]有明確的要求,可以是文本方式也可以是二進制有明確的要求,可以是文本方式也可以是二進制方式。方式。32#include #include void main() file *fp; char *str1=abcdefghijklmnopqrstuvwxyz,str230; int n=26;

33、if(fp= fopen(data.dat,w+)=null) printf(cannot open output-file: data.dat.n); exit(0); fputs(str1,fp); fclose(fp); if(fp= fopen(data.dat,r+)=null) printf(cannot open input-file: data.dat.n); exit(0); fgets(str2,n-1,fp); /起始位置為“0”,讀取n-1個 printf(str=%sn,str2); fclose(fp); 338.4 8.4 文件的指針定位文件的指針定位vc c語言

34、打開的每個文件,都有一個文件指針牽引,語言打開的每個文件,都有一個文件指針牽引,文件指針是一看不見游標。文件指針是一看不見游標。v當你對文件進行一次讀寫,該指針都會自動的加當你對文件進行一次讀寫,該指針都會自動的加“1”1”,這個對初學(xué)者是一個比較難理解的概念。,這個對初學(xué)者是一個比較難理解的概念。也是難以運用的一種方式。也是難以運用的一種方式。v但是,我們對文件進行操作時難免需要指針按照但是,我們對文件進行操作時難免需要指針按照我們的意識進行運動。這樣我們就要對指針的運我們的意識進行運動。這樣我們就要對指針的運行方向,要有具有能控制的方式。行方向,要有具有能控制的方式。 348.4 8.4

35、文件的指針定位文件的指針定位v1 1rewind()rewind()函數(shù)函數(shù)v該函數(shù)被稱之回繞函數(shù),來源于磁帶機的該函數(shù)被稱之回繞函數(shù),來源于磁帶機的“倒倒帶帶”,早期計算機的外部大型數(shù)據(jù)存儲器是由盤,早期計算機的外部大型數(shù)據(jù)存儲器是由盤式磁帶機完成的,當一盤數(shù)據(jù)被讀取完成,就需式磁帶機完成的,當一盤數(shù)據(jù)被讀取完成,就需要將磁帶回繞。以便下一次讀取數(shù)據(jù)時使用。在要將磁帶回繞。以便下一次讀取數(shù)據(jù)時使用。在c c語言中,將其引申為指針歸位,就是將指針指向語言中,將其引申為指針歸位,就是將指針指向文件頭,無論指針當前在什么位置。文件頭,無論指針當前在什么位置。v其格式為:其格式為:vrewind(f

36、p);rewind(fp);358.4 8.4 文件的指針定位文件的指針定位#include #includevoid main() file *fp; int a,i; if(fp= fopen(data.dat,wb+)=null) printf(cannot open input-file: data.dat.n); exit(0); for(a=0;a=15;a+) putw(a,fp); rewind(fp); for(i=0;i=15;i+) a=getw(fp); printf(%2x,a); printf(n); fclose(fp);368.4 8.4 文件的指針定位文件的指

37、針定位v2 2fseek()fseek()函數(shù)函數(shù)v該函數(shù)可將當前文件指針所指位置再次定位該函數(shù)可將當前文件指針所指位置再次定位vfseek(fseek(文件指針,位移量,起始點文件指針,位移量,起始點) )v其函數(shù)原型為:其函數(shù)原型為:vint fseek(fp,long num_byte,int origin);int fseek(fp,long num_byte,int origin);vfp, fp, 為文件指針。為文件指針。vlong num_byte, long num_byte, 長整形數(shù),位移量。正數(shù)表示向長整形數(shù),位移量。正數(shù)表示向文件尾的方向移動指針。負表示向文件頭的方向文

38、件尾的方向移動指針。負表示向文件頭的方向移動指針。移動指針。vint originint origin, “ “0”0”表示從文件頭開始。表示從文件頭開始?!?”1”表表示從當前位置開始。示從當前位置開始?!?”2”表示文件尾開始。表示文件尾開始。378.4 8.4 文件的指針定位文件的指針定位#include #include void main() file *fp; char *str1=abcdefghijklmnopqrstuvwxyz,ch; int i,n=26; if(fp= fopen(data.dat,w+)=null) printf(cannot open output-

39、file: data.dat.n); exit(0); fputs(str1,fp); rewind(fp); for(i=0;i=n-1;i+=2) ch=fgetc(fp); fseek(fp,1,1); printf(%c ,ch); printf(n); fclose(fp);388.4 8.4 文件的指針定位文件的指針定位v3 3ftell()ftell()函數(shù)函數(shù)v該函數(shù)是報告文件指針的當前位置,一般是一整該函數(shù)是報告文件指針的當前位置,一般是一整數(shù)的形勢報告。該函數(shù)的書寫格式為:數(shù)的形勢報告。該函數(shù)的書寫格式為:v ftell(fp);ftell(fp);vfpfp為文件指針。為

40、文件指針。v如果該函的返回值為如果該函的返回值為-1l-1l則認為表示出錯。具體用則認為表示出錯。具體用法用例題加以說明。法用例題加以說明。398.4 8.4 文件的指針定位文件的指針定位void main() file *fp;char *str1=abcdefghijklmnopqrstuvwxyz,ch;int j,i,n=26;if(fp= fopen(data.dat,w+)=null)printf(cannot open output-file: data.dat.n); exit(0);fputs(str1,fp);rewind(fp);for(i=0;i=n-1;i+)j=ft

41、ell(fp);printf(j=%2d,j);fseek(fp,i,0);ch=fgetc(fp);printf(%c ,ch);if(i+1)%4=0)printf(n); printf(n);fclose(fp); 408.5 8.5 文件的其他檢測函數(shù)文件的其他檢測函數(shù)v還有一些關(guān)于文件出錯處理的函數(shù)還有一些關(guān)于文件出錯處理的函數(shù), ,這些函數(shù)一般這些函數(shù)一般是給系統(tǒng)管理員編程時使用的。是給系統(tǒng)管理員編程時使用的。v1 1feof()feof()v該函數(shù)的功能是判斷函數(shù)指針是否已經(jīng)指向文件該函數(shù)的功能是判斷函數(shù)指針是否已經(jīng)指向文件尾。往往我們對打開的文件的內(nèi)容是不清楚的,尾。往往我們對

42、打開的文件的內(nèi)容是不清楚的,尤其是其長度。所起要想將一個文件的內(nèi)容全部尤其是其長度。所起要想將一個文件的內(nèi)容全部處理,只能借助該函數(shù)加以完成。該函數(shù)原型為:處理,只能借助該函數(shù)加以完成。該函數(shù)原型為:vint feof(fp);int feof(fp);v其中其中fpfp為文件指針。為文件指針。v當給出一文本文件名稱后將其內(nèi)容顯示在屏幕上。當給出一文本文件名稱后將其內(nèi)容顯示在屏幕上。 41#include #include void main() file *fp; char filename12; printf(please input filename:); scanf(%s,filename); if(fp= fopen(filename,r+)=null) printf(cannot open input-file:%sn,filename

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論