C語言檔案操作之 檔案的讀寫

2021-09-30 16:11:25 字數 4156 閱讀 2156

c語言檔案操作之----檔案的讀寫

當檔案按指定的工作方式開啟以後,就可以執行對檔案的讀和寫。下面按檔案的性質分類進行操作。針對文字檔案和二進位制檔案的不同性質,對文字檔案來說,可按字元讀寫或按字串讀寫;對二進位制檔案來說,可進行成塊的讀寫或格式化的讀寫。

1. 讀寫字元

c提供fgetc和fputc函式對文字檔案進行字元的讀寫,其函式的原型存於stdio.h標頭檔案中,格式為:

顯示**列印1 int fgetc(file *stream)

fgetc( )函式從輸入流的當前位置返回乙個字元,並將檔案指標指示器移到下乙個字元處,如果已到檔案尾,函式返回eof,此時表示本次操作結束,若讀寫檔案完成,則應關閉檔案。

顯示**列印1 int fputc(int ch,file *stream)

fputc()函式完成將字元c h的值寫入所指定的流檔案的當前位置處,並將檔案指標後移一位。fputc()函式的返回值是所寫入字元的值,出錯時返回eof。

[例8-2] 將存放於磁碟的指定文字檔案按讀寫字元方式逐個地從檔案讀出,然後再將其顯示到螢幕上。採用帶引數的main( ),指定的磁碟檔名由命令列方式通過鍵盤給定。

顯示**列印01 #i nclude

main(argc,ar**) 

int argc; 

char *ar**; 

char ch; 

file *fp; 

int i; 

if((fp=fopen(ar**[1],"r"))==null) /* 開啟乙個由ar**[1]所指的檔案*/

printf("not open"); 

exit(0); 

while ((ch=fgetc(fp))!=eof) /* 從檔案讀一字元,顯示到螢幕*/

putchar(ch); 

fclose(fp); 

程式是一帶引數的main( )函式,要求以命令列方式執行,其引數argc是用於記錄輸入引數的個數, ar**是指標陣列,用於存放輸入引數的字串,串的個數由argc描述。假設我們指定讀取的檔名為l8-2.c,並且列表檔案內容就是源程式。經過編 譯和連線生成可執行的檔案l8-2.exe。執行程式l8-2.exe,輸入的命令列方式為:

c:\tc>l8-2 l8-2.c

上述程式以命令列方式執行,其輸入引數字串有兩個,即ar**[0]="c:\tc>l8-2"、ar**[1]=" l8-2.c ",argc = 2。故開啟的檔案是l8-2.c 。程式中對fgetc( )函式的返回值不斷進行測試,若讀到檔案尾部或讀檔案出錯,都將返回c的整型常量eof,其值為非零有效整數。程式的執行輸出為源程式本身:

c:\tc>l8-2 l8-2.c

顯示**列印

#i nclude

main( argc,ar**) 

int argc; 

char *ar**; 

char ch; 

file *fp; 

int i; 

if((fp=fopen(ar**[1],"r"))==null) /* 開啟乙個由ar**[1] 所指的檔案*/

printf("not open"); 

exit(0); 

while ((ch=fgetc(fp))!=eof) /* 從檔案讀一字元,顯示到螢幕*/

putchar(ch); 

fclose(fp); 

[例8-3] 從鍵盤輸入字元,存到磁碟檔案test.txt中:

#i nclude

顯示**列印

main( ) 

file fp; / *定義檔案變數指標* / 

char ch; 

if((fp=fopen("test.txt","w"))==null)  /*以只寫方式開啟檔案*/

printf("cannot open file!\n"); 

exit(0); 

while ((ch=fgetchar())!='\n') /*只要輸入字元非回車符* / 

fputc(ch,fp) /*寫入檔案乙個字元*/

fclose(fp); 

