程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言 文件操作 基礎教程

C語言 文件操作 基礎教程

編輯:關於C語言
 

一、標准文件的讀寫
1.文件的打開fopen()
文件的打開操作表示將給用戶指定的文件在內存分配一個FILE結構區,並將該結構的指針返回給用戶程序,以後用戶程序就可用此FILE指針來實現對指定文件的存取操作了。當使用打開函數時,必須給出文件名、文件操作方式(讀、寫或讀寫),如果該文件名不存在,就意味著建立(只對寫文件而言,對讀文件則出錯),並將文件指針指向文件開頭。若已有一個同名文件存在,則刪除該文件,若無同名文件,則建立該文件,並將文件指針指向文件開頭。
fopen(char *filename,char *type);
其中*filename是要打開文件的文件名指針,一般用雙引號括起來的文件名表示,也可使用雙反斜槓隔開的路徑名。而*type參數表示了對打開文件的操作方式。其可采用的操作方式如下:

方式 含義
r 打開,只讀
w 打開,文件指針指到頭,只寫
a 打開,指向文件尾,在已存在文件中追加
rb 打開一個二進制文件,只讀
wb 打開一個二進制文件,只寫
ab 打開一個二進制文件,進行追加
r+ 以讀/寫方式打開一個已存在的文件
w+ 以讀/寫方式建立一個新的文本文件
a+ 以讀/寫方式打開一個文件文件進行追加
rb+ 以讀/寫方式打開一個二進制文件
wb+ 以讀/寫方式建立一個新的二進制文件
ab+ 以讀/寫方式打開一個二進制文件進行追加

當用fopen(0成功的打開一個文件時,該函數將返回一個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操作系統對同時打開的文件數目是有限制的,缺省值為5,可以通過修改CONFIG.SYS文件改變這個設置。

2.關閉文件函數fclose()
文件操作完成後,必須要用fclose()函數進行關閉,這是因為對打開的文件進行寫入時,若文件緩沖區的空間未被寫入的內容填滿,這些內容不會寫到打開的文件中去而丟失。只有對打開的文件進行關閉操作時,停留在文件緩沖區的內容才能寫到該文件中去,從而使文件完整。再者一旦關閉了文件,該文件對應的FILE結構將被釋放,從而使關閉的文件得到保護,因為這時對該文件的存取操作將不會進行。文件的關閉也意味著釋放了該文件的緩沖區。
int fclose(FILE *stream);
它表示該函數將關閉FILE指針對應的文件,並返回一個整數值。若成功地關閉了文件,則返回一個0值,否則返回一個非0值。常用以下方法進行測試:

if(fclose(fp)!=0)
{
printf(File cannot be closed\n);
exit(1);
}
else
printf(File is now closed\n);

當打開多個文件進行操作,而又要同時關閉時,可采用fcloseall()函數,它將關閉所有在程序中打開的文件。
int fcloseall();
該函數將關閉所有已打開的文件,將各文件緩沖區未裝滿的內容寫到相應的文件中去,接著釋放這些緩沖區,並返回關閉文件的數目。如關閉了4個文件,則當執行:
n=fcloseall();
時,n應為4。
3.文件的讀寫
(1).讀寫文件中字符的函數(一次只讀寫文件中的一個字符):

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()函數將把由流指針指向的文件中的一個字符讀出,例如:
ch=fgetc(fp);
將把流指針fp指向的文件中的一個字符讀出,並賦給ch,當執行fgetc()函數時,若當時文件指針指到文件尾,即遇到文件結束標志EOF(其對應值為-1),該函數返回一個-1給ch,在程序中常用檢查該函數返回值是否為-1來判斷是否已讀到文件尾,從而決定是否繼續。

#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文件,在執行while循環時,文件指針每循環一次後移一個字符位置。用fgetc()函數將文件指針指定的字符讀到ch變量中,然後用fputc()函數在屏幕上顯示,當讀到文件結束標志EOF時,變關閉該文件。
上面的程序用到了fputc()函數,該函數將字符變量ch的值寫到流指針指定的文件中去,由於流指針用的是標准輸出(顯示器)的FILE指針stdout,故讀出的字符將在顯示器上顯示。又比如:
fputc(ch,fp);
該函數執行結構,將把ch表示的字符送到流指針fp指向的文件中去。
在TC中,putc()等價於fput(),getc()等價於fgetc()。
putchar(c)相當於fputc(c,stdout);getchar()相當於fgetc(stdin)。
注意,這裡使用char ch,其實是不科學的,因為最後判斷結束標志時,是看ch!=EOF,而EOF的值為-1,這顯然和char是不能比較的。所以,某些使用,我們都定義成int ch。
(2).讀寫文件中字符串的函數

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()函數將把由流指針指定的文件中n-1個字符,讀到由指針stream指向的字符數組中去,例如:
fgets(buffer,9,fp);
將把fp指向的文件中的8個字符讀到buffer內存區,buffer可以是定義的字符數組,也可以是動態分配的內存區。
注意,fgets()函數讀到'\n'就停止,而不管是否達到數目要求。同時在讀取字符串的最後加上'\0'。
fgets()函數執行完以後,返回一個指向該串的指針。如果讀到文件尾或出錯,則均返回一個空指針NULL,所以長用feof()函數來測定是否到了文件尾或者是ferror()函數來測試是否出錯,例如下面的程序用fgets()函數讀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()函數執行時,只要未遇到換行符或文件結束標志,將一直讀下去。因此讀到什麼時候為止,需要用戶進行控制,否則可能造成存儲區的溢出。
fputs()函數想指定文件寫入一個由string指向的字符串,'\0'不寫入文件。
fprintf()和fscanf()同printf()和scanf()函數類似,不同之處就是printf()函數是想顯示器輸出,fprintf()則是向流指針指向的文件輸出;fscanf()是從文件輸入。  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved