首頁 > 軟體

C語言由淺入深講解檔案的操作上篇

2022-04-01 19:02:38

為什麼使用檔案

前面寫的通訊錄,增加人數退出程式後,資料就會消失。此時資料是存放在記憶體中,下次執行通訊錄程式的時候,資料又得重新錄入,如果使用這樣的通訊錄就很難受。

所以檔案操作就應運而生。資料持久化的方法有兩種:1.把資料存放在磁碟檔案2.存放到資料庫使用檔案我們們可以將資料直接存放在電腦的硬碟上,做到了資料的持久化。

什麼是檔案

但是在程式設計中,我們一般談的檔案有兩種:程式檔案、資料檔案(從檔案功能的角度來分類的)。

程式檔案:包括源程式檔案(字尾為.c),目標檔案(windows環境字尾為.obj),可執行程式(windows環境字尾為.exe)。

資料檔案:檔案的內容不一定是程式,而是程式執行時讀寫的資料,比如程式執行需要從中讀取資料的檔案,或者輸出內容的檔案。

在以前各章所處理資料的輸入輸出都是以終端為物件的,即從終端的鍵盤輸入資料,執行結果顯示到顯示器上。

其實有時候我們會把資訊輸出到磁碟上,當需要的時候再從磁碟上把資料讀取到記憶體中使用,這裡處理的就是磁碟上檔案。

檔名

一個檔案要有一個唯一的檔案標識,以便使用者識別和參照。

檔名包含3部分:檔案路徑+檔名主幹+檔案字尾

例如: c:codetest.txt

為了方便起見,檔案標識常被稱為檔名。

關於檔案的一些概念

檔案指標:緩衝檔案系統中,關鍵的概念是“檔案型別指標”,簡稱“檔案指標”。

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

VS2013編譯環境提供的 stdio.h 標頭檔案中有以下的檔案型別申明;

struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
       };
typedef struct _iobuf FILE;

每當開啟一個檔案的時候,系統會根據檔案的情況自動建立一個FILE結構的變數,並填充其中的資訊,使用者不必關心細節。

FILE指標:一般都是通過一個FILE的指標來維護這個FILE結構的變數,這樣使用起來更加方便。

下面我們可以建立一個FILE*的指標變數:

FILE* pf;//檔案指標變數

定義pf是一個指向FILE型別資料的指標變數。可以使pf指向某個檔案的檔案資訊區(是一個結構體變數)。通過該檔案資訊區中的資訊就能夠存取該檔案。也就是說,通過檔案指標變數能夠找到與它關聯的檔案

規定:檔案在讀寫之前應該先開啟檔案,在使用結束之後應該關閉檔案。

在編寫程式的時候,在開啟檔案的同時,都會返回一個FILE*的指標變數指向該檔案,也相當於建立了指標和檔案的關係。

ANSIC 規定使用fopen函數來開啟檔案,fclose來關閉檔案

首先理解 讀和寫 是什麼意思。

寫檔案:將記憶體的資料 輸出 到檔案或螢幕上。

讀檔案:將檔案或鍵盤的資料 輸入 到記憶體中。

檔案函數

fopen

函數原型:

FILE *fopen( const char *filename, const char *mode );

函數功能:Open a file.

該函數的功能就是開啟一個檔案,函數的第一個引數是你要開啟的檔案的檔名,第二個引數是開啟這個檔案的形式。

返回值:Each of these functions returns a pointer to the open file. A null pointer value indicates an error.

返回一個指向檔案的指標,如果開啟錯誤返回空指標。

注意:需要檢查fopen返回值的有效性

	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		printf("%sn", strerror(errno));
		return;//失敗返回
	}

fclose

函數原型:

int fclose( FILE *stream );

函數功能

Closes a stream (fclose) .

關閉一個流

返回值:fclose returns 0 if the stream is successfully closed.return EOF to indicate an errorreturn 0

如果流成功關閉,返回EOF(-1)如果失敗。

範例程式碼

	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		printf("%sn", strerror(errno));
		return 1;//失敗返回
	}

絕對路徑

絕對路徑就是在具體檔案的位置。例如:

D:c-languagec yuyanc yuyandata.txt

FILE* pf = fopen("D:\c-language\c yuyan\c yuyandata.txt", "r");

但是為了防止字串中的’‘及其後面的字元被整體視為為跳脫字元,所以需要在每個’‘後面再加一個’’。

檔案的開啟方式

前三個是常用的方式。

規則:

檔案開啟方式含義
“r” (唯讀)開啟檔案進行輸入操作。如不存在將會報錯。
“w” (只寫)為了輸出資料,開啟一個文字檔案。如存在,則清空裡面的資料並輸出。如不存在將建立一個新的檔案。
“a” (追加)向文字檔案尾新增資料。如果檔案不存在,則建立該檔案。
“rb”(唯讀)為了輸入資料,開啟一個二進位制檔案。如不存在,則出錯。
“wb”(只寫)為了輸出資料,開啟一個二進位制檔案。如不存在,則建一個新檔案。
“ab”(追加)向一個二進位制檔案尾新增資料。如不存在,則出錯。
“r+”(讀寫)開啟一個檔案進行更新(輸入和輸出)。如不存在則出錯。
“w+”(讀寫)建一個空檔案並開啟它以進行更新(輸入和輸出)。如果同名檔案已經存在,則將丟棄其內容,並且該檔案將被視為新的空檔案。
“a+”(讀寫)開啟一個檔案,在檔案尾進行讀寫。如不存在建立一個新檔案。

檔案操作流程

以下是對檔案操作的一般流程。

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
	//開啟檔案
	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		printf("%sn", strerror(errno));
		return 0;
	}
	//對檔案進行一系列操作
	......
	.....
	//關閉檔案
	fclose(pf);
	pf = NULL;置空
	return 0;
}

到此這篇關於C語言由淺入深講解檔案的操作上篇的文章就介紹到這了,更多相關C語言 檔案操作內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com