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()成功的開啟一個檔案時,該函式將返回一個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 getchar(void);
int fputc(int ch,FILE *stream);
int putchar(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"
#include <stdlib.h>
int main() {
FILE *fp;
char ch;
if((fp=fopen("myfile.txt","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()等價於fputc(),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個字元,讀到由指標string指向的字元陣列中去,例如: fgets(buffer,9,fp); 將把fp指向的檔案中的8個字元讀到buffer記憶體區,buffer可以是定義的字元陣列,也可以是動態分配的記憶體區。 注意,fgets()函式讀到’/n’就停止,而不管是否達到數目要求。同時在讀取字串的最後加上’/0’。 fgets()函式執行完以後,返回一個指向該串的指標。如果讀到檔案尾或出錯,則均返回一個空指標NULL,所以長用feof()函式來測定是否到了檔案尾或者是ferror()函式來測試是否出錯,例如下面的程式用fgets()函式讀test.txt檔案中的第一行並顯示出來:
#include "stdio.h"
int 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()是從檔案輸入。 下面程式是向檔案test.dat裡輸入一些字元
#include <stdio.h>
#include <stdlib.h>
int main() {
char *s="That's good news";
int i=617;
FILE *fp;
fp=fopen("test.dat", "w"); /*建立一個文字檔案只寫*/
fputs("Your score of TOEFL is",fp); /*向所建檔案寫入一串字元*/
fputc(':', fp); /*向所建檔案寫冒號:*/
fprintf(fp, "%d/n", i); /*向所建檔案寫一整型數*/
fprintf(fp, "%s", s); /*向所建檔案寫一字串*/
fclose(fp);
}
用DOS的TYPE命令顯示TEST.DAT的內容如下所示: 螢幕顯示 Your score of TOEFL is: 617 That’s good news 下面的程式是把上面的檔案test.dat裡的內容在螢幕上顯示出來:
#include <stdio.h>
int main() {
char s[24], m[20];
int i;
FILE *fp;
fp=fopen("test.dat", "r"); /*開啟文字檔案只讀*/
fgets(s, 24, fp); /*從檔案中讀取23個字元*/
printf("%s", s);
fscanf(fp, "%d", &i); /*讀取整型數*/
printf("%d", i);
putchar(fgetc(fp)); /*讀取一個字元同時輸出*/
fgets(m, 17, fp); /*讀取16個字元*/
puts(m); /*輸出所讀字串*/
fclose(fp);
}
執行後螢幕顯示: Your score of TOEFL is: 617 That’s good news
相關文章
- C語言(檔案操作)C語言
- c語言檔案操作相關C語言
- C語言關於檔案操作的命令C語言
- C語言(檔案加解密)C語言解密
- C語言-檔案讀寫C語言
- 用c語言處理檔案C語言
- C語言 檔案IO的使用C語言
- c語言多檔案編譯C語言編譯
- c語言拷貝檔案程式C語言
- C語言實現檔案加密C語言加密
- C語言 - 標頭檔案包含C語言
- C語言之標準檔案操作C語言
- C語言/C++讀取檔案資訊C語言C++
- C語言位操作C語言
- C語言檔案與目錄(五)檔案鎖C語言
- C語言判斷檔案存在和建立檔案C語言
- Dart 語言標準流與檔案操作Dart
- Golang語言檔案操作快速入門篇Golang
- 獲得檔案的大小(c語言)C語言
- C語言檔案與目錄(一)C語言
- C語言檔案與目錄(二)C語言
- C語言檔案與目錄(三)C語言
- C語言檔案輸入和輸出操作的學習心得(一)C語言
- C語言-指標操作C語言指標
- C語言標頭檔案#include的作用C語言
- C檔案操作
- 【C語言】linux下多檔案編譯C語言Linux編譯
- C語言基礎及指標⑧檔案IOC語言指標
- C語言unlink()函式:刪除檔案C語言函式
- C語言標頭檔案的使用(轉載)C語言
- C語言關於標頭檔案的使用C語言
- C檔案與檔案的操作
- c#檔案操作C#
- C# 檔案操作C#
- C語言lstat()函式:由檔案描述詞取得檔案狀態C語言函式
- C語言fstat()函式:由檔案描述詞取得檔案狀態C語言函式
- C語言實現出入棧操作C語言
- C語言標頭檔案到底是什麼?C語言