c中檔案的讀取操作
“檔案(file)”:所謂“檔案”是指一組相關資料的有序集合。資料以檔案的形式存放在外部介質(一般是磁碟、磁帶、光碟片等)上,作業系統中是以檔案為單位對資料進行管理的,以檔案名稱作為訪問檔案的標識。
C語言把檔案看作一個位元組序列,即由一連串的位元組組成。根據檔案中的資料群組織形式,資料檔案可分為ASCII碼檔案和二進位檔案。ASCII碼檔案,又稱為“文字檔”(text),其每一個位元組存放一個ASCII碼。二進位檔案,把記憶體中的資料按其在記憶體中的儲存形式存放在磁碟上。
如:十進位整數10000,在記憶體中佔兩個位元組,其存放形式是:00100111,00010000。在二進位檔案中也按這種方式存放。但是,在ASCII檔案中,十進位整數10000存放為31H、30H、30H、30H、30H,佔五個位元組,它們分別是1、0、0、0、0、0字母的ASCII碼。
c中檔案的讀取,只有通過檔案指標,才能調用相應的檔案。檔案操作的過程:對磁碟檔案的操作必須“先開啟,後讀取,最後關閉”。 下面就是利用檔案指標,開啟一個檔案,以唯讀開啟檔案。
<span style="white-space:pre"></span>FILE * fp;fp = fopen("D://1//123.txt","r");
下面分析下fopen函數中的第二個參數使用檔案方式的類別,
| 使用檔案方式 |
含義 |
| "r"(唯讀) |
為輸入開啟一個文字檔 |
| "w"(唯寫) |
為輸出開啟一個文字檔 |
| "a"(追加) |
為追加開啟一個文字檔 |
| "rb"(唯讀) |
為輸入開啟一個二進位檔案 |
| "wb"(唯寫) |
為輸出開啟一個二進位檔案 |
| "ab"(追加) |
為追加開啟一個二進位檔案 |
| "r+"(讀寫) |
為讀/寫開啟一個文字檔 |
| "w+"(讀寫) |
為讀/寫建立一個文字檔 |
| "a+"(讀寫) |
為讀/寫開啟一個文字檔 |
| "rb+"(讀寫) |
為讀/寫開啟一個二進位檔案 |
| "wb+"(讀寫) |
為讀/寫建立一個二進位檔案 |
| "ab+"(讀寫) |
為讀/寫開啟一個二進位檔案 |
注釋: 1、若使用檔案方式為“a”,表示向檔案尾添加新資料(不刪除原有資料),但要求此時檔案必須存在,否則出錯,但是我在是vs2010中調試,檔案不存在,會自動建立一個檔案,不會報錯,此外只能向檔案寫資料不能讀取檔案中的資料。若使用檔案方式為“a+”,表示向檔案尾添加新資料(不刪除原有資料),檔案不存在,會自動建立一個檔案,不會報錯,另外使用這種檔案方式,開啟的檔案即可以用來輸入資料,也可以用來輸出資料。
2、用"w"方式開啟的檔案只能用於向該檔案寫資料。如果原來不存在該檔案,則在開啟時建立一個檔案,如果該檔案存在,則先刪除該檔案(其中的資料肯定刪除了),然後重建立立一個新檔案。
3、若使用檔案方式為“w+”和“w”,如果原來不存在該檔案,則在開啟時建立一個檔案,如果該檔案存在,則先刪除該檔案(其中的資料肯定刪除了),然後重建立立一個新檔案。
4、若使用檔案方式為“r+",該檔案必須存在,向檔案中寫入資料的時候,不會先刪除該檔案,而是直接覆蓋,能覆蓋多少就覆蓋多少,覆蓋不了的先前資料仍然存在檔案中。
使用檔案方式為“r+”,向檔案中存入資料:
int main(void){FILE * fp;if((fp = fopen("D://1//123.txt","r+"))== NULL){printf("can not open the file\n");exit(0);}char str[] ="he fei wo yao liu xia1";int len = strlen(str);for(int i = 0; i < len;i++){fputc(str[i],fp);}fclose(fp);return 0;}
使用檔案方式為“r+”,從檔案中讀出資料
int main(void){FILE * fp;if((fp = fopen("D://1//123.txt","r+"))== NULL){printf("can not open the file\n");exit(0);}char ch = fgetc(fp);while(ch != EOF)//從文字檔中讀取資料{putchar(ch);ch = fgetc(fp);}fclose(fp);return 0;}
對於文字檔,遇檔案尾時返迴文件結束標誌EOF。對於二進位檔案,用feof(fp) 判別是否遇檔案尾,feof(fp)=1說明遇檔案尾。
從文字檔中順序讀入檔案內容,並在螢幕上顯示出來,可以用:
ch = fgetc(fp); while(ch != EOF) { putchar(ch); ch = fgetc(fp); }
從二進位檔案中順序讀入檔案內容,可以用:
while(!feof(fp)){ch = fgetc(fp);} 如果在檔案中寫入資料,如果沒有關閉就直接讀取檔案中的內容,就會出現錯誤-寫好檔案後,沒有關閉,那麼檔案指標在最後一個位置,那你在讀的時候肯定就是從末尾啊,所以是隨機字元,這樣會出現亂碼。如何糾正,等檔案寫完資料後,首先關閉檔案,再讀取檔案,即可,如下 fclose(fp);
fp = fopen("D://1//123.txt","r+");
下面介紹讀寫字串函數:fgets和fputs:
1、讀字串函數fgets函數 功能:從指定的檔案中讀一個字串到字元數組中,函數調用的形式為: fgets(字元數組名,n,檔案指標);其中的n是一個正整數。表示從檔案中讀出的字串不超過 n-1個字元。在讀入的最後一個字元後加上串結束標誌'\0'。例如:fgets(str,n,fp);的意義是從fp所指的檔案中讀出n-1個字元送入字元數組str中。
注意:
a、在讀出n-1個字元之前,如遇到了分行符號或EOF,則讀出結束,但遇到空格不結束。
b、fgets函數也有傳回值,其傳回值是字元數組的首地址。
int main(void){FILE *fp;char str[12];if((fp=fopen("D://1//123.txt","rt"))==NULL){printf("Cannot open file !");exit(0);}fgets(str,12,fp);printf("%s",str);fclose(fp);return 0;}
2、寫字串函數fputs函數 功能:向指定的檔案寫入一個字串,其調用形式為: fputs(字串,檔案指標) 其中字串可以是字串常量,也可以是字元數組名或指標 變數,例如:fputs(“abcd“,fp);
int main(void){FILE *fp;char ch,st[20];if((fp=fopen("D://1//123.txt","a+"))==NULL){printf("Cannot open file !");exit(0);}printf("input a string:\n");scanf("%s",st);fputs(st,fp);rewind(fp);//把檔案流的指標指向開頭的位置ch=fgetc(fp);while(ch!=EOF){putchar(ch);ch=fgetc(fp);}fclose(fp);return 0;}
下面介紹檔案中的格式化函數fscanf和fprintf
1、fscanf
a、函數原型:
int fscanf(FILE *fp,char *format,arg_list)
b、功能說明
將fp指定的檔案中的資料按照format指定的格式,輸出到變數表列(arg_list)中的相應變數。fscanf遇到空格和分行符號就結束。表示遇到空格或者分行符號,檔案中的相應資料讀取結束。 c、注意 檔案中的資料以逗號隔開,對應的format中的指定格式也以逗號隔開。此時我在vs2010中運行出現錯誤。 d、傳回值 成功返回讀入的參數的個數,失敗返回EOF(-1)。
void main(){FILE* fp ;if((fp = fopen("D://1.txt","r+"))==NULL){printf("can not open the file");exit(1);}int a;double b;char c[15];fscanf(fp,"%d%lf%s",&a,&b,c);printf("%d ",a);printf("%lf ",b);printf("%s ",c);}
2、fprintf
a、函數原型:
int fprintf(FILE *fp,char *format,arg_list)
b、功能說明
將變數表列(arg_list)中的資料,按照format指出的格式,寫入由fp指定的檔案。fprintf()函數與printf()函數的功能相同,只是printf()函數是將資料寫入螢幕檔案(stdout)。 fprintf函數按格式將記憶體中的資料轉換成對應的字元,並以ASCⅡ代碼形式輸出到文字檔中。
c、參數說明
fp:這是個檔案指標,指出要將資料寫入的檔案。
format:這是個指向字串的字元指標,字串中含有要寫出資料的格式,所以該字串成為格式串。格式串描述的規則與printf()函數中的格式串相同。
arg_list:是要寫入檔案的變數表列,各變數之間用逗號分隔。
d、傳回值
輸出的字元數,發生錯誤時返回一個負值。
void main(){FILE* fp ;if((fp = fopen("D://1.txt","wb+"))==NULL){printf("can not open the file");exit(1);}int a = 100;double b = 6.5;char c[15] ="tansheng";fprintf(fp,"%d %lf %s",a,b,c);}
fprintf格式串中之間有空格或者有逗號,則對應在檔案中也有相應的空格或逗號。
fprintf和fscanf函數對磁碟檔案讀寫,使用方便,但由於在輸入時要將ASCII碼轉換為二進位形式,在輸出時又要將二進位形式轉換為字元,花費時間比較多。因此,在記憶體與磁碟頻繁交換資料的情況下,最好不用fprinf和fscanf函數,而用fread和fwrite。