C文件讀寫函數介紹

C文件讀寫函數介紹(轉)
2010-01-28 10:35

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) 






發佈了70 篇原創文章 · 獲贊 22 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章