最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言實(shí)現(xiàn)文件操作實(shí)例(簡(jiǎn)單圖示講解)

 更新時(shí)間:2023年02月01日 09:58:59   作者:小王學(xué)代碼  
與普通文件載體不同,文件是以硬盤(pán)為載體存儲(chǔ)在計(jì)算機(jī)上的信息集合,文件可以是文本文檔、圖片、程序等等,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言實(shí)現(xiàn)文件操作實(shí)例的相關(guān)資料,需要的朋友可以參考下

前言

說(shuō)到文件操作,大家會(huì)第一印象想到不就是電腦硬盤(pán)中創(chuàng)建文件,寫(xiě)入數(shù)據(jù)嗎,鍵盤(pán)、鼠標(biāo)就可以搞定,那么接下來(lái)我要告訴你的是C語(yǔ)言也可以實(shí)現(xiàn)文件操作哦!?。?/p>

首先、我們要實(shí)現(xiàn)的文件操作,不只是簡(jiǎn)單的打開(kāi)和關(guān)閉,寫(xiě)入數(shù)據(jù),我們也可以從相對(duì)應(yīng)文件中,讀取數(shù)據(jù),到程序中,使得程序能順利運(yùn)行,并對(duì)傳來(lái)的數(shù)據(jù)進(jìn)行處理使用!

一、為什么要使用文件操作

我們?cè)谇拔闹?,?shí)現(xiàn)了靜態(tài)、動(dòng)態(tài)通訊錄,但是我們也發(fā)現(xiàn)了,只要程序關(guān)閉,那么添加的通訊錄的信息數(shù)據(jù),也就一起消失,我們下次打開(kāi)的時(shí)候,通訊錄是空的,那么這不太符合我們實(shí)際所需。我們需要的是,可以利用、可以存儲(chǔ)、可以保存的通訊錄,那么我們就必須了解一下,文件操作。

文件操作:使用文件操作我們可以將數(shù)據(jù)直接存放到電腦的硬盤(pán)上,做到數(shù)據(jù)的持久化

二、文件

磁盤(pán)上的文件就是文件。

在程序設(shè)計(jì)中,我們一般說(shuō)的文件有兩種,分別是程序文件、數(shù)據(jù)文件(從文件功能的角度進(jìn)行分類(lèi))。

2.1 程序文件

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

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

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

由上文對(duì)于兩種文件的介紹,我們可知,我們需要了解的是數(shù)據(jù)文件,本文就主要講解一下,如何處理數(shù)據(jù)文件,并對(duì)該文件進(jìn)行操作

2.3 文件名

文件名是一個(gè)文件的唯一的文件標(biāo)識(shí),以便于用戶(hù)識(shí)別和引用。

比如:D:\new.txt    這是D盤(pán)下的文件名為new的文本文檔

三、文件操作

我們之前在寫(xiě)C語(yǔ)言程序的時(shí)候,都是通過(guò)鍵盤(pán)和屏幕,進(jìn)行輸入和輸出數(shù)據(jù),我們這一次要將數(shù)據(jù)輸入和讀取數(shù)據(jù)都是于硬盤(pán)有關(guān)。

3.1 文件打開(kāi)和關(guān)閉

我們首先要了解的是我們之前一直所處理的,輸入輸出數(shù)據(jù)都是以終端為對(duì)象的,即從終端的鍵盤(pán)輸入數(shù)據(jù),運(yùn)行結(jié)果顯示到顯示器上。

如圖:

文件操作需要的是,以硬盤(pán)中的文件為數(shù)據(jù)輸入輸出對(duì)象。

如圖:

1. 文件指針

在緩沖文件系統(tǒng)中,關(guān)鍵的概念是 “ 文件類(lèi)型指針 ”,即文件指針

文件信息區(qū):

每個(gè)被使用的文件都在內(nèi)存中開(kāi)辟了一個(gè)相應(yīng)的文件信息區(qū),用來(lái)存放文件的相關(guān)信息(如文件的名字,文件狀態(tài)及文件當(dāng)前的位置等)。這些信息是保存在一個(gè)結(jié)構(gòu)體變量中的。該結(jié)構(gòu)體類(lèi)型是有系統(tǒng)聲明的,取名 FILE.

下圖是在VS2013編輯環(huán)境提供的stdio.h頭文件中有的文件類(lèi)型的聲明:

struct _iobuf {
    char *_ptr;
    int  _cnt;
    char *_base;
    int  _flag;
    int  _file;
    int  _charbuf;
    int  _bufsiz;
    char *_tmpfname;
   };