程式通過從鍵盤輸入一以回車結束的字串,寫入指定的流檔案test.txt,檔案以文字只寫方式開啟,所以流檔案具有可讀性,能支援各種字元處理工具訪問。簡單地說,我們可以通過dos提供的type命令來列表顯示檔案內容。

執行程式:

i love china!

在dos作業系統環境下,利用type 命令顯示test.txt檔案如下:

c:\tc> type test.txt

i love china!

2. 讀寫字串

c提供讀寫字串的函式原型在stdio.h標頭檔案中,其函式形式為:

顯示**列印1 char *fgets(char *str,int num,file *stream)

fgets() 函式從流檔案stream中讀取至多num-1個字元,並把它們放入str指向的字元陣列中。讀取字元直到遇見回車符或e o f(檔案結束符)為止,或讀入了所限定的字元數。

顯示**列印1 int fputs(char *str,file *stream)

fputs( )函式將str指向的字串寫入流檔案。操作成功時,函式返回0值,失敗返回非零值。

顯示**列印01 #i nclude

#i nclude

main( ) 

file *fp; 

char str[1]; 

if ((fp=fopen("test.txt","w"))==null) /*開啟只寫的文字檔案*/

printf("cannot open file!"); 

exit(0); 

while((strlen(gets(str)))!=0) 

student; /*說明結構體變數*/

if((fp=fopen("test1.txt","w"))==null) 

student; 

if((fp1=fopen("test.txt","wb"))==null) 

{ /*以二進位制只寫方式開啟檔案* / 

printf("cannot open file"); 

exit(0); 

printf("input data:\n"); 

for( i=0;i<2;i++)  

scanf("%s %s %f %f",student.name,student.num,&student.score[0],&student.score[1]); /* 輸入一記錄*/

fwrite(&student,sizeof(student),1,fp1); /* 成塊寫入檔案*/

fclose(fp1); 

if((fp1=fopen("test.txt","rb"))==null) 

{ /*重新以二進位制只寫開啟檔案*/

printf("cannot open file"); 

exit(0); 

printf("output from file:\n"); 

for (i=0;i<2;i++) 

fread(&student,sizeof(student),1,fp1); /* 從檔案成塊讀*/

printf("%s %s %7.2f %7.2f\n",student.name,student.num,student.score[0],student.score[1]); /* 顯示到螢幕*/

fclose(fp1); 

執行程式:

input data:

xiaowan j001 87.5 98.4

xiaoli j002 99.5 89.6

output from file:

xiaowan j001 87.50 98.40

xiaoli j002 99.50 89.60

通常,對於輸入資料的格式較為複雜的話,我們可採取將各種格式的資料當做字串輸入,然後將字串轉換為所需的格式。c提供函式:

顯示**列印

int atoi(char *ptr) 

float atof(char *ptr) 

long int atol(char *ptr)

它們分別將字串轉換為整型、實型和長整型。使用時請將其包含的標頭檔案math.h或stdlib.h寫在程式的前面。

c 之檔案操作(讀 寫檔案)

程式執行時產生的資料都屬於臨時資料,程式一旦執行結束就會被釋放,通過檔案可將資料持久化。c 中對檔案操作需要標頭檔案 文字型別分為兩種 操作檔案的三大類 1 ofstream 讀操作 2 ifstream 讀操作 3 fstream 讀寫操作寫檔案步驟 1 包含標頭檔案 include2 建立流物件...

c語言檔案讀寫操作

檔案讀取操作 file fp char fname d printf s n fname fp fopen fname,r fscanf fp,d buf printf d buf 0 fclose fp fread,與fwrite是binary stream input output二進位製流的輸...

C語言檔案讀寫操作

標頭檔案 include include include include 用於生成隨機數 建立檔案指標 file fp 檢測檔案是否開啟成功 if fp fopen f52.txt w null 如果檔案不存在,則會新建。w 即設定操作為 write 寫操作 隨機的產生,設定時間種子 srand t...