文件
1.文件:存儲在外部介質上數據的集合
2.文件是有序的數據序列,要訪問文件中的數據,必須按照它們的排列順序,依次訪問
3.系統對文件的處理過程:
讀(輸入):計算機外存--->緩沖區--->計算機內存
寫(輸出):計算機內存--->緩沖區---->計算機外存
4.文件的分類:
①根據在磁盤的存儲格式,分為:
文本文件(TXT/ASCⅡ文件):
? ? ?文本文中保存的數據用ASCⅡ作為存儲方式,先將全部數據轉換為ASCⅡ碼形式,每個ASCⅡ碼占一個字節
? ? ?文本文件使用編輯軟件可以直接閱讀
二進制文件:
? ? ? 將數據在內存中以二進制格式存儲,直接存入文件中
? ? ? 二進制文件使用編輯器軟件不能直接閱讀
②從用戶觀點,分為:
普通文件(磁盤文件):
? ? ? ?以磁盤為對象,無其他特殊性能
特殊文件(標準設備文件/標準I/0文件):
? ? ? ?以終端為對象標準設備文件;
? ? ? ?邏輯文件(設備文件):與主機進行設備交換的輸入輸出設備(即實際的物理設備)
? ? ? ? ? ? 例如:鍵盤作為標準輸入文件:文件名stdin,
? ? ? ? ? ? ? ? ? 顯示器作為標準輸出文件:文件名stdout,
? ? ? ? ? ? ? ? ? 打印機作為輸入文件:文件名PRN
③從c語言對文件的處理方式看,分為:
緩沖文件:?
? ? 對每個正在使用的文件,系統自動在內存中為其開辟一個文件緩沖區(即高級文件操作)
非緩沖文件:
? ? 系統不自動開辟文件緩沖區,由應用程序自己設置(即低級文件操作)
一、文件的處理:
1.文件類型結構:
FILE類型,包括在頭文件stdio.h
文件結構:
typedef struct {short level;//文件緩沖區剩余的字節數unsigned flags;//文件狀態標志char fd;//文件描述符unsigned char hold;//緩沖區滿丟失的字符short bsize; //文件緩沖區大小unsigned char *buffer;//文件緩沖區地址unsigned char *curp;//指針指向當前文件的讀寫位置unsigned istemp;//臨時文件,指示器short token;//用于有效性檢查 }FILE;2.文件指針變量: ?預包含stdio.h 頭文件,形式 ?FILE *文件型指針變量名
例如:FILE *fp;
fp是一個指針變量指向文件結構,要同時使用多個文件,必須有多個不同的文件指針。
3.c語言中提供了三個標準文件的指針: 標準輸入文件(鍵盤):stdin,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 標準輸出文件(顯示器):stdout,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 標準錯誤輸出文件(顯示器):stderr
二、文件的操作流程
- 第一步:打開(新建)文件(fopen)
- 第二步:對文件進行操作(讀或寫)
- 第三步:關閉文件(fclose)
1.打開文件
fopen函數
函數原型:
- FILE *fopen(charc *filename,char *mode);
//使用mode模式打開指定的filename文件
//文件打開成功,返回值為FILE類型的指針
//文件打開失敗,返回NULL
調用形式:
fp=fopen (文件名,文件使用方式);
文件名:需要打開的文件名稱(字符串)
例如:
fp=fopen(“e:\\code\\test.txt”,”rt”);//以只讀方式打開路徑為e:/code/est.txt的文件
fp=fopen(“e:/code/test.txt”,”wt”);//以只寫方式打開路徑e:/code/test.txt文件 ? ? ?
fp=fopen("text.txt","r");//只讀的方式打開一個和可執行文件在相同路徑下的文本文件test.txt
文件使用方式;
"r":讀,為讀方式(輸入)打開文件,該文件必須存在,若文件不存在,則返回NULL
"w":寫(輸出)方式打開文本文件,若文件不存在,則建立一個新文件,若文件已存在,則將原來的文件清空
"a":追加,在文本文件的末尾增加數據,若文件存在,則保持原來文件的內容,將新的數據增加到原來的后面;若文件不存在,則返回NULL;
"t":文本文件
"b":二進制文件
"+":讀和寫
文件的其他打開方式:
"r+":對文本文件進行讀/寫文件不存在返回NULL,若文件存在內容不會被清空
"w+":可以文本文件進行讀/寫操作,若文件已存在,則將文件原來的內容清空
"a+":文本文件進行讀/追加操作,文件內容不會清空
"rb+":對二進制文件進行讀/寫操作
"wb+":對二進制文件進行讀/寫操作
"ab+":對二進制文件進行讀/追加操作
常見文件打開操作:
if((fp=fopen("d:\\file.txt","r"))==NULL) {printf("cannot open file.\n");exit(0); }//以只讀方式打開D盤根目錄下“file.txt”文件,
//文件打開成功,將為該文件的結構的地址返回存入fp
//如果打開文件失敗,fopen函數返回一個空指針,exit( ); 函數:0表示程序正常退出,1表示錯誤退出
2.關閉文件:
fclose函數:
原型:int fclose (FILE *fp);
調用格式: fclose(fp);
fp:已經打開的文件指針
函數功能:關閉fp指定的文件,切斷緩沖區與該文件的聯系,并釋放文件指針
? ? ? ? ? 若文件關閉成功,返回值0,關閉失敗,返回非0值
三、文件的順序讀寫:
對文件的操作必須按照文件中字符的先后順序進行,從頭到尾主數據讀入或寫出。
字符串輸入輸出函數 ? ? fgetc ?fputc
字符串輸入輸出函數 ? ? fgets ?fputs
格式化輸入輸出函數 ? ? fscanf ?fprintf
數據塊輸入輸出函數 ? ? fread ? fwrite
1.單字符讀寫函數:
- 讀:int fgetc(FILE *fp);
- 寫:int fputc(char ch,FILE *fp
調用形式:
?輸入函數:ch=fgetc(fp);
//從指定文件中讀取一個字符,讀取的字符付給變量ch
//對于ASCⅡ文件,若讀取字符時文件已經結束或出錯,返回EOF(-1)
? 輸出函數:fputc(ch,fp);
//將一個字符輸出到指定文件中,即將字符變量ch中的字符輸出到fp所指向的文件
//輸出操作成功,則函數返回輸出的字符,否則返回EOF
2.字符串讀寫函數
- 讀:char *fgets(char *str,int n,FILE *fp);
- 寫:int fputs(char *str,FILE *fp);?
輸入函數:fgets(s,n,fp);//其中參數:char s[ ]; int n; FIFLE *fp;
//從fp所指向的文件中讀取長度不超過n-1個字符串(串尾為\0),并將該字符串放到字符數組s中,
//函數的返回值為字符數組s的首地址;文件出錯或結束,返回NULL;
//若:已讀入n-1個字符,串尾為\0 ?則:s中存入n-1個字符,串尾為\0
? ? ? 讀入字符遇\0 ? 則:s中存入實際讀入的字符,串尾\0
? ? ? 讀入字符遇見尾文件 ? 則:s中存入實際讀入的字符,EOF不存入數組,串尾\0
? ? ? 當文件已經結束時,繼續文件 ? ?則:函數返回值為空,表示文件結束
例:fgets(s,4,fp) ? ? ? ?
文本文件內容:abcd\n ? ?數組s:abc\0
? ? ? ? ? ? d\nabc ? ? ? ? ? d\n\0 ? ?
? ? ? ? ? ? ? ? ? ?? fEOF ? ? ? ? ? ? f\0 ?
輸出函數:fputs(s,fp);//其中參數:char s[ ];FIFLE *fp;
//將字符數組s中的字符串寫入文件指針fp所指文件中
//輸入成功返回0,失敗返回EOF
3.格式化輸入輸出
輸入:int fscanf(FILE fp,”格式化字符串”,[輸入項地址表]);
輸出:int fprintf(FILE fp,”格式化字符串”,[輸入項地址表]);
調用形式:
?輸入函數:fscanf(fp,格式控制符,變量地址表);//其中參數: FIFLE *fp;
//從fp所指向的ASCⅡ文件中讀取字符,按格式控制符的含義存入對應的變量中,返回值為輸入的數據個數
??輸出函數:fprintf(fp,格式控制符,表達式列表);//其中參數:FIFLE *fp;
//將表達式列表中的數據按照格式控制符的說明,存入fp所指向的ASCⅡ文件,返回值為存入的數據個數
3.數據塊輸入輸出
輸入:int fread(void *buffer,int size,int count,FILE *fp);
輸出:int fwrite(void *buffer,int size,int count,FILE *fp);
調用形式:
?輸入函數:fread(buffer,size,count,fp);
//從二進制文件fp讀取count個數據塊存入buffer中,每個數據塊的大小為size個字節
//操作成功,函數返回值為實際讀入的數據塊數量,文件結束或錯誤,返回值0
?輸入函數:fwrite(buffer,size,count,fp);
//將buffer中count個數據塊寫入二進制文件fp中,每個數據塊的大小為size個字節
//操作成功,函數返回值為實際寫入的數據塊數量,文件結束或錯誤,返回值0
四、文件的隨機讀寫:
1.位置指針返回到頭文件
函數原型:void rewind (FILE *fp);
功能:將文件內部指針移到文件開始位置
2.位置移動指針
函數原型:int fseek(FILE *fp,long off,int whence);
功能:將fp所指文件指針從 whence地址移向offset地址。
whence ?0--文件開頭 ?1--文件當前位置 ?2--文件的末尾
3.取位置指針
函數原型:int ftell(FILE *fp); 功能:得到fp所指向文件的當前位置,當出錯時返回-1L;五、文件檢測:
1.檢測文件結束函數:
函數原型:int feof(FILE *fp);功能:判斷fp所指文件指針是否位于末尾。是返回1,否返回0
2.檢測文件出錯函數:
①檢查數據輸入輸出是否出錯函數
函數原型:int ferror(FILE *fp); 功能:檢查在文件操作時,有沒有出錯。未出錯返回0,出錯返回1.②清除出錯標記及文件結束標記
函數原型:int clearerr(FILE *fp);功能:清除出錯標記及文件結束標記,使他們值為0六、函數實例:
#include<stdio.h> #include<stdlib.h> main() { FILE *fp;int i;char s[20],t[20]; gets(s); //從鍵盤輸入一個字符串 fp=fopen("e:\\stu.txt","w");//以寫的方式,打開E盤stu.txt文件for(i=0;s[i]!='\0';i++) fputc(s[i],fp);//遍歷字符串中各個字符通過fputc();寫入文件中fclose(fp);//關閉文件,完成在txt文本文件中的寫操作fp=fopen("e:\\stu.txt","r");//讀的方式打開文件fgets(t,6,fp); //注意字符串讀取末尾帶'\0' 從文件中讀取5個字符加\0存入t數組printf("The first t is :%s\n",t);printf("The current position is:%d\n",ftell(fp));//顯示讀取字符串后的當前指針位置fseek(fp,5,1);//從當前位置向后移動5個字節(4個字符和\0)printf("The current position is:%d\n",ftell(fp));fgets(t,3,fp);printf("The second t is :%s\n",t);rewind(fp);//重置位置指針到開頭位置printf("The current position is:%d\n",ftell(fp));fgets(t,3,fp);printf("The last t is :%s\n",t);fclose(fp); } 輸出結果:PS:本博客借鑒北京理工大學C語言程序設計和課本總結而成,有錯請指出,謝謝閱讀
總結
- 上一篇: 电影:美国队长:复仇者先锋
- 下一篇: did双重差分法_Stata中双重差分操