av手机免费在线观看,国产女人在线视频,国产xxxx免费,捆绑调教一二三区,97影院最新理论片,色之久久综合,国产精品日韩欧美一区二区三区

C語言

C語言文件操作教程

時間:2025-05-11 23:25:59 C語言 我要投稿
  • 相關(guān)推薦

C語言文件操作教程

  引導語;C語言的應用范圍廣泛,具備很強的數(shù)據(jù)處理能力,以下是百分網(wǎng)小編分享給大家的C語言文件操作教程,歡迎閱讀,更多精彩請持續(xù)關(guān)注我們應屆畢業(yè)生考試網(wǎng)!

  一、標準文件的讀寫

  1.文件的打開fopen()

  文件的打開操作表示將給用戶指定的文件在內(nèi)存分配一個FILE結(jié)構(gòu)區(qū),并將該結(jié)構(gòu)的指針返回給用戶程序,以后用戶程序就可用此FILE指針來實現(xiàn)對指定文件的存取操作了。當使用打開函數(shù)時,必須給出文件名、文件操作方式(讀、寫或讀寫),如果該文件名不存在,就意味著建立(只對寫文件而言,對讀文件則出錯),并將文件指針指向文件開頭。若已有一個同名文件存在,則刪除該文件,若無同名文件,則建立該文件,并將文件指針指向文件開頭。

  fopen(char *filename,char *type);

  其中*filename是要打開文件的文件名指針,一般用雙引號括起來的文件名表示,也可使用雙反斜杠隔開的路徑名。而*type參數(shù)表示了對打開文件的操作方式。其可采用的操作方式如下:

  方式 含義

  r 打開,只讀

  w 打開,文件指針指到頭,只寫

  a 打開,指向文件尾,在已存在文件中追加

  rb 打開一個二進制文件,只讀

  wb 打開一個二進制文件,只寫

  ab 打開一個二進制文件,進行追加

  r+ 以讀/寫方式打開一個已存在的文件

  w+ 以讀/寫方式建立一個新的文本文件

  a+ 以讀/寫方式打開一個文件文件進行追加

  rb+ 以讀/寫方式打開一個二進制文件

  wb+ 以讀/寫方式建立一個新的二進制文件

  ab+ 以讀/寫方式打開一個二進制文件進行追加

  當用fopen(0成功的打開一個文件時,該函數(shù)將返回一個FILE指針,如果文件打開失敗,將返回一個NULL指針。如想打開test文件,進行寫:

  FILE *fp;

  if((fp=fopen(test,w))==NULL)

  {

  printf(File cannot be opened\n);

  exit();

  }

  else

  printf(File opened for writing\n);

  ……

  fclose(fp);

  DOS操作系統(tǒng)對同時打開的文件數(shù)目是有限制的,缺省值為5,可以通過修改CONFIG.SYS文件改變這個設(shè)置。

  2.關(guān)閉文件函數(shù)fclose()

  文件操作完成后,必須要用fclose()函數(shù)進行關(guān)閉,這是因為對打開的文件進行寫入時,若文件緩沖區(qū)的空間未被寫入的內(nèi)容填滿,這些內(nèi)容不會寫到打開的文件中去而丟失。只有對打開的文件進行關(guān)閉操作時,停留在文件緩沖區(qū)的內(nèi)容才能寫到該文件中去,從而使文件完整。再者一旦關(guān)閉了文件,該文件對應的FILE結(jié)構(gòu)將被釋放,從而使關(guān)閉的文件得到保護,因為這時對該文件的存取操作將不會進行。文件的關(guān)閉也意味著釋放了該文件的緩沖區(qū)。

  int fclose(FILE *stream);

  它表示該函數(shù)將關(guān)閉FILE指針對應的文件,并返回一個整數(shù)值。若成功地關(guān)閉了文件,則返回一個0值,否則返回一個非0值。常用以下方法進行測試:

  if(fclose(fp)!=0)

  {

  printf(File cannot be closed\n);

  exit(1);

  }

  else

  printf(File is now closed\n);

  當打開多個文件進行操作,而又要同時關(guān)閉時,可采用fcloseall()函數(shù),它將關(guān)閉所有在程序中打開的文件。

  int fcloseall();

  該函數(shù)將關(guān)閉所有已打開的文件,將各文件緩沖區(qū)未裝滿的內(nèi)容寫到相應的文件中去,接著釋放這些緩沖區(qū),并返回關(guān)閉文件的數(shù)目。如關(guān)閉了4個文件,則當執(zhí)行:

  n=fcloseall();

  時,n應為4。

  3.文件的讀寫

  (1).讀寫文件中字符的函數(shù)(一次只讀寫文件中的一個字符):

  int fgetc(FILE *stream);

  int fgetchar(void);

  int fputc(int ch,FILE *stream);

  int fputchar(int ch);

  int getc(FILE *stream);

  int putc(int ch,FILE *stream);

  其中fgetc()函數(shù)將把由流指針指向的文件中的一個字符讀出,例如:

  ch=fgetc(fp);

  將把流指針fp指向的文件中的一個字符讀出,并賦給ch,當執(zhí)行fgetc()函數(shù)時,若當時文件指針指到文件尾,即遇到文件結(jié)束標志EOF(其對應值為-1),該函數(shù)返回一個-1給ch,在程序中常用檢查該函數(shù)返回值是否為-1來判斷是否已讀到文件尾,從而決定是否繼續(xù)。

  #include stdio.h

  main()

  {

  FILE *fp;

  ch ch;

  if((fp=fopen(myfile.tex,r))==NULL)

  {

  printf(file cannot be opened\n);

  exit(1);

  }

  while((ch=fgetc(fp))!=EOF) fputc(ch,stdout);

  fclose(fp);

  }

  該程序以只讀方式打開myfile.txt文件,在執(zhí)行while循環(huán)時,文件指針每循環(huán)一次后移一個字符位置。用fgetc()函數(shù)將文件指針指定的字符讀到ch變量中,然后用fputc()函數(shù)在屏幕上顯示,當讀到文件結(jié)束標志EOF時,變關(guān)閉該文件。

  上面的程序用到了fputc()函數(shù),該函數(shù)將字符變量ch的值寫到流指針指定的文件中去,由于流指針用的是標準輸出(顯示器)的FILE指針stdout,故讀出的字符將在顯示器上顯示。又比如:

  fputc(ch,fp);

  該函數(shù)執(zhí)行結(jié)構(gòu),將把ch表示的字符送到流指針fp指向的文件中去。

  在TC中,putc()等價于fput(),getc()等價于fgetc()。

  putchar(c)相當于fputc(c,stdout);getchar()相當于fgetc(stdin)。

  注意,這里使用char ch,其實是不科學的,因為最后判斷結(jié)束標志時,是看ch!=EOF,而EOF的值為-1,這顯然和char是不能比較的。所以,某些使用,我們都定義成int ch。

  (2).讀寫文件中字符串的函數(shù)

  char *fgets(char *string,int n,FILE *stream);

  char *gets(char *s);

  int fprintf(FILE *stream,char *format,variable-list);

  int fputs(char *string,FILE *stream);

  int fscanf(FILE *stream,char *format,variable-list);

  其中fgets()函數(shù)將把由流指針指定的文件中n-1個字符,讀到由指針stream指向的字符數(shù)組中去,例如:

  fgets(buffer,9,fp);

  將把fp指向的文件中的8個字符讀到buffer內(nèi)存區(qū),buffer可以是定義的字符數(shù)組,也可以是動態(tài)分配的內(nèi)存區(qū)。

  注意,fgets()函數(shù)讀到'\n'就停止,而不管是否達到數(shù)目要求。同時在讀取字符串的最后加上'\0'。

  fgets()函數(shù)執(zhí)行完以后,返回一個指向該串的指針。如果讀到文件尾或出錯,則均返回一個空指針NULL,所以長用feof()函數(shù)來測定是否到了文件尾或者是ferror()函數(shù)來測試是否出錯,例如下面的程序用fgets()函數(shù)讀test.txt文件中的第一行并顯示出來:

  #include stdio.h

  main()

  {

  FILE *fp;

  char str[128];

  if((fp=fopen(test.txt,r))==NULL)

  {

  printf(cannot open file\n);

  exit(1);

  }

  while(!feof(fp))

  {

  if(fgets(str,128,fp)!=NULL) printf(%s,str);

  }

  fclose(fp);

  }

  gets()函數(shù)執(zhí)行時,只要未遇到換行符或文件結(jié)束標志,將一直讀下去。因此讀到什么時候為止,需要用戶進行控制,否則可能造成存儲區(qū)的溢出。

  fputs()函數(shù)想指定文件寫入一個由string指向的字符串,'\0'不寫入文件。

  fprintf()和fscanf()同printf()和scanf()函數(shù)類似,不同之處就是printf()函數(shù)是想顯示器輸出,fprintf()則是向流指針指向的文件輸出;fscanf()是從文件輸入。

  下面程序是向文件test.dat里輸入一些字符:

  #include

  main()

  {

  char *s=That's good news;

  int i=617;

  FILE *fp;

  fp=fopne(test.dat, w); /*建立一個文字文件只寫*/

  fputs(Your score of TOEFLis,fp); /*向所建文件寫入一串字符*/

  fputc(':', fp); /*向所建文件寫冒號:*/

  fprintf(fp, %d\n, i); /*向所建文件寫一整型數(shù)*/

  fprintf(fp, %s, s); /*向所建文件寫一字符串*/

  fclose(fp);

  }

  用DOS的TYPE命令顯示TEST.DAT的內(nèi)容如下所示:

  屏幕顯示

  Your score of TOEFL is: 617

  That's good news

  下面的程序是把上面的文件test.dat里的內(nèi)容在屏幕上顯示出來:

  #include

  main()

  {

  char *s, m[20];

  int i;

  FILE *fp;

  fp=fopen(test.dat, r); /*打開文字文件只讀*/

  fgets(s, 24, fp); /*從文件中讀取23個字符*/

  printf(%s, s);

  fscanf(fp, %d, &i); /*讀取整型數(shù)*/

  printf(%d, i);

  putchar(fgetc(fp)); /*讀取一個字符同時輸出*/

  fgets(m, 17, fp); /*讀取16個字符*/

  puts(m); /*輸出所讀字符串*/

  fclose(fp);

  getch();

  }

  運行后屏幕顯示:

  Your score of TOEFL is: 617

  That's good news

  4.清除和設(shè)置文件緩沖區(qū)

  (1).清除文件緩沖區(qū)函數(shù):

  int fflush(FILE *stream);

  int flushall();

  fflush()函數(shù)將清除由stream指向的文件緩沖區(qū)里的內(nèi)容,常用于寫完一些數(shù)據(jù)后,立即用該函數(shù)清除緩沖區(qū),以免誤操作時,破壞原來的數(shù)據(jù)。

  flushall()將清除所有打開文件所對應的文件緩沖區(qū)。

  (2).設(shè)置文件緩沖區(qū)函數(shù)

  void setbuf(FILE *stream,char *buf);

  void setvbuf(FILE *stream,char *buf,int type,unsigned size);

  這兩個函數(shù)將使得打開文件后,用戶可建立自己的文件緩沖區(qū),而不使用fopen()函數(shù)打開文件設(shè)定的默認緩沖區(qū)。

  對于setbuf()函數(shù),buf指出的緩沖區(qū)長度由頭文件stdio.h中定義的宏BUFSIZE的值決定,缺省值為512字節(jié)。當選定buf為空時,setbuf函數(shù)將使的文件I/O不帶緩沖。而對setvbuf函數(shù),則由malloc函數(shù)來分配緩沖區(qū)。參數(shù)size指明了緩沖區(qū)的長度(必須大于0),而參數(shù)type則表示了緩沖的類型,其值可以取如下值:

  type 值 含義

  _IOFBF 文件全部緩沖,即緩沖區(qū)裝滿后,才能對文件讀寫

  _IOLBF 文件行緩沖,即緩沖區(qū)接收到一個換行符時,才能對文件讀寫

  _IONBF 文件不緩沖,此時忽略buf,size的值,直接讀寫文件,不再經(jīng)過文件緩沖區(qū)緩沖

  5.文件的隨機讀寫函數(shù)

  前面介紹的文件的字符/字符串讀寫,均是進行文件的順序讀寫,即總是從文件的開頭開始進行讀寫。這顯然不能滿足我們的要求,C語言提供了移動文件指針和隨機讀寫的函數(shù),它們是:

  (1).移動文件指針函數(shù):

  long ftell(FILE *stream);

  int rewind(FILE *stream);

  fseek(FILE *stream,long offset,int origin);

  函數(shù)ftell()用來得到文件指針離文件開頭的偏移量。當返回值是-1時表示出錯。

  rewind()函數(shù)用于文件指針移到文件的開頭,當移動成功時,返回0,否則返回一個非0值。

  fseek()函數(shù)用于把文件指針以origin為起點移動offset個字節(jié),其中origin指出的位置可有以下幾種:

  origin 數(shù)值 代表的具體位置

  SEEK_SET 0 文件開頭

  SEEK_CUR 1 文件指針當前位置

  SEEK_END 2 文件尾

  例如:

  fseek(fp,10L,0);

  把文件指針從文件開頭移到第10字節(jié)處,由于offset參數(shù)要求是長整型數(shù),故其數(shù)后帶L。

  fseek(fp,-15L,2);

  把文件指針從文件尾向前移動15字節(jié)。

  (2).文件隨機讀寫函數(shù)

  int fread(void *ptr,int size,int nitems,FILE *stream);

  int fwrite(void *ptr,int size,int nitems,FILE *stream);

  fread()函數(shù)從流指針指定的文件中讀取nitems個數(shù)據(jù)項,每個數(shù)據(jù)項的長度為size個字節(jié),讀取的nitems數(shù)據(jù)項存入由ptr指針指向的內(nèi)存緩沖區(qū)中,在執(zhí)行fread()函數(shù)時,文件指針隨著讀取的字節(jié)數(shù)而向后移動,最后移動結(jié)束的位置等于實際讀出的字節(jié)數(shù)。該函數(shù)執(zhí)行結(jié)束后,將返回實際讀出的數(shù)據(jù)項數(shù),這個數(shù)據(jù)項數(shù)不一定等于設(shè)置的nitems,因為若文件中沒有足夠的數(shù)據(jù)項,或讀中間出錯,都會導致返回的數(shù)據(jù)項數(shù)少于設(shè)置的nitems。當返回數(shù)不等于nitems時,可以用feof()或ferror()函數(shù)進行檢查。

  fwrite()函數(shù)從ptr指向的緩沖區(qū)中取出長度為size字節(jié)的nitems個數(shù)據(jù)項,寫入到流指針stream指向的文件中,執(zhí)行該操作后,文件指針將向后移動,移動的字節(jié)數(shù)等于寫入文件的字節(jié)數(shù)目。該函數(shù)操作完成后,也將返回寫入的數(shù)據(jù)項數(shù)。

  二、非標準文件的讀寫

  這類函數(shù)最早用于UNIX操作系統(tǒng),ANSI標準未定義,但有時也經(jīng)常用到,DOS 3.0以上版本支持這些函數(shù)。它們的頭文件為io.h。

  由于我們不常用這些函數(shù),所以在這里就簡單說一下。

  1.文件的打開和關(guān)閉

  open()函數(shù)的作用是打開文件,其調(diào)用格式為:

  int open(char *filename, int access);

  該函數(shù)表示按access的要求打開名為filename的文件,返回值為文件描述字,其中access有兩部分內(nèi)容:

  基本模式和修飾符, 兩者用 (或)方式連接。修飾符可以有多個, 但基本模式只能有一個。

  access的規(guī)定

  --------------------------------------------------------

  基本模式 含義 修飾符 含 義

  --------------------------------------------------------

  O_RDONLY 只讀 O_APPEND 文件指針指向末尾

  O_WRONLY 只寫 O_CREAT 文件不存在時創(chuàng)建文件, 屬性按基本模式屬性

  O_RDWR 讀寫 O_TRUNC 若文件存在, 將其長度縮為0, 屬性不變

  O_BINARY 打開一個二進制文件

  O_TEXT 打開一個文字文件

  ---------------------------------------------------------

  open()函數(shù)打開成功, 返回值就是文件描述字的值(非負值), 否則返回-1。

  close()函數(shù)的作用是關(guān)閉由open()函數(shù)打開的文件, 其調(diào)用格式為:

  int close(int handle);

  該函數(shù)關(guān)閉文件描述字handle相連的文件。

  2.讀寫函數(shù)

  int read(int handle, void *buf, int count);

  read()函數(shù)從handle(文件描述字)相連的文件中, 讀取count個字節(jié)放到buf所指的緩沖區(qū)中,

  返回值為實際所讀字節(jié)數(shù), 返回-1表示出錯。返回0 表示文件結(jié)束。

  write()函數(shù)的調(diào)用格式為:

  int write(int handle, void *buf, int count);

  write()函數(shù)把count個字節(jié)從buf指向的緩沖區(qū)寫入與handle相連的文件中, 返回值為實際寫入的字節(jié)數(shù)。

  3.隨機定位函數(shù)

  lseek()函數(shù)的調(diào)用格式為:

  int lseek(int handle, long offset, int fromwhere);

  該函數(shù)對與handle相連的文件位置指針進行定位,功能和用法與fseek()函數(shù)相同。

  tell()函數(shù)的調(diào)用格式為:

  long tell(int handle);

  該函數(shù)返回與handle相連的文件現(xiàn)生位置指針, 功能和用法與ftell()相同。

【C語言文件操作教程】相關(guān)文章:

C語言文件操作的方法09-17

C語言文件操作函數(shù)10-18

C語言位操作教程08-07

C語言文件操作函數(shù)freopen詳解07-13

C語言文件操作解析詳解及實例代碼10-02

C語言超詳細文件操作函數(shù)大全09-29

C語言最實用的文件操作函數(shù)大全09-22

C語言文件08-28

詳解C語言文件操作中fgets與fputs函數(shù)10-08