首頁 > 軟體

深入瞭解C語言中常見的檔案操作方法

2022-06-29 18:03:56

1.為什麼使用檔案

大家在寫程式的時候有沒有一個困惑,就是我寫的程式,輸入一些資料後,當我把程式關掉以後資料就消失了。這是因為程式執行時,所有的資料都儲存在記憶體中,當程式退出後,程式中的資料自然就不存在了。等下次再執行程式時,又要重新錄入資料,非常難受

​ 如何解決這個問題呢,我們可以學習使用檔案來將其儲存

2.什麼是檔案

2.1檔案分類

在程式設計中,一般將檔案分為兩部分:程式檔案和資料檔案

程式檔案:

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

資料檔案:

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

這次我們想要聊的是第二種資料檔案,它可以幫助將我們執行時的資料儲存到磁碟中,以便我們下次使用

2.2 檔名

每一個檔案都有自己的名字,它由三部分組成

檔案路徑+檔名主幹+檔案字尾

c:codetest.txt

3.檔案的開啟和關閉

3.1檔案指標

想要開啟一個檔案,我們需要使用到檔案指標,該指標是由系統宣告的,例如,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;

相信很多人看到這裡,已經不想再讀下去了,堅持一下,前面這些並不重要

3.2 如何使用檔案指標

首先我們需要定義一個檔案指標

FILE* pf

想要將資料儲存到檔案中或者從檔案中讀取資料,我們先要將檔案開啟,ANSIC 規定使用fopen函數來開啟檔案。

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

filename: 檔名

mode : 檔案的開啟方式

下面是一些常見的mode

檔案使用方式含義如果指定檔案不存在
“r”(唯讀)為了輸入資料,開啟一個已經存在的文字檔案出錯
“w”(只寫)為了輸出資料,開啟一個文字檔案建立一個新的檔案
“a”(追加)向文字檔案尾新增資料建立一個新的檔案
“rb”(唯讀)為了輸入資料,開啟一個二進位制檔案出錯
“wb”(只寫)為了輸出資料,開啟一個二進位制檔案建立一個新的檔案
“ab”(追加)向一個二進位制檔案尾新增資料出錯
“r+”(讀寫)為了讀和寫,開啟一個文字檔案出錯
“w+”(讀寫)為了讀和寫,建議一個新的檔案建立一個新的檔案
“a+”(讀寫)開啟一個檔案,在檔案尾進行讀寫建立一個新的檔案
“rb+”(讀寫)為了讀和寫開啟一個二進位制檔案出錯
“wb+”(讀寫)為了讀和寫,新建一個新的二進位制檔案建立一個新的檔案
“ab+”(讀寫)開啟一個二進位制檔案,在檔案尾進行讀和寫建立一個新的檔案

注:這裡的輸入是指將資料寫到記憶體中,輸出是寫到檔案中

3.讀寫資料後使用fclose關閉檔案。

int fclose ( FILE * stream );
// 範例
#include <stdio.h>
int main ()
{
  FILE * pFile;
  //開啟檔案
  pFile = fopen ("myfile.txt","w");
  //檔案操作
  if (pFile!=NULL)
 {
    fputs ("fopen example",pFile);
    //關閉檔案
    fclose (pFile);
 }
  return 0; 
}

4.檔案的讀寫

現在我們知道了,如何去開啟一個檔案,那麼如何將它的資料輸入到程式中呢?

首先我想介紹一些函數

功能函數名適用於
字元輸入函數fgetc所有輸入流
字元輸出函數fputc所有輸出流
文字行輸入函數fgets所有輸入流
文字行輸出函數fputs所有輸出流
格式化輸入函數fscanf所有輸入流
格式化輸出函數fprintf所有輸出流
二進位制輸入fread檔案
二進位制輸出fwrite檔案

看不懂? 沒關係,接下來我將用一個範例告訴你如何使用。

//這是我以前寫通訊錄時用到的一些方法
typedef struct Contact
{
	struct contact_person* data;
	int count;	//通訊錄中人員個數
	int capacity;
}Contact;//通訊錄型別的指標

void Save(Contact* con) //將資料儲存到檔案中
{
	FILE* fp = fopen("contact.txt", "wb");
	if (fp == NULL)
	{
		printf("Save()::%s", strerror(errno)); //如果開啟失敗,報錯
		return;
	}
	else
	{
		fwrite(con->data, sizeof(struct contact_person), con->count, fp);//將資料寫到contect.txt中
	}
	fclose(fp); //關閉檔案
	fp = NULL;
}

void Load(Contact* con) //將檔案中的資料載入到記憶體中
{
	FILE* fp = fopen("contact.txt", "r");
	if (fp == NULL)
	{
		printf("Load()::%s", strerror(errno));
		return;
	}
	else
	{
		struct contact_person tmp;
		while (fread(&tmp, sizeof(struct contact_person), 1, fp))// fread的返回值為讀到資料的個數,用來判斷是否繼續讀取
		{
			Check_capacity(con);//檢測通訊錄容量是否足夠
			con->data[con->count] = tmp;
			con->count++;
		}
	}
	fclose(fp);
	fp = NULL;
}

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


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