C語言(檔案操作)

鋸齒流沙發表於2018-01-08

檔案

指儲存在外存介質(如磁碟、光碟、U盤等)上的資料集合。每一個檔案有唯一的檔名,作業系統按名字存取檔案。

檔名:通常由路徑、主檔名、副檔名三部分組成 例如:F : \C_2011\labs\lab_15.doc

檔案分類

可以從不同的角度對檔案進行分類

1、根據檔案的內容,可分為程式檔案和資料檔案。而程式檔案又可分為原始檔、目標檔案和可執行檔案;

2、根據檔案的組織形式,可分為順序存取檔案和隨機存取檔案

3、根據檔案的儲存形式,可分為文字檔案(即ASCII碼)和二進位制

4、從使用者的角度看,檔案還可分為普通檔案和裝置檔案

文字檔案:每一個位元組儲存1個字元,因而便於對字元進行逐個處理。但一般佔用儲存空間較多,而且要花費轉換時間(二進位制與ASCII碼之間的轉換)

二進位制檔案:把記憶體中的資料,原樣輸出到磁碟檔案中。可以節省儲存空間和轉換時間,但一個位元組並不對應1個字元,不能直接輸出字元形式。

讀檔案與寫檔案

讀檔案:是指將磁碟檔案中的資料傳送到計算機記憶體的操作,又稱輸入,例如,將磁碟檔案調入記憶體進行編輯

寫檔案:是指從計算機記憶體向磁碟檔案中傳送資料的操作,又稱輸出,例如,將編輯好的檔案儲存到磁碟中

C語言將檔案看作是由一個一個的字元(ASCII碼檔案)或位元組(二進位制檔案)組成的,因此稱為流式檔案。

C語言中的資料檔案是由一連串的字元(或位元組)組成,而不考慮行的界限,兩行資料間不會自動加分隔符,對檔案的存取是以字元(位元組)為單位的。輸入輸出資料流的開始和結束僅受程式控制而不受物理符號(如回車換行符)控制。

ANSI C的緩衝檔案系統

緩衝檔案系統:是指系統自動地在記憶體區為每個正在使用的檔案開闢一個緩衝區。

從記憶體向磁碟輸出資料時,必須首先輸出到緩衝區中。待緩衝區裝滿後,再一起輸出到磁碟檔案中。

從磁碟檔案向記憶體讀入資料時,則正好相反:首先將一批資料讀入到緩衝區中,再從緩衝區中將資料逐個送到程式資料區。

圖.png

檔案型別指標

在緩衝檔案系統中,每個被使用的檔案都在記憶體中開闢一個相應的檔案資訊區,用來存放檔案的有關資訊(如檔案的名字、檔案狀態及檔案當前位置等)。 這些資訊是儲存在一個結構體變數中的。該結構體型別是由系統宣告的,取名為FILE。宣告FILE結構體型別的資訊包含在標頭檔案“stdio.h”中。

說明:

不必熟悉FILE的成員;

通常設定一個指向FILE型別變數的指標變數,然後通過它來操作相關檔案。

指標變數說明: FILE *fp fp是一個指標變數,它指向某個檔案的結構體變數,從而通過該結構體變數中的檔案資訊能夠訪問該檔案。

用法: 檔案開啟時,系統自動建立檔案結構體,並把指向它的指標返回來,程式通過這個指標獲得檔案資訊,訪問檔案。 檔案關閉後,它的檔案結構體被釋放。

圖.png

檔案的開啟與關閉

(1)檔案的開啟與關閉的含義 對檔案進行操作之前,必須先開啟該檔案;使用結束後,應立即關閉,以免資料丟失。

所謂“開啟”:是指為檔案建立相應的資訊區(用來存放有關檔案的資訊)和檔案緩衝區(用來暫時存放輸入輸出的資料)。

在編寫程式時,在開啟檔案的同時,一般都指定一個指標變數指向該檔案,也就是建立起指標變數與檔案之間的聯絡,這樣就可以通過該指標變數對檔案進行讀寫。

所謂“關閉”:是指撤銷檔案資訊區和檔案緩衝區。

C語言規定了標準輸入輸出函式庫,用fopen()函式開啟一個檔案,用fclose()函式關閉一個檔案。

檔案開啟函式——fopen()

函式原型:FILE *fopen("檔名","操作方式");

功能:返回一個指向指定檔案的FILE型別指標

FILE *fp;
fp = fopen("a.txt", "r");
複製程式碼

說明:

“檔名”是指要開啟(或建立)的檔名,可以使用字元陣列(或字元指標);

圖.png

檔案關閉函式——fclose()

函式原型:int fclose(FILE *檔案指標);

功能:關閉“檔案指標”所指向的檔案。如果正常關閉了檔案,則函式返回值為0;否則,返回值為非0,fclose(fp);

如果不關閉檔案,可能會丟失資料。

