深入瞭解C語言中常見的文件操作方法

1.為什麼使用文件

大傢在寫程序的時候有沒有一個困惑,就是我寫的程序,輸入一些數據後,當我把程序關掉以後數據就消失瞭。這是因為程序運行時,所有的數據都存儲在內存中,當程序退出後,程序中的數據自然就不存在瞭。等下次再運行程序時,又要重新錄入數據,非常難受

​ 如何解決這個問題呢,我們可以學習使用文件來將其保存

2.什麼是文件

2.1文件分類

在程序設計中,一般將文件分為兩部分:程序文件和數據文件

程序文件:

包括源程序文件(後綴為.c),目標文件(windows環境後綴為.obj),可執行程序(windows環境後綴為.exe)。

數據文件:

文件的內容不一定是程序,而是程序運行時讀寫的數據,比如程序運行需要從中讀取數據的文件或者輸出內容的文件

這次我們想要聊的是第二種數據文件,它可以幫助將我們運行時的數據存儲到磁盤中,以便我們下次使用

2.2 文件名

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

文件路徑+文件名主幹+文件後綴

c:\code\test.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語言文件操作內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: