版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第二十一講 文件操作,北京大學(xué)信息學(xué)院,2,本講內(nèi)容,基礎(chǔ)知識(shí):文件系統(tǒng)的相關(guān)概念文件操作文件類型指針文件的打開(kāi)文件的關(guān)閉文件的讀寫(xiě)文件的定位,3,1、文件系統(tǒng)的相關(guān)概念,為什么需要文件?函數(shù)scanf和printf都是面向字符終端的, 只適合程序數(shù)據(jù)量小的場(chǎng)合, 不適合處理大量數(shù)據(jù)的場(chǎng)合通過(guò)終端輸入輸出大量數(shù)據(jù)枯燥、易錯(cuò)程序終止時(shí), 所有的數(shù)據(jù)丟失需求: 將數(shù)據(jù)存放于物理磁盤(pán)上,需要時(shí)讀入內(nèi)存用文件組織數(shù)據(jù),4,
2、1、文件系統(tǒng)的相關(guān)概念,文件:存儲(chǔ)在外部介質(zhì)上數(shù)據(jù)的集合,是操作系統(tǒng)進(jìn)行數(shù)據(jù)管理的基本單位。,使用數(shù)據(jù)文件的目的:1、數(shù)據(jù)文件的改動(dòng)不引起程序的改動(dòng)——程序與數(shù)據(jù)分離2、不同程序可以訪問(wèn)同一數(shù)據(jù)文件中的數(shù)據(jù)——數(shù)據(jù)共享3、能長(zhǎng)期保存程序運(yùn)行的中間數(shù)據(jù)或結(jié)果數(shù)據(jù),5,1、文件系統(tǒng)的相關(guān)概念,文件分類按文件的邏輯結(jié)構(gòu):記錄文件:由具有一定結(jié)構(gòu)的記錄組成(定長(zhǎng)和不定長(zhǎng))流式文件:由一個(gè)個(gè)字節(jié)數(shù)據(jù)順序組成按數(shù)據(jù)的組織形式:文本文
3、件: ASCII文件,每個(gè)字節(jié)存放一個(gè)字符的ASCII碼二進(jìn)制文件:數(shù)據(jù)以二進(jìn)制方式存儲(chǔ),其含義由應(yīng)用確定,6,1、文件系統(tǒng)的相關(guān)概念,7,1、文件系統(tǒng)的相關(guān)概念,8,1、文件系統(tǒng)的相關(guān)概念,9,1、文件系統(tǒng)的相關(guān)概念,文件的標(biāo)識(shí): 文件夾:c:\course\ic\,d:\movie\ 文件名:score.txt,resume.ppt 文件標(biāo)識(shí): c:\course\ic\score.txt在C程序中操作文件: 通過(guò)操作系
4、統(tǒng)(文件系統(tǒng))的幫助完成,10,文件結(jié)構(gòu)體FILE操作系統(tǒng)為每個(gè)將要使用的文件在內(nèi)存開(kāi)辟文件信息區(qū)文件信息用操作系統(tǒng)定義的名為FILE的結(jié)構(gòu)體描述FILE定義在stdio.h中,typedef struct{ int _fd; //文件號(hào) int _cleft; //緩沖區(qū)中剩下的字符數(shù) int _mode; //文件操作方式 char *_next
5、; //文件當(dāng)前讀寫(xiě)位置 char *_buff; //文件緩沖區(qū)位置}FILE;,2、文件操作:文件類型指針,11,文件打開(kāi)時(shí),操作系統(tǒng)自動(dòng)建立文件結(jié)構(gòu)體,并把指向它的指針?lè)祷貋?lái),程序通過(guò)這個(gè)指針獲得文件信息,訪問(wèn)文件,這個(gè)指針?lè)Q為文件類型指針指針變量說(shuō)明: FILE *fp;文件關(guān)閉后,它的文件結(jié)構(gòu)體被釋放,12,2、文件操作,文件操作的幾個(gè)概念文件存儲(chǔ)在磁盤(pán)中,每個(gè)文件都是一個(gè)可變大小的容器,以一個(gè)字節(jié)
6、(1Byte)為管理單位,順序地存儲(chǔ)各種實(shí)際的數(shù)據(jù)。文件長(zhǎng)度:文件包含的字節(jié)數(shù)文件位置文件開(kāi)頭:文件的第一個(gè)字節(jié)文件結(jié)束(EOF):文件內(nèi)容的最后文件中間位置當(dāng)往文件中添加內(nèi)容時(shí),文件長(zhǎng)度可以增加;反之,文件長(zhǎng)度會(huì)變小。文件位置指針:用來(lái)指示文件操作時(shí)所針對(duì)的文件位置隨著文件操作不斷變化(存放在FILE結(jié)構(gòu)信息中),文件開(kāi)頭,文件結(jié)束,文件中間位置,13,文件使用方式:打開(kāi)文件?文件讀/寫(xiě)?關(guān)閉文件,文件打開(kāi)與關(guān)閉FI
7、LE * fopen(const char *filename, const char *mode); //打開(kāi)文件int fclose(FILE *fp); //關(guān)閉文件文件讀寫(xiě)int fputc(int c, FILE *fp)int fgetc(FILE *fp)size_t fread(void *buffer,size_t size, size_t count, FILE *f
8、p)size_t fwrite(void *buffer,size_t size, size_t count, FILE *fp)char * fgets(char *s,int n,FILE *fp)int fputs(char *s,FILE *fp)int fprintf(FILE *fp, const char *format, …)int fscanf(FIL
9、E *fp, const char *format, …) 文件的定位void rewind(FILE *fp)int fseek(FILE *fp, long offset, int whence)long ftell(FILE *fp),14,打開(kāi)文件:fopen()函數(shù)原型:FILE *fopen(char *filename, char *mode),2、文件操作:文件的打開(kāi)與關(guān)閉,功能:按指
10、定方式打開(kāi)文件參數(shù):filename:要打開(kāi)的文件名mode:文件打開(kāi)方式返回值:正常打開(kāi),為指向文件結(jié)構(gòu)體的指針;打開(kāi)失敗,為NULL,15,2、文件操作:文件的打開(kāi)與關(guān)閉,FILE *fp; fp = fopen(“c:\\course\\ic\\score.txt”, “w”); if( fp==NULL ) { printf(“File open error
11、!\n”); },FILE *fp; fp= fopen (“c:\\course\\ic\\score.txt”, “r”);,FILE *fp; char *filename=“c:\\course\\ic\\tscort.txt” fp= fopen(filename, “r”);,例:打開(kāi)文件 c:\course\ic\score.txt,16,特殊字符的常量表示
12、法:反斜線(Backslash)‘\\’退格(Backspace)‘\b’回車(Carriage return)‘\r’進(jìn)紙符(Form feed)‘\f’制表符(Form feed)‘\t’換行(New line)‘\n’單引號(hào)(Single quote)‘\’’,17,2、文件操作:文件的打開(kāi)與關(guān)閉,18,2、文件操作:文件位置指針的變化,打開(kāi)文件后,文件位置指針指向文件的開(kāi)頭位置對(duì)于讀
13、/寫(xiě)操作,都是從當(dāng)前文件位置指針?biāo)肝恢米x?。ㄈ舾勺止?jié))數(shù)據(jù),同時(shí),文件位置指針向后移動(dòng)若干字節(jié)。,文件位置指針,當(dāng)前文件指針位置,讀/寫(xiě)3個(gè)字節(jié)后,文件指針位置,19,2、文件操作:文件的打開(kāi)與關(guān)閉,文件關(guān)閉:fclose()作用:使文件指針變量與文件“脫鉤”,釋放文件結(jié)構(gòu)體和文件指針函數(shù)原型:int fclose(FILE *fp)功能:關(guān)閉fp指向的文件返回值:正常關(guān)閉為0;出錯(cuò)時(shí),非0,20,字符讀寫(xiě): fputc與
14、fgetc(用于文本文件的讀寫(xiě))fputc函數(shù)原型:int fputc(int c, FILE *fp)功能:根據(jù)當(dāng)前文件位置指針的位置,把一字節(jié)代碼c寫(xiě)入fp指向的文件中返值:正常,返回c; 出錯(cuò),為EOF,fgetc函數(shù)原型:int fgetc(FILE *fp)功能:根據(jù)當(dāng)前文件位置指針的位置,從fp指向的文件中讀取一字節(jié)代碼返回值:正常,返回讀到的代碼值; 讀到文件尾或出錯(cuò),為EOF,2、文件操作:
15、文件的讀寫(xiě),21,#include int main(){ FILE *fp; char ch,*filename=“out.txt”; if( (fp=fopen(filename,"w"))==NULL ) { printf("cannot open file\n");return 0; } printf(&
16、quot;Please input string:\n"); ch=getchar(); while( ch!='#' ) { fputc(ch, fp); ch=getchar(); } fclose(fp); return 1;},從鍵盤(pán)輸入字符,逐個(gè)存到磁盤(pán)文件中,直到輸入‘#’為止,22,讀文本文件內(nèi)容,并顯示,#
17、include int main(){ FILE *fp; char ch,*filename="out.txt"; if( (fp=fopen(filename, "r"))==NULL ) { printf("cannot open file\n"); return 0; } while
18、( (ch=fgetc(fp))!=EOF ) putchar(ch); fclose(fp); return 1;},23,#include void main(){ FILE *in, *out; char c, infile[10], outfile[10]; scanf("%s",infile); scanf("%s",ou
19、tfile); if ( (in = fopen(infile, "r"))== NULL ) { printf("Cannot open infile.\n"); return 0; } if ( (out = fopen(outfile, "w"))== NULL ) { printf("Canno
20、t open outfile.\n"); return 0; } … fclose(in); fclose(out); return 1;},判斷文件是否結(jié)束 c = fgetc(in); while( !feof(in) ) { fputc(c, out); c = fgetc(in);
21、 },feof 函數(shù)原型: int feof(FILE *fp) 功能:判斷文件是否結(jié)束 返回值: 文件結(jié)束,返回真(非0) 文件未結(jié)束,返回假(0),文件拷貝,,24,數(shù)據(jù)塊讀寫(xiě):fread與fwrite(一般用于二進(jìn)制文件的讀寫(xiě))函數(shù)原型:,size_t fread(void *buffer, size_t size, size_t count, FILE *fp)size_t fwrit
22、e(void *buffer, size_t size, size_t count, FILE *fp),功能:根據(jù)當(dāng)前文件位置指針的位置,讀/寫(xiě)數(shù)據(jù)塊返回值:成功,返回實(shí)際讀/寫(xiě)的數(shù)據(jù)塊個(gè)數(shù);出錯(cuò)或文件尾,返回0說(shuō)明:typedef unsigned size_t;buffer: 指向要輸入/輸出數(shù)據(jù)塊的首地址的指針size: 每個(gè)要讀/寫(xiě)的數(shù)據(jù)塊的大?。ㄗ止?jié)數(shù))count: 要讀/寫(xiě)的數(shù)據(jù)塊的個(gè)
23、數(shù)fp: 要讀/寫(xiě)的文件指針,2、文件操作:文件的讀寫(xiě),25,例 float f[2]; FILE *fp; fp=fopen(“aa.dat”,“rb”); fread(f, 4, 2, fp);,for(i=0;i<2;i++) fread(&f[i], 4, 1, fp);,例 struct student { int num;
24、 char name[20]; char sex; int age; float score[3]; }stud[10]; for(i=0;i<10;i++) fread(&stud[i], sizeof(struct student), 1, fp);,26,從鍵盤(pán)輸入4個(gè)學(xué)生數(shù)據(jù),把它們轉(zhuǎn)存到
25、磁盤(pán)文件中去,#include #define SIZE 4struct student{ int num; char name[12]; int age; char addr[15];}stud[SIZE];int main(){ int i; for(i=0;i<SIZE;i++)scanf("%s%d%d%s", stud[i
26、].name, &stud[i].num, &stud[i].age, stud[i].addr); save(); display(); return 1;},void save(){ FILE *fp; int i; if( (fp=fopen(“c:\\course\\ic\\stu.dat","wb"))==NU
27、LL ) { printf("cannot open file\n"); return; } for(i=0;i<SIZE;i++) if( fwrite(&stud[i], sizeof(struct student), 1, fp) != 1) printf("file write error
28、\n"); fclose(fp);},27,void display(){ FILE *fp; int i; if( (fp=fopen(“c:\\course\\ic\\stu.dat","rb"))==NULL ) { printf("cannot open file\n"); r
29、eturn; } for(i=0; i<SIZE; i++) { fread(&stud[i], sizeof(struct student), 1, fp); printf("%s %d %d %s\n",stud[i].name, stud[i].num, stud[i].age, stud[i].addr); }
30、 fclose(fp);},28,格式化讀寫(xiě):fprintf與fscanf (用于文本文件的讀寫(xiě))函數(shù)原型:,int fprintf(FILE *fp, const char *format[, argument,…])int fscanf(FILE *fp, const char *format[, address,…]),功能:按格式對(duì)文件進(jìn)行I/O操作返回值:成功,返回I/O的個(gè)數(shù);出錯(cuò)或文件尾,返回EOF,例
31、 fprintf(fp, “%d,%6.2f”, i, t); //將i和t按%d,%6.2f格式輸出到fp文件 fscanf(fp, “%d,%f”, &i, &t); //若文件中有“3,4.5”,則將3送入i,4.5送入t,2、文件操作:文件的讀寫(xiě),29,從鍵盤(pán)按格式輸入數(shù)據(jù)存到磁盤(pán)文件中去,#include int main(){ char s[80],c[80]; int a, b
32、; FILE *fp; if( (fp=fopen("test.dat", "w"))==NULL ) { printf("can't open file\n"); return 0 ; } scanf("%s%d", s, &a); /*read from keaboard
33、*/ fprintf(fp, "%s %d", s, a); /*write to file*/ fclose(fp); if( (fp=fopen("test.dat", "r"))==NULL) { printf("can't open file\n"); return 0; } fs
34、canf(fp, "%s%d", c, &b); /*read from file*/ printf("%s %d\n", c, b); /*print to screen*/ fclose(fp); return 1;},30,字符串讀寫(xiě): fgets與fputs (用于文本文件的讀寫(xiě))函數(shù)原型:,char *fg
35、ets(char *s, int n, FILE *fp)int fputs(char *s, FILE *fp),功能:從fp指向的文件讀/寫(xiě)一個(gè)字符串fgets從fp所指文件讀n-1個(gè)字符送入s指向的內(nèi)存區(qū),并在最后加一個(gè)‘\0’(若讀入n-1個(gè)字符前遇換行符或文件尾(EOF)即結(jié)束)fputs把s指向的字符串寫(xiě)入fp指向的文件返回值:fgets正常時(shí)返回讀取字符串的首地址;出錯(cuò)或文件尾,返回NULLf
36、puts正常時(shí)返回寫(xiě)入的最后一個(gè)字符;出錯(cuò)為EOF,2、文件操作:文件的讀寫(xiě),31,#include int main(){ FILE *fp; char string[81]; if( (fp=fopen("file.txt","w"))==NULL ) { printf("cann't open file"); retu
37、rn 0; } while( strlen(gets(string))>0 ) { fputs(string, fp); fputs("\n", fp); } fclose(fp); if( (fp=fopen("file.txt","r"))==NULL ) { printf(&q
38、uot;cann't open file"); return 0; } while( fgets(string, 81, fp)!=NULL ) puts(string); fclose(fp); return 1;},從鍵盤(pán)讀入字符串存入文件,再?gòu)奈募x回顯示,32,幾個(gè)概念文件位置指針——指向當(dāng)前讀寫(xiě)位置的指針(以字節(jié)為單位)讀寫(xiě)方式順序讀寫(xiě):位置指針按字節(jié)位置順
39、序移動(dòng)隨機(jī)讀寫(xiě):位置指針按需要移動(dòng)到任意位置rewind函數(shù)函數(shù)原型: void rewind(FILE *fp)功能:重置文件位置指針到文件開(kāi)頭返值:無(wú),2、文件操作:文件的定位,33,對(duì)一個(gè)磁盤(pán)文件進(jìn)行顯示和復(fù)制兩次操作,#include int main(){ FILE *fp1,*fp2; char c; fp1=fopen(“c:\\course\\ic\\ch161.c"
40、, "r"); fp2=fopen(“c:\\course\\ic\\ch162.c", "w"); c = fgetc(fp1); while( !feof(fp1) ) { putchar(c); c = fgetc(fp1); } rewind(fp1); c = fgetc(fp1); while( !feof(fp1
41、) ) { fputc(c, fp2); c = fgetc(fp1); } fclose(fp1); fclose(fp2); return 1;},34,fseek函數(shù)函數(shù)原型: int fseek(FILE *fp, long offset, int whence)功能:從指定的起始點(diǎn)位置開(kāi)始,按位移量移動(dòng)文件位置指針?lè)祷刂担撼晒?,返?;失敗,返回非0值文件指針fp位
42、移量offset:以起始點(diǎn)為基點(diǎn),移動(dòng)的字節(jié)數(shù), >0向后移動(dòng), <0向前移動(dòng)起始點(diǎn)whence,例 fseek(fp,100L,0); fseek(fp,50L,1); fseek(fp,-10L,2);,ftell函數(shù)函數(shù)原型: long ftell(FILE *fp)功能:返回位置指針當(dāng)前位置(用相對(duì)文件開(kāi)頭的位移量表示)返回值:成功,返回當(dāng)前位置指針位置;失敗,返回-1L,,文件開(kāi)始
43、 SEEK_SET 0文件當(dāng)前位置 SEEK_CUR 1文件末尾 SEEK_END 2,2、文件操作:文件的定位,35,void main(){ int i; FILE *fp; if( (fp=fopen("stu.dat", "rb"))==NULL ) { printf("can
44、9;t open file\n"); return 0; } for(i=0; i<3; i+=2) { fseek(fp, i*sizeof(struct student_type), 0); //SEEK_SET fread(&stud[i], sizeof(struct student_type), 1, fp); printf(
45、"%s %d %d %s\n", stud[i].name, stud[i].num, stud[i].age, stud[i].addr); } fclose(fp); return 1;},#include struct student{ int num; char name[12]; int age; char
46、 addr[15];}stud[3];,磁盤(pán)文件上有3個(gè)學(xué)生數(shù)據(jù),要求讀入第1,3學(xué)生數(shù)據(jù)并顯示,36,#include"stdio.h"int main(){ FILE *fp; char filename[80]; long length; gets(filename); fp=fopen(filename,"rb"); if( fp==
47、NULL ) printf("file not found!\n"); else { fseek(fp,0L,SEEK_END); length = ftell(fp); printf("Length of File is %d bytes\n", length); fclose(fp); } retur
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
評(píng)論
0/150
提交評(píng)論