typedef struct _iobuf FILE;//就是一個(gè)結(jié)構(gòu)體類(lèi)型的FILE,規(guī)定的文件的 所有信息,都是可以存儲(chǔ)在上面

不同編譯器不同的內(nèi)容,但是都是可以存放各種文件類(lèi)型的結(jié)構(gòu)體FILE,正常使用即可,不用深究

每次打開(kāi)一個(gè)文件,系統(tǒng)就會(huì)根據(jù)文件的情況自動(dòng)創(chuàng)建一個(gè)FILE結(jié)構(gòu)的變量,并填充信息,一般都是通過(guò)一個(gè)FILE指針來(lái)維護(hù)這個(gè)FILE結(jié)構(gòu)的變量,方便使用

如圖:

定義pf是一個(gè)指向FILE類(lèi)型數(shù)據(jù)的指針變量。可以使pf指向某個(gè)文件的文件信息區(qū)(是一個(gè)結(jié)構(gòu)體變量)。通過(guò)該文件信息區(qū)中的信息就能夠訪問(wèn)該文件。也就是說(shuō),通過(guò)文件指針變量能夠找到與它關(guān)聯(lián)的文件。

2. 文件的打開(kāi)和關(guān)閉

文件在使用前應(yīng)該先打開(kāi),之后再關(guān)閉,我們先認(rèn)識(shí)一下C語(yǔ)言給我們提供的文件開(kāi)關(guān)函數(shù)

第一個(gè)fopen來(lái)打開(kāi)文件,第二個(gè)fclose來(lái)關(guān)閉文件

代碼如下:

//打開(kāi)文件
FILE * fopen ( const char * filename, const char * mode );//返回文件類(lèi)型
//關(guān)閉文件
int fclose ( FILE * stream );//返回整型

打開(kāi)方式:

1.r表示讀         w表示寫(xiě)        a表示追加(即不會(huì)覆蓋原有數(shù)據(jù))

2.帶b,標(biāo)識(shí)的是打開(kāi)二進(jìn)制文件

3. +號(hào)表示讀寫(xiě),如果是r+的話,且沒(méi)有指定文件,那么會(huì)報(bào)錯(cuò),但是w+、a+若沒(méi)有指定文件,會(huì)創(chuàng)建一個(gè)指定文件,再輸入數(shù)據(jù)(寫(xiě)文件)

代碼演示:

3.2 文件的順序讀寫(xiě)

什么叫做順序讀寫(xiě)呢,意思就是,在讀取/寫(xiě)文件的時(shí)候,讀取一個(gè)或者寫(xiě)一個(gè)內(nèi)容進(jìn)去,光標(biāo)就會(huì)向后移動(dòng)一位,有順序的讀取和寫(xiě)入

如圖:

 通過(guò)fgetc和fputc函數(shù)解釋了,文件確實(shí)是按照順序讀寫(xiě)的

3.3 函數(shù)使用

輸入流和輸出流介紹:

流的概念:

上面函數(shù)使用于所有輸入流或文件,這是什么意思?

圖示解釋如下:

1. fgetc和fputc

上文圖示用到這兩個(gè)函數(shù)

代碼如下:

//這是fgetc函數(shù),可以理解為得到文件中的一個(gè)字符
int main()
{
	FILE* pf = fopen("test.txt", "r");
	for (int i = 0; i < 10; i++) {
		char src = fgetc(pf);
		printf("%c", src);
	}
	fclose(pf);
	pf = NULL;
	return 0;
}
//這是fputc函數(shù),可以理解為放置文件中一個(gè)字符
int main()
{
	FILE* pf = fopen("test.txt", "w");
	for (int i = 0; i < 26; i++) {
		fputc('a' + i, pf);
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

實(shí)際上,fgetc和fputc函數(shù)就是得到或放置一個(gè)字符在文件中,返回值為int

2. fgets和fputs

fgets和fputs,可以理解為得到或者放置一個(gè)字符串在文件中。

還有一個(gè)特點(diǎn),如圖所示:

 fgets如果沒(méi)有讀取到內(nèi)容,返回NULL

代碼如下:

//fgets函數(shù)
int main()
{
	FILE* pf = fopen("test.txt", "r");
	char arr[20];
	while (fgets(arr, 20, pf) != NULL) {
		printf("%s", arr);
	}
	fclose(pf);
	pf = NULL;
	return 0;
}
//fputs函數(shù)
int main()
{
	FILE* pf = fopen("test.txt", "w");
	char arr[20];
	fputs("hello world!!\n", pf);
	fputs("hello why\n", pf);
	fputs("hello fzx\n", pf);
 
	fclose(pf);
	pf = NULL;
	return 0;
}

3. fscanf和fprintf

實(shí)際上和scanf、printf差不多的形式,只是多一個(gè)參數(shù) FILE*stream

如圖:

如果fscanf讀取的時(shí)候沒(méi)有數(shù)據(jù),那么也不會(huì)報(bào)錯(cuò),就認(rèn)為是沒(méi)有讀取吧

代碼如圖所示:

struct S {
	char name[20];
	int age;
	double score;
};
//fscanf格式化讀取pf流中的數(shù)據(jù),賦值給后面的參數(shù),和scanf用法差不多,
//只是多一個(gè)FILE*類(lèi)型,后面于scanf用法一致,改用&就用
int main()
{
	FILE* pf = fopen("test.txt", "r+");
	//讀寫(xiě)都行
	//格式化輸出
	//struct S s = { "why",19,100 };
	struct S s = {0};
	struct S s1 = { 0 };
	fscanf(pf, "%s %d %lf\n", s.name, &(s.age), &(s.score));
	printf("%s %d %lf\n", s.name, (s.age), (s.score));
	//fscanf(pf, "%s %d %lf\n", s1.name, &(s1.age), &(s1.score));
	//printf("%s %d %lf\n", s1.name, (s1.age), (s1.score));
	int a = 10;
	/*fscanf(pf, "%d", a);
	printf("%d\n", a);*/  //這是進(jìn)行測(cè)試如果沒(méi)有相應(yīng)的數(shù)據(jù)讀取的時(shí)候,不會(huì)報(bào)錯(cuò),只是相當(dāng)于沒(méi)有這一行代碼,不會(huì)發(fā)生任何改變(對(duì)相應(yīng)a)
	fclose(pf);
	pf = NULL;
	return 0;
}
 
//這是fprintf函數(shù)的使用
int main()
{
	FILE* pf = fopen("test.txt", "r+");
	//讀寫(xiě)都行
	//格式化輸出
	struct S s = { "why",19,100 };
	fprintf(pf, "%s %d %lf\n", s.name, (s.age), (s.score));
	//printf("%s %d %lf\n", s.name, (s.age), (s.score));
	fclose(pf);
	pf = NULL;
	return 0;
}

1.fscanf 格式化讀取pf流中的數(shù)據(jù),賦值給后面的參數(shù),和 scanf 用法差不多,只是多一個(gè)FILE*類(lèi)型,后面于 scanf 用法一致,該用&就用

2.fprintf 格式化寫(xiě)入文件中數(shù)據(jù),上面代碼中,將結(jié)構(gòu)體變量s,數(shù)據(jù),寫(xiě)入pf管理的文件中

3.fscanf 如果沒(méi)有相應(yīng)的數(shù)據(jù)讀取的時(shí)候,不會(huì)報(bào)錯(cuò),只是相當(dāng)于沒(méi)有這一行代碼,不會(huì)發(fā)生任何改變(對(duì)相應(yīng)a)

4. fread和fwrite

只能接收文件流,二進(jìn)制文件,可能會(huì)有亂碼產(chǎn)生

如圖分析:

代碼演示:

struct S {
	char name[20];
	int age;
	double score;
};
//先寫(xiě)入二進(jìn)制文件	fwrite
int main()
{
	struct S s = { "fzx",18,100 };
	FILE* pf = fopen("test.txt", "wb");
	//寫(xiě)一個(gè)二進(jìn)制文件
	fwrite(&s, sizeof(struct S), 1, pf);
 
	fclose(pf);
	pf = NULL;
	return 0;
}
//再讀取二進(jìn)制文件 fread
int main()
{
	struct S s = { 0 };
	FILE* pf = fopen("test.txt", "rb");
	//讀取文件
	fread(&s, sizeof(struct S), 1, pf);
	printf("%s %d %lf\n", s.name, s.age, s.score);
	return 0;
}

5. 對(duì)比一組函數(shù)

scanf / fscanf / sscanf

printf / fprintf /sprintf

前面四種大家都認(rèn)識(shí)了,那么sscanf和sprintf是什么呢

如圖所示:

3.4 文件的隨機(jī)讀寫(xiě)

1. fseek

根據(jù)文件指針的位置和偏移量來(lái)定位文件指針。(改變光標(biāo)位置)

 代碼演示:

int main()
{
	FILE* pFile;
	pFile = fopen("example.txt", "wb");
	fputs("This is an apple.", pFile);
	fseek(pFile, 9, SEEK_SET);
	fputs(" sam", pFile);
	fclose(pFile);
	return 0;
}

2.ftell

返回文件指針相對(duì)于起始位置的偏移量

 代碼演示:

int main()
{
	FILE* pFile;
	pFile = fopen("example.txt", "wb");
	int num = ftell(pFile);
	printf("%d ", num);
	return 0;
}

3.rewind

讓文件指針的位置回到文件的起始位置

圖文演示:

 代碼演示:

int main()
{
	FILE* pf = fopen("test.txt", "w");
	for (int i = 0; i < 10; i++) {
		fputc('a' + i, pf);
	}
	int num = ftell(pf);
	printf("%d \n", num);
	rewind(pf);
	printf("%d \n", ftell(pf));
	fclose(pf);
	pf = NULL;
	return 0;
}

3.5 文本文件和二進(jìn)制文件

1.根據(jù)數(shù)據(jù)的組織形式,數(shù)據(jù)文件被稱(chēng)為文本文件或者二進(jìn)制文件。

2.數(shù)據(jù)在內(nèi)存中以二進(jìn)制的形式存儲(chǔ),如果不加轉(zhuǎn)換的輸出到外存,就是二進(jìn)制文件。

3.如果要求在外存上以ASCII碼的形式存儲(chǔ),則需要在存儲(chǔ)前轉(zhuǎn)換。以ASCII字符的形式存儲(chǔ)     的文件就是文本文件。

字符一律以ASCII形式存儲(chǔ),數(shù)值型數(shù)據(jù)既可以用ASCII形式存儲(chǔ),也可以使用二進(jìn)制形式存儲(chǔ)。

測(cè)試文本文件和二進(jìn)制文件代碼:

int main()
{
int a = 10000;
FILE* pf = fopen("test.txt", "wb");
fwrite(&a, 4, 1, pf);//二進(jìn)制的形式寫(xiě)到文件中
fclose(pf);
pf = NULL;
return 0;
}

3.6文件讀取結(jié)束的判定

在文件讀取過(guò)程中,不能用feof函數(shù)的返回值直接用來(lái)判斷文件的是否結(jié)束,而是應(yīng)用于當(dāng)文件讀取結(jié)束的時(shí)候,判斷是讀取失敗結(jié)束,還是遇到文件尾結(jié)束。

1.文本文件讀取是否結(jié)束,判斷返回值是否為 EOF ( fgetc ),或者 NULL ( fgets )

   fgetc 判斷是否為 EOF .
   fgets 判斷返回值是否為 NULL 

2. 二進(jìn)制文件的讀取結(jié)束判斷,判斷返回值是否小于實(shí)際要讀的個(gè)數(shù)。

   fread判斷返回值是否小于實(shí)際要讀的個(gè)數(shù)

圖示:

代碼演示:

//文本文件
int main(void)
{
  int c; // 注意:int,非char,要求處理EOF
  FILE* fp = fopen("test.txt", "r");
  if(!fp) {
    perror("File opening failed");
    return EXIT_FAILURE;
 }
//fgetc 當(dāng)讀取失敗的時(shí)候或者遇到文件結(jié)束的時(shí)候,都會(huì)返回EOF
  while ((c = fgetc(fp)) != EOF) // 標(biāo)準(zhǔn)C I/O讀取文件循環(huán)
 {
   putchar(c);
 }//判斷是什么原因結(jié)束的
  if (ferror(fp))
    puts("I/O error when reading");
  else if (feof(fp))
    puts("End of file reached successfully");
  fclose(fp);
}
 

總結(jié)

主要講解文件操作的的一些函數(shù),fopen、fclose、fgets、fwrite等等函數(shù)的介紹,以及對(duì)于文件的分類(lèi)、輸入和輸出流的分析,以及更多文件操作的函數(shù)圖示分解。

到此這篇關(guān)于C語(yǔ)言實(shí)現(xiàn)文件操作的文章就介紹到這了,更多相關(guān)C語(yǔ)言實(shí)現(xiàn)文件操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)文本文件/二進(jìn)制文件格式互換

    C語(yǔ)言實(shí)現(xiàn)文本文件/二進(jìn)制文件格式互換

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)文本文件和二進(jìn)制文件格式互換,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • C語(yǔ)言實(shí)現(xiàn)消消樂(lè)游戲的代碼分享

    C語(yǔ)言實(shí)現(xiàn)消消樂(lè)游戲的代碼分享

    本章我們將編寫(xiě)十字消除游戲,用戶(hù)點(diǎn)擊空白方塊,沿其上下左右方向?qū)ふ业谝粋€(gè)彩色方塊,如果有兩個(gè)或兩個(gè)以上顏色一致,就將其消除,感興趣的可以了解一下
    2023-02-02
  • 詳解C語(yǔ)言之實(shí)現(xiàn)通訊錄

    詳解C語(yǔ)言之實(shí)現(xiàn)通訊錄

    這篇文章主要為大家詳細(xì)介紹了用C語(yǔ)言實(shí)現(xiàn)通訊錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++左值與右值,右值引用,移動(dòng)語(yǔ)義與完美轉(zhuǎn)發(fā)詳解

    C++左值與右值,右值引用,移動(dòng)語(yǔ)義與完美轉(zhuǎn)發(fā)詳解

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • C++深入探究不同的繼承體系

    C++深入探究不同的繼承體系

    繼承是C++面向?qū)ο缶幊讨械囊婚T(mén)。繼承是子類(lèi)繼承父類(lèi)的特征和行為,或者是繼承父類(lèi)得方法,使的子類(lèi)具有父類(lèi)得的特性和行為。重寫(xiě)是子類(lèi)對(duì)父類(lèi)的允許訪問(wèn)的方法實(shí)行的過(guò)程進(jìn)行重新編寫(xiě),返回值和形參都不能改變。就是對(duì)原本的父類(lèi)進(jìn)行重新編寫(xiě),但是外部接口不能被重寫(xiě)
    2022-05-05
  • c語(yǔ)言string.h頭文件中所有函數(shù)示例詳解

    c語(yǔ)言string.h頭文件中所有函數(shù)示例詳解

    這篇文章詳細(xì)介紹了C語(yǔ)言標(biāo)準(zhǔn)庫(kù)中的字符串和內(nèi)存操作函數(shù),以str開(kāi)頭的字符串處理函數(shù)和以mem開(kāi)頭的內(nèi)存處理函數(shù),每種函數(shù)都有詳細(xì)的原型、功能描述和示例代碼,需要的朋友可以參考下
    2024-11-11
  • C++編程模板匹配超詳細(xì)的識(shí)別手寫(xiě)數(shù)字實(shí)現(xiàn)示例

    C++編程模板匹配超詳細(xì)的識(shí)別手寫(xiě)數(shù)字實(shí)現(xiàn)示例

    大家好!本篇文章是關(guān)于手寫(xiě)數(shù)字識(shí)別的,接下來(lái)我將在這里記錄我的手寫(xiě)數(shù)字識(shí)別的從零到有,我在這里把我自己的寫(xiě)代碼過(guò)程發(fā)出來(lái),希望能幫到和我一樣努力求知的人
    2021-10-10
  • C++實(shí)現(xiàn)數(shù)字轉(zhuǎn)換為十六進(jìn)制字符串的方法

    C++實(shí)現(xiàn)數(shù)字轉(zhuǎn)換為十六進(jìn)制字符串的方法

    這篇文章主要介紹了C++實(shí)現(xiàn)數(shù)字轉(zhuǎn)換為十六進(jìn)制字符串的方法,涉及C++操作數(shù)字與字符串轉(zhuǎn)換的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • C++?opencv將圖片動(dòng)漫化介紹

    C++?opencv將圖片動(dòng)漫化介紹

    大家好,本篇文章主要講的是C++?opencv將圖片動(dòng)漫化介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • c++之解決char轉(zhuǎn)string時(shí)出現(xiàn)的亂碼問(wèn)題

    c++之解決char轉(zhuǎn)string時(shí)出現(xiàn)的亂碼問(wèn)題

    這篇文章主要介紹了c++之解決char轉(zhuǎn)string時(shí)出現(xiàn)的亂碼問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08

最新評(píng)論

阿图什市| 宝兴县| 延津县| 改则县| 云霄县| 云霄县| 沙河市| 客服| 健康| 南溪县| 从江县| 青州市| 耿马| 曲水县| 南漳县| 浠水县| 曲阜市| 清原| 永善县| 安顺市| 白沙| 鄂托克旗| 铜梁县| 唐山市| 虹口区| 抚顺市| 沂南县| 富源县| 杭锦旗| 三都| 红河县| 都江堰市| 海口市| 镇康县| 漳平市| 克什克腾旗| 来宾市| 龙州县| 武川县| 海口市| 灵石县|