版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第二十一講 文件操作,北京大學信息學院,2,本講內容,基礎知識:文件系統(tǒng)的相關概念文件操作文件類型指針文件的打開文件的關閉文件的讀寫文件的定位,3,1、文件系統(tǒng)的相關概念,為什么需要文件?函數scanf和printf都是面向字符終端的, 只適合程序數據量小的場合, 不適合處理大量數據的場合通過終端輸入輸出大量數據枯燥、易錯程序終止時, 所有的數據丟失需求: 將數據存放于物理磁盤上,需要時讀入內存用文件組織數據,4,
2、1、文件系統(tǒng)的相關概念,文件:存儲在外部介質上數據的集合,是操作系統(tǒng)進行數據管理的基本單位。,使用數據文件的目的:1、數據文件的改動不引起程序的改動——程序與數據分離2、不同程序可以訪問同一數據文件中的數據——數據共享3、能長期保存程序運行的中間數據或結果數據,5,1、文件系統(tǒng)的相關概念,文件分類按文件的邏輯結構:記錄文件:由具有一定結構的記錄組成(定長和不定長)流式文件:由一個個字節(jié)數據順序組成按數據的組織形式:文本文
3、件: ASCII文件,每個字節(jié)存放一個字符的ASCII碼二進制文件:數據以二進制方式存儲,其含義由應用確定,6,1、文件系統(tǒng)的相關概念,7,1、文件系統(tǒng)的相關概念,8,1、文件系統(tǒng)的相關概念,9,1、文件系統(tǒng)的相關概念,文件的標識: 文件夾:c:\course\ic\,d:\movie\ 文件名:score.txt,resume.ppt 文件標識: c:\course\ic\score.txt在C程序中操作文件: 通過操作系
4、統(tǒng)(文件系統(tǒng))的幫助完成,10,文件結構體FILE操作系統(tǒng)為每個將要使用的文件在內存開辟文件信息區(qū)文件信息用操作系統(tǒng)定義的名為FILE的結構體描述FILE定義在stdio.h中,typedef struct{ int _fd; //文件號 int _cleft; //緩沖區(qū)中剩下的字符數 int _mode; //文件操作方式 char *_next
5、; //文件當前讀寫位置 char *_buff; //文件緩沖區(qū)位置}FILE;,2、文件操作:文件類型指針,11,文件打開時,操作系統(tǒng)自動建立文件結構體,并把指向它的指針返回來,程序通過這個指針獲得文件信息,訪問文件,這個指針稱為文件類型指針指針變量說明: FILE *fp;文件關閉后,它的文件結構體被釋放,12,2、文件操作,文件操作的幾個概念文件存儲在磁盤中,每個文件都是一個可變大小的容器,以一個字節(jié)
6、(1Byte)為管理單位,順序地存儲各種實際的數據。文件長度:文件包含的字節(jié)數文件位置文件開頭:文件的第一個字節(jié)文件結束(EOF):文件內容的最后文件中間位置當往文件中添加內容時,文件長度可以增加;反之,文件長度會變小。文件位置指針:用來指示文件操作時所針對的文件位置隨著文件操作不斷變化(存放在FILE結構信息中),文件開頭,文件結束,文件中間位置,13,文件使用方式:打開文件?文件讀/寫?關閉文件,文件打開與關閉FI
7、LE * fopen(const char *filename, const char *mode); //打開文件int fclose(FILE *fp); //關閉文件文件讀寫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,打開文件:fopen()函數原型:FILE *fopen(char *filename, char *mode),2、文件操作:文件的打開與關閉,功能:按指
10、定方式打開文件參數:filename:要打開的文件名mode:文件打開方式返回值:正常打開,為指向文件結構體的指針;打開失敗,為NULL,15,2、文件操作:文件的打開與關閉,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”);,例:打開文件 c:\course\ic\score.txt,16,特殊字符的常量表示
12、法:反斜線(Backslash)‘\\’退格(Backspace)‘\b’回車(Carriage return)‘\r’進紙符(Form feed)‘\f’制表符(Form feed)‘\t’換行(New line)‘\n’單引號(Single quote)‘\’’,17,2、文件操作:文件的打開與關閉,18,2、文件操作:文件位置指針的變化,打開文件后,文件位置指針指向文件的開頭位置對于讀
13、/寫操作,都是從當前文件位置指針所指位置讀取(若干字節(jié))數據,同時,文件位置指針向后移動若干字節(jié)。,文件位置指針,當前文件指針位置,讀/寫3個字節(jié)后,文件指針位置,19,2、文件操作:文件的打開與關閉,文件關閉:fclose()作用:使文件指針變量與文件“脫鉤”,釋放文件結構體和文件指針函數原型:int fclose(FILE *fp)功能:關閉fp指向的文件返回值:正常關閉為0;出錯時,非0,20,字符讀寫: fputc與
14、fgetc(用于文本文件的讀寫)fputc函數原型:int fputc(int c, FILE *fp)功能:根據當前文件位置指針的位置,把一字節(jié)代碼c寫入fp指向的文件中返值:正常,返回c; 出錯,為EOF,fgetc函數原型:int fgetc(FILE *fp)功能:根據當前文件位置指針的位置,從fp指向的文件中讀取一字節(jié)代碼返回值:正常,返回讀到的代碼值; 讀到文件尾或出錯,為EOF,2、文件操作:
15、文件的讀寫,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;},從鍵盤輸入字符,逐個存到磁盤文件中,直到輸入‘#’為止,22,讀文本文件內容,并顯示,#
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;},判斷文件是否結束 c = fgetc(in); while( !feof(in) ) { fputc(c, out); c = fgetc(in);
21、 },feof 函數原型: int feof(FILE *fp) 功能:判斷文件是否結束 返回值: 文件結束,返回真(非0) 文件未結束,返回假(0),文件拷貝,,24,數據塊讀寫:fread與fwrite(一般用于二進制文件的讀寫)函數原型:,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),功能:根據當前文件位置指針的位置,讀/寫數據塊返回值:成功,返回實際讀/寫的數據塊個數;出錯或文件尾,返回0說明:typedef unsigned size_t;buffer: 指向要輸入/輸出數據塊的首地址的指針size: 每個要讀/寫的數據塊的大?。ㄗ止?jié)數)count: 要讀/寫的數據塊的個
23、數fp: 要讀/寫的文件指針,2、文件操作:文件的讀寫,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,從鍵盤輸入4個學生數據,把它們轉存到
25、磁盤文件中去,#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,格式化讀寫:fprintf與fscanf (用于文本文件的讀寫)函數原型:,int fprintf(FILE *fp, const char *format[, argument,…])int fscanf(FILE *fp, const char *format[, address,…]),功能:按格式對文件進行I/O操作返回值:成功,返回I/O的個數;出錯或文件尾,返回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、文件操作:文件的讀寫,29,從鍵盤按格式輸入數據存到磁盤文件中去,#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,字符串讀寫: fgets與fputs (用于文本文件的讀寫)函數原型:,char *fg
35、ets(char *s, int n, FILE *fp)int fputs(char *s, FILE *fp),功能:從fp指向的文件讀/寫一個字符串fgets從fp所指文件讀n-1個字符送入s指向的內存區(qū),并在最后加一個‘\0’(若讀入n-1個字符前遇換行符或文件尾(EOF)即結束)fputs把s指向的字符串寫入fp指向的文件返回值:fgets正常時返回讀取字符串的首地址;出錯或文件尾,返回NULLf
36、puts正常時返回寫入的最后一個字符;出錯為EOF,2、文件操作:文件的讀寫,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;},從鍵盤讀入字符串存入文件,再從文件讀回顯示,32,幾個概念文件位置指針——指向當前讀寫位置的指針(以字節(jié)為單位)讀寫方式順序讀寫:位置指針按字節(jié)位置順
39、序移動隨機讀寫:位置指針按需要移動到任意位置rewind函數函數原型: void rewind(FILE *fp)功能:重置文件位置指針到文件開頭返值:無,2、文件操作:文件的定位,33,對一個磁盤文件進行顯示和復制兩次操作,#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函數函數原型: int fseek(FILE *fp, long offset, int whence)功能:從指定的起始點位置開始,按位移量移動文件位置指針返回值:成功,返回0;失敗,返回非0值文件指針fp位
42、移量offset:以起始點為基點,移動的字節(jié)數, >0向后移動, <0向前移動起始點whence,例 fseek(fp,100L,0); fseek(fp,50L,1); fseek(fp,-10L,2);,ftell函數函數原型: long ftell(FILE *fp)功能:返回位置指針當前位置(用相對文件開頭的位移量表示)返回值:成功,返回當前位置指針位置;失敗,返回-1L,,文件開始
43、 SEEK_SET 0文件當前位置 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];,磁盤文件上有3個學生數據,要求讀入第1,3學生數據并顯示,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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論