標籤:.com 長度 http 相對 庫函數 arc 出錯 判斷 div
轉自:http://www.cnblogs.com/likebeta/archive/2012/06/16/2551780.html
C語言中沒有輸入輸出語句,所有的輸入輸出功能都用 ANSI C提供的一組標準庫函數來實現。檔案操作標準庫函數有:
檔案的開啟操作 fopen 開啟一個檔案
檔案的關閉操作 fclose 關閉一個檔案
檔案的讀寫操作 fgetc 從檔案中讀取一個字元
fputc 寫一個字元到檔案中去
fgets 從檔案中讀取一個字串
fputs 寫一個字串到檔案中去
fprintf 往檔案中寫格式化資料
fscanf 格式化讀取檔案中資料
fread 以二進位形式讀取檔案中的資料
fwrite 以二進位形式寫資料到檔案中去
getw 以二進位形式讀取一個整數
putw 以二進位形式存貯一個整數
檔案狀態檢查函數 feof 檔案結束
ferror 檔案讀/寫出錯
clearerr 清除檔案錯誤標誌
ftell 瞭解檔案指標的當前位置
檔案定位函數 rewind 反繞
fseek 隨機定位
# 檔案的開啟
1.函數原型
FILE *fopen(char *pname,char *mode)
2.功能說明
按照mode 規定的方式,開啟由pname指定的檔案。若找不到由pname指定的相應檔案,就按以下方式之一處理:
(1) 此時如mode 規定按寫方式開啟檔案,就按由pname指定的名字建立一個新檔案;
(2) 此時如mode 規定按讀方式開啟檔案,就會產生一個錯誤。
開啟檔案的作用是:
(1)分配給開啟檔案一個FILE 類型的檔案結構體變數,並將有關資訊填入檔案結構體變數;
(2)開闢一個緩衝區;
(3)叫用作業系統提供的開啟檔案或建立新檔案功能,開啟或建立指定檔案;
FILE *:指出fopen是一個返迴文件類型的指標函數;
3.參數說明
pname:是一個字元指標,它將指向要開啟或建立的檔案的檔案名稱字串。
mode:是一個指向檔案處理方式字串的字元指標,操作方式如下:
"r" 開啟,唯讀; "w" 開啟,檔案指標指到頭,唯寫; "a" 開啟,指向檔案尾,在已存在檔案中追加;
"rb" 開啟一個二進位檔案,唯讀; "wb" 開啟一個二進位檔案,唯寫; "ab" 開啟一個二進位檔案,進行追加 ;
"r+" 以讀/寫方式開啟一個已存在的檔案; "w+" 以讀/寫方式建立一個新的文字檔 ;
"a+" 以讀/寫方式開啟一個檔案檔案進行追加 ;"rb+" 以讀/寫方式開啟一個二進位檔案;
"wb+" 以讀/寫方式建立一個新的二進位檔案 ;"ab+" 以讀/寫方式開啟一個二進位檔案進行追加 。
4.傳回值
正常返回:被開啟檔案的檔案指標。
異常返回:NULL,表示開啟操作不成功。
例如:
//定義一個名叫fp檔案指標FILE *fp;//判斷按讀方式開啟一個名叫test的檔案是否失敗if((fp=fopen("test","r")) == NULL)//開啟操作不成功{ printf("The file can not be opened.\n"); exit(1);//結束程式的執行}
要說明的是:C語言將電腦的輸入輸出裝置都看作是檔案。例如,鍵盤檔案、螢幕檔案等。ANSI C標準規定,在執行程式時系統先自動開啟鍵盤、螢幕、錯誤三個檔案。這三個檔案的檔案指標分別是:標準輸入stdin、標準輸出stdout和標準出錯 stderr。
* 檔案的關閉
1. 函數原型
int fclose(FILE *fp);
2. 功能說明
關閉由fp指出的檔案。此時叫用作業系統提供的檔案關閉功能,關閉由fp->fd指出的檔案;釋放由fp指出的檔案類型結構體變數;返回操作結果,即0或EOF。
3. 參數說明
fp:一個已開啟檔案的檔案指標。
4. 傳回值
正常返回:0。
異常返回:EOF,表示檔案在關閉時發生錯誤。
例如:
int n=fclose(fp);
*檔案的讀寫操作
A. 從檔案中讀取一個字元
1. 函數原型
int fgetc(FILE *fp);
2. 功能說明
從fp所指檔案中讀取一個字元。
3. 參數說明
fp:這是個檔案指標,它指出要從中讀取字元的檔案。
4. 傳回值
正常返回: 返回讀取字元的代碼。
非正常返回:返回EOF。例如,要從"寫開啟"檔案中讀取一個字元時,會發生錯誤而返回一個EOF。
5. 執行個體
【例8.1】顯示指定檔案的內容。
//程式名為:display.c//執行時可用:display filename1 形式的命令列運行。顯示檔案filename1中的內容。例如,執行命令列display display.c將在螢幕上顯示display的原代碼。//File display program.#include <stdio.h>void main(int argc,char *argv[]) //命令列參數{ int ch;//定義檔案類型指標 FILE *fp;//判斷命令列是否正確 if(argc!=2) { printf("Error format,Usage: display filename1\n"); return; //鍵入了錯誤的命令列,結束程式的執行 } //按讀方式開啟由argv[1]指出的檔案 if((fp=fopen(argv[1],"r"))==NULL) { printf("The file <%s> can not be opened.\n",argv[1]);//開啟操作不成功 return;//結束程式的執行 } //成功開啟了argv[1]所指檔案 ch=fgetc(fp); //從fp所指檔案的當前指標位置讀取一個字元 while(ch!=EOF) //判斷剛讀取的字元是否是檔案結束符 { putchar(ch); //若不是結束符,將它輸出到螢幕上顯示 ch=fgetc(fp); //繼續從fp所指檔案中讀取下一個字元 } //完成將fp所指檔案的內容輸出到螢幕上顯示 fclose(fp); //關閉fp所指檔案}
B. 寫一個字元到檔案中去
1. 函數原型
int fputc(int ch,FILE *fp)
2. 功能說明
把ch中的字元寫入由fp指出的檔案中去。
3. 參數說明
ch:是一個整型變數,記憶體要寫到檔案中的字元(C語言中整型量和字元量可以通用)。
fp:這是個檔案指標,指出要在其中寫入字元的檔案。
4. 傳回值
正常返回: 要寫入字元的代碼。
非正常返回:返回EOF。例如,要往"讀開啟"檔案中寫一個字元時,會發生錯誤而返回一個EOF。
5. 執行個體
【例8.2】將一個檔案的內容複寫到另一個檔案中去。
//程式名為:copyfile.c//執行時可用:copyfile filename1 filename2形式的命令列運行,將檔案filename1中的內容複寫到檔案filename2中去。//file copy program.#include <stdio.h>void main(int argc,char *argv[]) //命令列參數{ int ch; FILE *in,*out; //定義in和out兩個檔案類型指標 if(argc!=3) //判斷命令列是否正確 { printf("Error in format,Usage: copyfile filename1 filename2\n"); return; //命令列錯,結束程式的執行 } //按讀方式開啟由argv[1]指出的檔案 if((in=fopen(argv[1],"r"))==NULL) { printf("The file <%s> can not be opened.\n",argv[1]); return; //開啟失敗,結束程式的執行 } //成功開啟了argv[1]所指檔案,再 //按寫方式開啟由argv[2]指出的檔案 if((out=fopen(argv[2],"w"))==NULL) { printf("The file %s can not be opened.\n",argv[2]); return; //開啟失敗,結束程式的執行 } //成功開啟了argv[2]所指檔案 ch=fgetc(in); //從in所指檔案的當前指標位置讀取一個字元 while(ch!=EOF) //判斷剛讀取的字元是否是檔案結束符 { fputc(ch,out); //若不是結束符,將它寫入out所指檔案 ch=fgetc(in); //繼續從in所指檔案中讀取下一個字元 } //完成將in所指檔案的內容寫入(複製)到out所指檔案中 fclose(in); //關閉in所指檔案 fclose(out); //關閉out所指檔案}
【例8.3】按十進位和字元顯示檔案代碼,若遇不可示字元就用井號"#"字元代替之。
//程式名為:dumpf.c//執行時可用:dumpf filename1 形式的命令列運行。// File dump program.#include <stdio.h>void main(int argc,char *argv[]){ char str[9]; int ch,count,i; FILE *fp; if(argc!=2) { printf("Error format,Usage: dumpf filename\n"); return; } if((fp=fopen(argv[1],"r"))==NULL) { printf("The file %s can not be opened.\n",argv[1]); return; } count=0; do{ i=0; //按八進位輸出第一列,作為一行八個位元組的首地址 printf("%06o: ",count*8); do{ // 從開啟的檔案中讀取一個字元 ch=fgetc(fp); // 按十進位方式輸出這個字元的ASCII碼 printf("%4d",ch); // 如果是不可示字元就用"#"字元代替 if(ch<‘ ‘||ch>‘~‘) str[i]=‘#‘; // 如果是可示字元,就將它存入數組str以便形成字串 else str[i]=ch; // 保證每一行輸出八個字元 if(++i==8) break; }while(ch!=EOF); // 遇到檔案尾標誌,結束讀檔案操作 str[i]=‘\0‘; // 在數組str加字串結束標誌 for(;i<8;i++) printf(" "); // 一行不足八個字元用空格填充 printf(" %s\n",str); // 輸出字串 count++; // 準備輸出下一行 }while(ch!=EOF); // 直到檔案結束 fclose(fp); // 關閉fp所指檔案}
C. 從檔案中讀取一個字串
1. 函數原型
char *fgets(char *str,int n,FILE *fp)
2. 功能說明
從由fp指出的檔案中讀取n-1個字元,並把它們存放到由str指出的字元數組中去,最後加上一個字串結束符‘\0‘。
3. 參數說明
str:接收字串的記憶體位址,可以是數組名,也可以是指標。
n: 指出要讀取字元的個數。
fp:這是個檔案指標,指出要從中讀取字元的檔案。
4. 傳回值
正常返回:返回字串的記憶體首地址,即str的值。
非正常返回:返回一個NULL值,此時應當用feof()或ferror()函數來判別是讀取到了檔案尾,還是發生了錯誤。例如,要從"寫開啟"檔案中讀取字串,將
發生錯誤而返回一個NULL值。
D. 寫一個字串到檔案中去
1. 函數原型
int fputs(char *str,FILE *fp)
2. 功能說明
把由str指出的字串寫入到fp所指的檔案中去。
3. 參數說明
str:指出要寫到檔案中去的字串。
fp:這是個檔案指標,指出字串要寫入其中的檔案。
4. 傳回值
正常返回: 寫入檔案的字元個數,即字串的長度。
非正常返回:返回一個NULL值,此時應當用feof()或ferror()函數來判別是讀取到了檔案尾,還是發生了錯誤。例如,要往一個"讀開啟" 檔案中寫字串時,
會發生錯誤而返回一個NULL值。
5.執行個體
【例8.4】以下程式將一個檔案的內容附加到另一個檔案中去。
//程式名:linkfile.c//執行時可用:linkfile filename1 filename2形式的命令列運行,將檔案filename2的內容附加在檔案filename1之後。// file linked program.#include <stdio.h>#define SIZE 512void main(int argc,char *argv[]){ char buffer[SIZE]; FILE *fp1,*fp2; if(argc!=3) { printf("Usage: linkfile filename1 filename2\n"); return; } // 按追加方式開啟argv[1] 所指檔案 if((fp1=fopen(argv[1],"a"))==NULL) { printf("The file %s can not be opened.\n",argv[1]); return; } if((fp2=fopen(argv[2],"r"))==NULL) { printf("The file %s can not be opened.\n",argv[2]); return; } // 讀入一行立即寫出,直到檔案結束 while(fgets(buffer,SIZE,fp1)!=NULL) printf("%s\n",buffer); while(fgets(buffer,SIZE,fp2)!=NULL) fputs(buffer,fp1); fclose(fp1); fclose(fp2); if((fp1=fopen(argv[1],"r"))==NULL) { printf("The file %s can not be opened.\n",argv[1]); return; } while(fgets(buffer,SIZE,fp1)!=NULL) printf("%s\n",buffer); fclose(fp1);}
E. 往檔案中寫格式化資料
1.函數原型
int fprintf(FILE *fp,char *format,arg_list)
2.功能說明
將變數表列(arg_list)中的資料,按照format指出的格式,寫入由fp指定的檔案。fprintf()函數與printf()函數的功能相同,只是printf()函數是將資料寫入螢幕檔案(stdout)。
3.參數說明
fp:這是個檔案指標,指出要將資料寫入的檔案。
format:這是個指向字串的字元指標,字串中含有要寫出資料的格式,所以該字串成為格式串。格式串描述的規則與printf()函數中的格式串相同。
arg_list:是要寫入檔案的變數表列,各變數之間用逗號分隔。
4.傳回值
無。
5. 執行個體
【8.5】下列程式的執行檔案為display.exe,執行時鍵入命令列:
display [-i][-s] filename
下面的表格列出了命令列參數的含義及其功能:
//隱藏檔名:save.txt//程式碼如下:// file display program.#include <stdio.h>void main(){ char name[10]; int nAge,nClass; long number; FILE *fp; if((fp=fopen("student.txt","w"))==NULL) { printf("The file %s can not be opened.\n","student.txt"); return; } fscanf(stdin,"%s %d %d %ld",name,&nClass,&nAge,&number); fprintf(fp,"%s %5d %4d %8ld",name,nClass,nAge,number); fclose(fp); if((fp=fopen("student.txt","r"))==NULL) { printf("The file %s can not be opened.\n","student.txt"); return; } fscanf(fp,"%s %d %d %ld",name,&nClass,&nAge,&number); printf("name nClass nAge number\n"); fprintf(stdout,"%-10s%-8d%-6d%-8ld\n",name,nClass,nAge,number); fclose(fp);}
G. 以二進位形式讀取檔案中的資料
1. 函數原型
int fread(void *buffer,unsigned sife,unsigned count,FILE *fp)
2. 功能說明
從由fp指定的檔案中,按二進位形式將sife*count個資料讀到由buffer指出的資料區中。
3. 參數說明
buffer:這是一個void型指標,指出要將讀入資料存放在其中的儲存區首地址。
sife:指出一個資料區塊的位元組數,即一個資料區塊的大小尺寸。
count:指出一次讀入多少個資料區塊(sife)。
fp:這是個檔案指標,指出要從其中讀出資料的檔案。
4.傳回值
正常返回:實際讀取資料區塊的個數,即count。
異常返回:如果檔案中剩下的資料區塊個數少於參數中count指出的個數,或者發生了錯誤,返回0值。此時可以用feof()和ferror()來判定到底出現了什麼
情況。
H. 以二進位形式寫資料到檔案中去
1. 函數原型
int fwrite(void *buffer,unsigned sife,unsigned count,FILE *fp)
2. 功能說明
按二進位形式,將由buffer指定的資料緩衝區內的sife*count個資料寫入由fp指定的檔案中去。
3. 參數說明
buffer:這是一個void型指標,指出要將其中資料輸出到檔案的緩衝區首地址。
sife:指出一個資料區塊的位元組數,即一個資料區塊的大小尺寸。
count:一次輸出多少個資料區塊(sife)。
fp:這是個檔案指標,指出要從其中讀出資料的檔案。
4.傳回值
正常返回:實際輸出資料區塊的個數,即count。
異常返回:返回0值,表示輸出結束或發生了錯誤。
5.執行個體
【例8.7】
#include <stdio.h>#define SIZE 4struct worker{ int number; char name[20]; int age;};void main(){ struct worker wk; int n; FILE *in,*out; if((in=fopen("file1.txt","rb"))==NULL) { printf("The file %s can not be opened.\n","file1.txt"); return; } if((out=fopen("file2.txt","wb"))==NULL) { printf("The file %s can not be opened.\n","file2.txt"); return; } while(fread(&wk,sizeof(struct worker),1,in)==1) fwrite(&wk,sizeof(struct worker),1,out); fclose(in); fclose(out);}
I. 以二進位形式讀取一個整數
1. 函數原型
int getw(FILE *fp)
2. 功能說明
從由fp指定的檔案中,以二進位形式讀取一個整數。
3. 參數說明
fp:是檔案指標。
4. 傳回值
正常返回:所讀取整數的值。
異常返回:返回EOF,即-1。由於讀取的整數值有可能是-1,所以必須用feof()或ferror()來判斷是到了檔案結束,還是出現了一個出錯。
5. 執行個體
【例8.8】
#include <stdio.h>void main(int argc,char *argv[]){ int i,sum=0; FILE *fp; if(argc!=2) { printf("Command error,Usage: readfile filename\n"); exit(1); } if(!(fp=fopen(argv[1],"rb"))) { printf("The file %s can not be opened.\n",argv[1]); exit(1); } for(i=1;i<=10;i++) sum+=getw(fp); printf("The sum is %d\n",sum); fclose(fp);}
J. 以二進位形式存貯一個整數
1.函數原型
int putw(int n,FILE *fp)
2. 功能說明
以二進位形式把由變數n指出的整數值存放到由fp指定的檔案中。
3. 參數說明
n:要存入檔案的整數。
fp:是檔案指標。
4. 傳回值
正常返回:所輸出的整數值。
異常返回:返回EOF,即-1。由於輸出的整數值有可能是-1,所以必須用feof()或ferror()來判斷是到了檔案結束,還是出現了一個出錯。
5. 執行個體
【例8.9】
#include <stdio.h>void main(int argc,char *argv[]){ int i; FILE *fp; if(argc!=2) { printf("Command error,Usage: writefile filename\n"); return; } if(!(fp=fopen(argv[1],"wb"))) { printf("The file %s can not be opened.\n",argv[1]); return; } for(i=1;i<=10;i++) printf("%d\n", putw(i,fp)); fclose(fp);}
* 檔案狀態檢查
A. 檔案結束
(1) 函數原型
int feof(FILE *fp)
(2) 功能說明
該函數用來判斷檔案是否結束。
(3) 參數說明
fp:檔案指標。
(4) 傳回值
0:假值,表示檔案未結束。
1:真值,表示檔案結束。
(5) 執行個體
【例8.10】
#include <stdio.h>void main(int argc,char *argv[]){ FILE *in,*out; char ch; if(argc!=3) { printf("Usage: copyfile filename1 filename2\n"); return; } if((in=fopen(argv[1],"rb"))==NULL) { printf("The file %s can not be opened.\n",argv[1]); return; } if((out=fopen(argv[2],"wb"))==NULL) { printf("The file %s can not be opened.\n",argv[2]); return; } while(!feof(in)) { ch=fgetc(in); if(ferror(in)) { printf("read error!\n"); clearerr(in); } else { fputc(ch,out); if(ferror(out)) { printf("write error!\n"); clearerr(out); } } } fclose(in); fclose(out);}
B. 檔案讀/寫出錯
(1) 函數原型
int ferror(FILE *fp)
(2) 功能說明
檢查由fp指定的檔案在讀寫時是否出錯。
(3) 參數說明
fp:檔案指標。
(4) 傳回值
0:假值,表示無錯誤。
1:真值,表示出錯。
C. 清除檔案錯誤標誌
(1) 函數原型
void clearerr(FILE *fp)
(2) 功能說明
清除由fp指定檔案的錯誤標誌。
(3) 參數說明
fp:檔案指標。
(4) 傳回值
無。
(5) 執行個體
【例8.12】
#include <stdio.h>void main(int argc,char *argv[]){ FILE *in,*out; char ch; if(argc!=3) { printf("Usage: copyfile filename1 filename2\n"); return; } if((in=fopen(argv[1],"rb"))==NULL) { printf("The file %s can not be opened.\n",argv[1]); return; } if((out=fopen(argv[2],"wb"))==NULL) { printf("The file %s can not be opened.\n",argv[2]); return; } while(!feof(in)) { ch=fgetc(in); if(ferror(in)) { printf("read error!\n"); clearerr(in); } else { fputc(ch,out); if(ferror(out)) { printf("write error!\n"); clearerr(out); } } } fclose(in); fclose(out);}
D. 瞭解檔案指標的當前位置
(1) 函數原型
long ftell(FILE *fp)
(2) 功能說明
取得由fp指定檔案的當前讀/寫位置,該位置值用相對於檔案開頭的位移量來表示。
(3) 參數說明
fp:檔案指標。
(4) 傳回值
正常返回:位移量(這是個長整數)。
異常返回:-1,表示出錯。
(5) 執行個體
* 檔案定位
A. 反繞
(1) 函數原型
void rewind(FILE *fp)
(2) 功能說明
使由檔案指標fp指定的檔案的位置指標重新指向檔案的開頭位置。
(3) 參數說明
fp:檔案指標。
(4) 傳回值
無。
(5) 執行個體
【例8.14】
#include <stdio.h>void main(){ FILE *in,*out; in=fopen("filename1","r"); out=fopen("filename2","w"); while(!feof(in)) fputc(fgetc(in),out); rewind(out); while(!feof(in)) putchar(fgetc(in)); fclose(in); fclose(out);}
B. 隨機定位
(1) 函數原型
int fseek(FILE *fp,long offset,int base)
(2) 功能說明
使檔案指標fp移到基於base的相對位置offset處。
(3)參數說明
fp:檔案指標。
offset:相對base的位元組位移量。這是個長整數,用以支援大於64KB的檔案。
base:檔案位置指標移動的基準位置,是計算檔案位置指標位移的基點。ANSI C定義了base的可能取值,以及這些取值的符號常量。
(4)傳回值
正常返回:當前指標位置。
異常返回:-1,表示定位操作出錯。
(5)執行個體
【例8.15】
#include <stdio.h>#include <string.h>struct std_type{ int num; char name[20]; int age; char class;}stud;int cstufile(){ int i; FILE *fp; if((fp=fopen("stufile","wb"))==NULL) { printf("The file can‘t be opened for write.\n"); return 0; } for(i=1;i<=100;i++) { stud.num=i; strcpy(stud.name,"aaaa"); stud.age=17; stud.class=‘8‘; fwrite(&stud,sizeof(struct std_type),1,fp); } fclose(fp); return 1;}void main(){ int n; FILE *fp; if(cstufile()==0) return; if((fp=fopen("stufile","rb"))==NULL) { printf("The file can not be opened.\n"); return; } for(n=0;n<100;n+=2) { fseek(fp,n*sizeof(struct std_type),SEEK_SET); fread(&stud,sizeof(struct std_type),1,fp); printf("%10d%20s%10d%4c\n",stud.num,stud.name,stud.age,stud.class); } fclose(fp);}
* 關於exit()函數
1. 函數原型
void exit(int status)
2. 功能說明
exit()函數使程式立即終止執行,同時將緩衝區中剩餘的資料輸出並關閉所有已經開啟的檔案。
3. 參數說明
status:為0值表示程式正常終止,為非0值表示一個定義錯誤。
4. 傳回值
無。
* 關於feof()函數
1. 函數原型
int feof(FILE *fp)
2. 功能說明
在文字檔(ASCII檔案)中可以用值為-1的符號常量EOF來作為檔案的結束符。但是在二進位檔案中-1往往可能是一個有意義的資料,因此不能用它 來作為檔案的結束標誌。為了能有效判別檔案是否結束,ANSI C提供了標準函數feof(),用來識別檔案是否結束。
3. 參數說明
fp:檔案指標。
4. 傳回值
返回為非0值:已到檔案尾。
返回為0值:表示還未到檔案尾。
【轉】 C語言檔案操作詳解