原因是:向檔案中寫資料時,是先將資料輸出到緩衝區,等緩衝區滿後才輸出給檔案。如果當資料未充滿緩衝區而程式結束執行,就會將緩衝區中的資料丟失。使用fclose()關閉檔案,它先把緩衝區中的資料輸出到磁碟檔案,然後才釋放檔案指標變數。

順序讀寫資料檔案

對順序讀寫來說,對檔案讀寫資料的順序和資料在檔案中的物理順序是一致的,也就是說,位於前面的資料先讀寫,位於後面的資料後讀寫;

順序讀寫需要用庫函式實現,它們由stdio.h檔案宣告:

單字元讀寫函式: 	fgetc()和fputc()
字串讀寫函式:	fgets()和fputs()
資料塊讀寫函式:	fread()和fwrite()
格式化讀寫函式:	fscanf()和fprintf()
複製程式碼

編寫檔案操作程式的步驟

可分為以下幾步:

1、定義檔案型別指標;

2、開啟檔案,並判斷是否成功開啟,若開啟檔案失敗,程式退出執行狀態;

3、對檔案進行讀寫等操作;

4、關閉檔案。

讀寫一個字元的函式——fputc()與fgetc()

寫字元函式——fputc()

函式原型:int fputc(char ch,FILE *fp);

函式功能:把一字元ch寫入fp指向的檔案中

返回值:正常,返回ch; 出錯,為EOF( - 1)

讀字元函式——fgetc()

函式原型:int fgetc(FILE *fp);

函式功能:從fp指向的檔案中讀取一字元, 通常存放到一個變數中

返回值:正常,返回讀取的字元; 出錯,為EOF( - 1)

讀寫字串的函式——fputs()與fgets()

寫字串函式——fputs()

函式原型:int fputs(char *buf, FILE *fp);

其中:buf可以是字串常量、字元陣列名或字元指標函式功能:將buf指向的字串寫到fp指定的檔案。但不輸出字串結束符‘\0’

返回值:寫成功,返回所寫的最後一個字元,否則返回EOF值

讀字串函式——fgets()

函式原型:char *fgets(char *buf, int n, FILE *fp); 函式功能:從fp指定的檔案讀取長度為n - 1的字串存入起始地址為buf的記憶體空間,自動加結束標誌‘\0’,共佔n個字元,返回值為地址buf。若在未讀足n - 1個字元前遇到換行符‘\n’或檔案結束就停止讀取。 返回值:正常,返回地址buf;若讀到檔案末尾或出錯,則返回NULL值

void main(){
	char* path = "D:\\mytxt.txt";
	//開啟
	FILE *fp = fopen(path,"r");
	if (fp == NULL){
		printf("檔案開啟失敗...");
		return;
	}
	//讀取
	char buff[50];//緩衝
	while (fgets(buff,50,fp))
	{
		printf("%s", buff);
	}
	//關閉
	fclose(fp);
}
複製程式碼

執行結果.png

void main(){
	char* path = "D:\\mytxt.txt";
	//開啟
	FILE *fp = fopen(path,"w");
	if (fp == NULL){
		printf("檔案開啟失敗...");
		return;
	}
	char *text = "我是誰並不重要,重要的是你需要我";
	fputs(text, fp);
	//關閉
	fclose(fp);
	getchar();
}

複製程式碼

執行結果.png

計算機的檔案儲存在物理上都是二進位制

文字檔案和二進位制之分,其實是一個邏輯之分

C讀寫文字檔案與二進位制檔案的差別僅僅體現在回車換行符

寫文字時,每遇到一個'\n',會將其轉換成'\r\n'(回車換行)

讀文字時,每遇到一個'\r\n',會將其轉換成'\n'

複製檔案

void main(){
	char *read_path = "D:\\timg.jpg";
	char *write_path = "D:\\timg_new.jpg";
	//讀的檔案 b字元表示操作二進位制檔案binary
	FILE *read_fp = fopen(read_path, "rb");
	//寫的檔案
	FILE *write_fp = fopen(write_path, "wb");

	//複製
	int buff[50]; //緩衝區域
	int len = 0; //每次讀到的資料長度
	while ((len = fread(buff, sizeof(int), 50, read_fp)) != 0){
		//將讀到的內容寫入新的檔案
		fwrite(buff, sizeof(int), len, write_fp);
	}
	//關閉流
	fclose(read_fp);
	fclose(write_fp);
	getchar();
}

複製程式碼

執行結果.png

獲取檔案大小

void main(){
	char *read_path = "D:\\timg.jpg";
	FILE *fp = fopen(read_path, "r");
	//重新定位檔案指標
	//SEEK_END檔案末尾,0偏移量
	fseek(fp, 0, SEEK_END);
	//返回當前的檔案指標,相對於檔案開頭的位移量
	long filesize = ftell(fp);
	printf("%d\n", filesize);
	getchar();
}
複製程式碼

執行結果.png

相關文章