日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達者為師

網(wǎng)站首頁 編程語言 正文

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

作者:。菀枯。 ? 更新時間: 2022-08-21 編程語言

1.為什么使用文件

大家在寫程序的時候有沒有一個困惑,就是我寫的程序,輸入一些數(shù)據(jù)后,當(dāng)我把程序關(guān)掉以后數(shù)據(jù)就消失了。這是因為程序運行時,所有的數(shù)據(jù)都存儲在內(nèi)存中,當(dāng)程序退出后,程序中的數(shù)據(jù)自然就不存在了。等下次再運行程序時,又要重新錄入數(shù)據(jù),非常難受

? 如何解決這個問題呢,我們可以學(xué)習(xí)使用文件來將其保存

2.什么是文件

2.1文件分類

在程序設(shè)計中,一般將文件分為兩部分:程序文件和數(shù)據(jù)文件

程序文件:

包括源程序文件(后綴為.c),目標(biāo)文件(windows環(huán)境后綴為.obj),可執(zhí)行程序(windows環(huán)境后綴為.exe)。

數(shù)據(jù)文件:

文件的內(nèi)容不一定是程序,而是程序運行時讀寫的數(shù)據(jù),比如程序運行需要從中讀取數(shù)據(jù)的文件或者輸出內(nèi)容的文件

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

2.2 文件名

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

文件路徑+文件名主干+文件后綴

c:\code\test.txt

3.文件的打開和關(guān)閉

3.1文件指針

想要打開一個文件,我們需要使用到文件指針,該指針是由系統(tǒng)聲明的,例如,VS2013編譯環(huán)境提供的 stdio.h 頭文件中有以下的文件類型申明

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

相信很多人看到這里,已經(jīng)不想再讀下去了,堅持一下,前面這些并不重要

3.2 如何使用文件指針

首先我們需要定義一個文件指針

FILE* pf

想要將數(shù)據(jù)存儲到文件中或者從文件中讀取數(shù)據(jù),我們先要將文件打開,ANSIC 規(guī)定使用fopen函數(shù)來打開文件。

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

filename: 文件名

mode : 文件的打開方式

下面是一些常見的mode

文件使用方式 含義 如果指定文件不存在
“r”(只讀) 為了輸入數(shù)據(jù),打開一個已經(jīng)存在的文本文件 出錯
“w”(只寫) 為了輸出數(shù)據(jù),打開一個文本文件 建立一個新的文件
“a”(追加) 向文本文件尾添加數(shù)據(jù) 建立一個新的文件
“rb”(只讀) 為了輸入數(shù)據(jù),打開一個二進制文件 出錯
“wb”(只寫) 為了輸出數(shù)據(jù),打開一個二進制文件 建立一個新的文件
“ab”(追加) 向一個二進制文件尾添加數(shù)據(jù) 出錯
“r+”(讀寫) 為了讀和寫,打開一個文本文件 出錯
“w+”(讀寫) 為了讀和寫,建議一個新的文件 建立一個新的文件
“a+”(讀寫) 打開一個文件,在文件尾進行讀寫 建立一個新的文件
“rb+”(讀寫) 為了讀和寫打開一個二進制文件 出錯
“wb+”(讀寫) 為了讀和寫,新建一個新的二進制文件 建立一個新的文件
“ab+”(讀寫) 打開一個二進制文件,在文件尾進行讀和寫 建立一個新的文件

注:這里的輸入是指將數(shù)據(jù)寫到內(nèi)存中,輸出是寫到文件中

3.讀寫數(shù)據(jù)后使用fclose關(guān)閉文件。

int fclose ( FILE * stream );
// 示例
#include <stdio.h>
int main ()
{
  FILE * pFile;
  //打開文件
  pFile = fopen ("myfile.txt","w");
  //文件操作
  if (pFile!=NULL)
 {
    fputs ("fopen example",pFile);
    //關(guān)閉文件
    fclose (pFile);
 }
  return 0; 
}

4.文件的讀寫

現(xiàn)在我們知道了,如何去打開一個文件,那么如何將它的數(shù)據(jù)輸入到程序中呢?

首先我想介紹一些函數(shù)

功能 函數(shù)名 適用于
字符輸入函數(shù) fgetc 所有輸入流
字符輸出函數(shù) fputc 所有輸出流
文本行輸入函數(shù) fgets 所有輸入流
文本行輸出函數(shù) fputs 所有輸出流
格式化輸入函數(shù) fscanf 所有輸入流
格式化輸出函數(shù) fprintf 所有輸出流
二進制輸入 fread 文件
二進制輸出 fwrite 文件

看不懂? 沒關(guān)系,接下來我將用一個示例告訴你如何使用。

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

void Save(Contact* con) //將數(shù)據(jù)存儲到文件中
{
	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);//將數(shù)據(jù)寫到contect.txt中
	}
	fclose(fp); //關(guān)閉文件
	fp = NULL;
}

void Load(Contact* con) //將文件中的數(shù)據(jù)加載到內(nèi)存中
{
	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的返回值為讀到數(shù)據(jù)的個數(shù),用來判斷是否繼續(xù)讀取
		{
			Check_capacity(con);//檢測通訊錄容量是否足夠
			con->data[con->count] = tmp;
			con->count++;
		}
	}
	fclose(fp);
	fp = NULL;
}

原文鏈接:https://blog.csdn.net/m0_60447315/article/details/123565227

欄目分類
最近更新