天天看點

C檔案讀寫函數介紹(轉)

1.fopen()

  fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen實作三個功能:為使用而打開一個流,把一個檔案和此流相連接配接,給此流傳回一個FILR指針。

  參數filename指向要打開的檔案名,mode表示打開狀态的字元串,其取值如下: 

  字元串 含義 

  "r" 以隻讀方式打開檔案 

  "w" 以隻寫方式打開檔案 

  "a" 以追加方式打開檔案 

  "r+" 以讀/寫方式打開檔案,如無檔案出錯 

  "w+" 以讀/寫方式打開檔案,如無檔案生成新檔案 

  一個檔案可以以文本模式或二進制模式打開,這兩種的差別是:在文本模式中回車被當成一個字元’/n’,而二進制模式認為它是兩個字元0x0D,0x0A;如果在檔案中讀到0x1B,文本模式會認為這是檔案結束符,也就是二進制模型不會對檔案進行處理,而文本方式會按一定的方式對資料作相應的轉換。 

  系統預設的是以文本模式打開,可以修改全部變量_fmode的值來修改這個設定,例如_fmode=O_TEXT;就設定預設打開方式為文本模式;而_fmode=O_BINARY;則設定預設打開方式是二進制模式。 

  我們也可以在模式字元串中指定打開的模式,如"rb"表示以二進制模式打開隻讀檔案,"w+t"或"wt+"表示以文本模式打開讀/寫檔案。 

  此函數傳回一個FILE指針,是以申明一個FILE指針後不用初始化,而是用fopen()來傳回一個指針并與一個特定的檔案相連,如果成敗,傳回NULL.

  例: 

   以下是引用片段: 

FILE *fp; 

  if(fp=fopen("123.456","wb")) 

  puts("打開檔案成功"); 

  else 

  puts("打開檔案成敗");

2.fclose()

  fclose()的功能就是關閉用fopen()打開的檔案,其原型是:int fclose(FILE *fp);如果成功,傳回0,失敗傳回EOF。 

  在程式結束時一定要記得關閉打開的檔案,不然可能會造成資料丢失的情況,我以前就經常犯這樣的錯誤。

  例:fclose(fp); 

3.fputc()

  向流寫一個字元,原型是int fputc(int c, FILE *stream); 成功傳回這個字元,失敗傳回EOF。 

  例:fputc(’X’,fp); 

4.fgetc() 

  從流中讀一個字元,原型是int fputc(FILE *stream); 成功傳回這個字元,失敗傳回EOF。 

  例:char ch1=fgetc(fp); 

5. fseek()

  此函數一般用于二進制模式打開的檔案中,功能是定位到流中指定的位置,原型是int fseek(FILE *stream, long offset, int whence);如果成功傳回0,參數offset是移動的字元數,whence是移動的基準,取值是: 

  符号常量 值 基準位置 

  SEEK_SET 0 檔案開頭 

  SEEK_CUR 1 目前讀寫的位置 

  SEEK_END 2 檔案尾部 

  例:fseek(fp,1234L,SEEK_CUR);//把讀寫位置從目前位置向後移動1234位元組(L字尾表示長整數) 

  fseek(fp,0L,2);//把讀寫位置移動到檔案尾

6.fputs() 

  寫一個字元串到流中,原型int fputs(const char *s, FILE *stream); 

  例:fputs("I Love You",fp); 

7.fgets()

  從流中讀一行或指定個字元,原型是char *fgets(char *s, int n, FILE *stream); 從流中讀取n-1個字元,除非讀完一行,參數s是來接收字元串,如果成功則傳回s的指針,否則傳回NULL。 

  例:如果一個檔案的目前位置的文本如下: 

  Love ,I Have 

  But …….. 

  如果用 

  fgets(str1,4,file1); 

  則執行後str1="Lov",讀取了4-1=3個字元,而如果用 

  fgets(str1,23,file1); 

  則執行str="Love ,I Have",讀取了一行(不包括行尾的’/n’)。 

8.fprintf()

  按格式輸入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, …]);其用法和printf()相同,不過不是寫到控制台,而是寫到流罷了。 

  例:fprintf(fp,"%2d%s",4,"Hahaha"); 

9.fscanf()

  從流中按格式讀取,其原型是int fscanf(FILE *stream, const char *format[, address, …]);其用法和scanf()相同,不過不是從控制台讀取,而是從流讀取罷了。 

  例:fscanf(fp,"%d%d" ,&x,&y); 

10.feof()

  檢測是否已到檔案尾,是傳回真,否則傳回0,其原型是int feof(FILE *stream); 

  例:if(feof(fp))printf("已到檔案尾"); 

11.ferror()

  原型是int ferror(FILE *stream);傳回流最近的錯誤代碼,可用clearerr()來清除它,clearerr()的原型是void clearerr(FILE *stream); 

  例:printf("%d",ferror(fp)); 

12.rewind()

  把目前的讀寫位置回到檔案開始,原型是void rewind(FILE *stream);其實本函數相當于fseek(fp,0L,SEEK_SET); 

  例:rewind(fp); 

13.remove()

  删除檔案,原型是int remove(const char *filename); 參數就是要删除的檔案名,成功傳回0。 

  例:remove("c://io.sys"); 

14.fread()

  從流中讀指定個數的字元,原型是size_t fread(void *ptr, size_t size, size_t n, FILE *stream);參數ptr是儲存讀取的資料,void*的指針可用任何類型的指針來替換,如char*、int *等等來替換;size是每塊的位元組數;n是讀取的塊數,如果成功,傳回實際讀取的塊數(不是位元組數),本函數一般用于二進制模式打開的檔案中。 

  例: 

   以下是引用片段: 

char x[4230]; 

  FILE *file1=fopen("c://msdos.sys","r"); 

  fread(x,200,12 ,file1);//共讀取200*12=2400個位元組 

15.fwrite()

  與fread對應,向流中寫指定的資料,原型是size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);參數ptr是要寫入的資料指針,void*的指針可用任何類型的指針來替換,如char*、int *等等來替換;size是每塊的位元組數;n是要寫的塊數,如果成功,傳回實際寫入的塊數(不是位元組數),本函數一般用于二進制模式打開的檔案中。

  例: 

   以下是引用片段: 

  char x[]="I Love You"; 

  fwire(x, 6,12,fp);//寫入6*12=72位元組 

  将把"I Love"寫到流fp中12次,共72位元組 

16.tmpfile()

  其原型是FILE *tmpfile(void); 生成一個臨時檔案,以"w+b"的模式打開,并傳回這個臨時流的指針,如果失敗傳回NULL。在程式結束時,這個檔案會被自動删除。 

  例:FILE *fp=tmpfile(); 

17.tmpnam();

  其原型為char *tmpnam(char *s); 生成一個唯一的檔案名,其實tmpfile()就調用了此函數,參數s用來儲存得到的檔案名,并傳回這個指針,如果失敗,傳回NULL。 

  例:tmpnam(str1);

1.    首先要了解幾個概念: 

檔案: 按一定規則存儲在磁盤上的資料集合。 

檔案名: 能唯一辨別某個磁盤檔案的字元串。形式: 盤符:/ 路徑 / 檔案名.擴充名 

文本檔案:: 資料以其數字字元的ASCII碼形式、一個位元組一個位元組地存儲在磁盤上。 

二進制檔案:資料以二進制形式在存儲在磁盤上。 

裝置檔案:輸入/輸出裝置 

标準輸入檔案:鍵盤 

标準輸出檔案/标準錯誤輸出檔案:顯示器 

檔案型指針:C語言是通過名為FILE的結構型指針來管理檔案讀寫的。FILE *<變量名> 

檔案的打開和關閉 :檔案操作先建立檔案與檔案指針之間的關系,接着進行檔案的讀與寫。建立檔案與檔案指針之間的聯系的過程是檔案的打開。終止這種聯系就是檔案的關閉。 

FILE結構:定義在〈stdio.h〉中。形式如下: 

typedef struct 

int  _fd;    

int  _cleft;        

int  _mode;     

char  *nextc;      

char  *buff;     

}FILE; 

2. 主要操作函數用相應的使用 

1) 檔案的打開與關閉:  

#include <stdio.h> 

FILE *fp; 

fp = fopen(char* filename,  char*  made); 

if(fp == NULL) 

exit(0); 

fclose(fp) 

mode和種類有: 

r : 打開一個文本檔案,供讀取資料, 檔案不存在,則傳回NULL 

w : 建立一個供寫入的文本檔案. 廢棄原有内容 

a: 打開或建立一個把資料追加到檔案尾的文本檔案 

r+: 更新資料 

w+ : 更新資料,廢棄原有内容 

a+ : 更新資料, 寫入的資料追加到檔案尾. 

二進制在後面加"b" 

标準輸入/輸出檔案的檔案型指針:  stdin, stdout, stderr 

2)   檔案的讀與寫: 

把一個字元寫入檔案, 或從檔案中讀取一個字元:  檔案内部指針自動移向下一位可讀寫的位置 

int fputc(char ch, FILE *fp); 

int fgetc( FILE *fp) 

把一行資料寫入檔案, 或讀取一行資料: 

char * fputs(char *str, FILE *fp) 

char * fgets(char *str, int n, FILE *fp) ; // 讀取N-1 個字元,第N個字元補'/0' 

把指定位元組數的若幹資料寫入檔案, 或讀出檔案. 

int fwrite(char * buf, unsigned size, unsigned n, FILE *fp); size 每個資料的位元組數,  n 個資料. 

int fread(char *buf, unsigned size, unsigned n, FILE *fp); 

把指定格式的資料寫入檔案, 或讀取指定格式的資料 

int fprintf(FILE *fp, char *format, e1,e2,......en); 

int fscanf(FILE *fp, char *format, e1,e2,......en); 

3) 檔案位置的确定與指針管理. 

檔案尾的測試:  int feof(FILE *fp); //目前已到達檔案尾傳回非0, 否則傳回0 

不同的計算機系統以不同的鍵盤組合鍵形成檔案的結束符. IBM PC及其相容機是<ctrl> + z 

把檔案内部指針重新定位到檔案的起始位置     int rewind(FILE *fp); 

把檔案内部指針定位到指定的位置:   int fseek(FILE *fp, long offset, int from);  

from 是定位的起始點. 

SEEK_SET    0    從檔案頭開始 

SEEK_CUR    1    從檔案内部指針目前位置開始 

SEEK_END    2   從檔案尾開始 

offset 是以From 為起始點的依稀位元組數,大于0表示向檔案尾方向, 0 不移動,  

檔案操作出錯測式   int ferror(FILE *fp);  

用于對由FP指向的檔案最近一次操作進行正确性測試. 出錯傳回非0,還沒傳回0 

4)  檔案的删除 

int remove(char * filename); 

  3.  一些以前我沒想到的知識點. 

char ch; 

ch = getchar ()  功能等價于 ch = fgetc(stdin)  功能等價于 scanf("%c",ch)   功能等價于 fscanf(stdin, "%c",ch) 

putchar(ch)  功能等價于 printf("%c",ch)   功能等價于 fputc(stdout)   功能等價于 fprintf(stdout, "%c", ch)