国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

怒肝1.5萬(wàn)字——史上最全C語(yǔ)言文件操作詳解

Alfred / 3200人閱讀

摘要:二什么是文件磁盤(pán)上的文件就是文件。文件指針變量定義是一個(gè)指向類型數(shù)據(jù)的指針變量。表示向何種流中輸出,可以是標(biāo)準(zhǔn)輸出流,也可以是文件流。文件結(jié)構(gòu)體指針,將要讀取的文件流。

提示:文章寫(xiě)完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔


一、為什么使用文件

我們前面學(xué)習(xí)結(jié)構(gòu)體時(shí),寫(xiě)了通訊錄的程序,當(dāng)通訊錄運(yùn)行起來(lái)時(shí),可以給通訊錄增加、刪除數(shù)據(jù),此時(shí)的數(shù)據(jù)是存放在內(nèi)存中的,當(dāng)程序退出時(shí),通訊錄的數(shù)據(jù)就被銷毀了,下次運(yùn)行通訊錄時(shí),數(shù)據(jù)又得重新錄入,如果使用這樣的通訊錄就會(huì)非常的坐牢。

所以這些通訊錄數(shù)據(jù)我們僅僅放在內(nèi)存里是不行的,大家都知道,我們電腦的C盤(pán)、D盤(pán)、E盤(pán)等等里面存放的文件,你不進(jìn)行刪除,它就一直在那里,那我們可以試著把通訊錄的數(shù)據(jù)存入磁盤(pán)里,來(lái)實(shí)現(xiàn)數(shù)據(jù)的持久性。

二、什么是文件?

磁盤(pán)上的文件就是文件。
但是在程序設(shè)計(jì)中,我們一般談的文件有兩種:
1.程序文件
2.數(shù)據(jù)文件
(以文件功能來(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)容的文件。
本文著重討論數(shù)據(jù)文件
在以前各章所處理的數(shù)據(jù)的輸入輸出都是以終端為對(duì)象的,即從終端的鍵盤(pán)輸入數(shù)據(jù),運(yùn)行的結(jié)果顯示到顯示器上,其實(shí)有時(shí)候我們會(huì)把信息輸出到鍵盤(pán)上,當(dāng)需要的時(shí)候再?gòu)逆I盤(pán)上把數(shù)據(jù)讀取到內(nèi)存中使用,這里處理的就是磁盤(pán)上的文件。

下圖是數(shù)據(jù)文件與程序文件的交互簡(jiǎn)圖

2.3文件名

一個(gè)文件要有一個(gè)唯一的文件標(biāo)識(shí),便于用戶的識(shí)別與引用。
文件名包含3個(gè)部分:文件路徑+文件名主干+文件后綴
栗子:E:/c-language-notes/test.txt
這里的E:/c-language-notes/叫作文件路徑,是在E盤(pán)c-language-notes這個(gè)路徑底下
test叫作文件主干
.txt叫做文件后綴

為了方便起見(jiàn),文件標(biāo)識(shí)常被稱為文件名

三、文件的打開(kāi)與關(guān)閉

3.1文件指針

緩沖文件系統(tǒng)中,關(guān)鍵的概念是“文件類型指針”,簡(jiǎn)稱文件指針

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

如上圖,當(dāng)你想要操作一個(gè)數(shù)據(jù)文件時(shí),你不可避免地會(huì)經(jīng)歷3個(gè)操作:打開(kāi)文件、讀/寫(xiě)文件、關(guān)閉文件。只要你打開(kāi)文件,系統(tǒng)會(huì)自動(dòng)生成一個(gè)叫做文件信息區(qū)的東西,也就是會(huì)創(chuàng)建一個(gè) FILE 類型結(jié)構(gòu)體變量,上圖以f作為示例,實(shí)際也可能是其他的,那么創(chuàng)建完成后,f就會(huì)和data.txt文件強(qiáng)關(guān)聯(lián)了,f會(huì)記錄data文件名、文件有多大、文件在哪個(gè)位置、文件的狀態(tài)是怎樣的。。。

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 _ibuf FILE//把上述結(jié)構(gòu)體重命名為FILE

不同編譯器的FILE類型包含的內(nèi)容不一定完全相同,但基本都是大同小異,每當(dāng)打開(kāi)一個(gè)文件時(shí),系統(tǒng)會(huì)根據(jù)文件的情況自動(dòng)創(chuàng)建一個(gè)FILE結(jié)果的變量,并填充其中的信息,我們使用者不必過(guò)度關(guān)心細(xì)節(jié),按周總理說(shuō)的“求同存異”即可。

一般都是通過(guò)一個(gè)FILE類型的指針來(lái)維護(hù)FILE結(jié)構(gòu)的變量,這樣使用起來(lái)更加方便。

FILE*pf;//文件指針變量

定義pf是一個(gè)指向FILE類型數(shù)據(jù)的指針變量。可以使pf指向某個(gè)文件的文件信息區(qū)(是一個(gè)結(jié)構(gòu)體變量)。通過(guò)該文件信息區(qū)中的信息就可以訪問(wèn)該文件。也就是說(shuō),通過(guò)文件指針變量能找到與它關(guān)聯(lián)的文件如下圖所示:
pf是指向文件信息區(qū)的,而文件信息區(qū)又可以確切的找到與它關(guān)聯(lián)的文件,這樣你就可以通過(guò)pf找到所需文件并進(jìn)行相關(guān)操作。

3.2文件的打開(kāi)與關(guān)閉

文件在讀寫(xiě)之前應(yīng)該先打開(kāi)文件,在使用后應(yīng)該關(guān)閉文件
在編寫(xiě)程序時(shí),打開(kāi)文件的同時(shí),都會(huì)返回一個(gè)FILE*的指針變量指向該文件,也相對(duì)于建立了指針和文件的聯(lián)系。

ANSIC規(guī)定使用fopen函數(shù)來(lái)打開(kāi)文件,fclose來(lái)關(guān)閉文件

FILE *fopen(const char* filename, const char* moede);//打開(kāi)文件//fopen第一個(gè)參數(shù)是文件名,第二個(gè)參數(shù)是打開(kāi)模式//比如你傳一個(gè)test.txt到一個(gè)參數(shù)里,傳的其實(shí)是首字母t的地址//打開(kāi)模式是這樣的,你是想給這個(gè)文件寫(xiě)點(diǎn)東西還是想讀取這個(gè)文件的一些東西int fclose(FILE*stream);//關(guān)閉文件

關(guān)于打開(kāi)模式如下圖,比如你打開(kāi)模式是r,那你的打開(kāi)方式就是讀,如果你的文件不存在或者沒(méi)有被找到,那fopen函數(shù)就會(huì)調(diào)用失敗

(圖片來(lái)自比特就業(yè)課,這里只舉r一個(gè)打開(kāi)方式,其他打開(kāi)方式讀者可自行對(duì)照上表)

fopen打開(kāi)模式打開(kāi)data.txt文件會(huì)返回一個(gè)FILE*的指針,該指針是指向與data.txt文件相關(guān)聯(lián)的文件信息區(qū)的起始地址,如果打開(kāi)失敗會(huì)返回空指針。

fclose關(guān)閉文件相對(duì)fopen就簡(jiǎn)單很多了,你要關(guān)閉哪個(gè)文件,我們直接傳那個(gè)文件關(guān)聯(lián)的文件信息區(qū)的指針即可,也就是上圖的pf

打開(kāi)和關(guān)閉實(shí)際操作代碼示例如下:
比如我現(xiàn)在要打開(kāi)E:/c-language-notes/test.21.10.9路徑下的data.txt文件

int main(){   //打開(kāi)文件    //fopen函數(shù)	FILE*pf=fopen("E://c-language-notes//test.21.10.9//data.txt", "r");	//這里的"/"可能會(huì)與后面的字母構(gòu)成轉(zhuǎn)義字符,我們用/對(duì)/進(jìn)行轉(zhuǎn)義一下,讓/單純是一個(gè)/	//fopen函數(shù)會(huì)返回一個(gè)FILE*的指針,打開(kāi)失敗返回空指針	if (pf == NULL)	{		perror("fopen");//perror函數(shù)顯示錯(cuò)誤信息		return -1;	}	//讀文件。。。	//關(guān)閉文件	fclose(pf);	pf = NULL;	return 0;}

需要注意的是,fclose關(guān)閉文件是不會(huì)把pf置為空指針的,我們需要手動(dòng)操作置為空指針

四、文件的順序讀寫(xiě)


(圖片來(lái)自比特就業(yè)課)
所有輸入流包括:istream 類連續(xù)文本模式輸入使用、ifstream磁盤(pán)文件輸入、istringstream 類從內(nèi)存字符串的輸入

4.1字符輸入輸出函數(shù)

fgetc和fputc函數(shù)分別是讀入一個(gè)字符和輸出一個(gè)字符

如上圖,我們寫(xiě)一個(gè)程序時(shí),會(huì)產(chǎn)生一些數(shù)據(jù),數(shù)據(jù)會(huì)存放在內(nèi)存中,如果你想把數(shù)據(jù)寫(xiě)入(輸出)到文件里,或者你想把文件里的信息讀到內(nèi)存中,叫讀(輸入操作)。我們用輸入/輸出操作就用的是fgetc與fputc

fputc函數(shù)示例:

// int fputc(int c, FILE *stream);函數(shù)聲明int main(){   	FILE*pf = fopen("E://c-language-notes//test.21.10.9//data.txt", "w");//以“只寫(xiě)w”的模式打開(kāi)文件	if (pf == NULL)	{		perror("fopen");//perror函數(shù)顯示錯(cuò)誤信息		return -1;	}	//寫(xiě)文件	fputc("b", pf);	fputc("i", pf);	fputc("t", pf);	fclose(pf);	pf = NULL;	return 0;}

運(yùn)行完上述代碼后,相關(guān)文件自動(dòng)出現(xiàn)fputc函數(shù)寫(xiě)入的三個(gè)字

fgetc函數(shù)示例:

//int fgetc(FILE *filename);函數(shù)聲明int main(){	FILE*pf = fopen("E://c-language-notes//test.21.10.9//data.txt", "r");//以“只讀r”的模式打開(kāi)文件	if (pf == NULL)	{		perror("fopen");//perror函數(shù)顯示錯(cuò)誤信息		return -1;	}	//讀文件	int ch1=fgetc(pf);	printf("%c/n", ch1);	int ch2 = fgetc(pf);	printf("%c/n", ch2);		int ch3 = fgetc(pf);	printf("%c/n", ch3);	fclose(pf);	pf = NULL;	return 0;}

假設(shè)我們現(xiàn)在相關(guān)文件里有3個(gè)字母abc

我們運(yùn)行上述程序,程序自動(dòng)從文件里獲取三個(gè)字母abc

4.2文本行輸入輸出函數(shù)

我們?cè)賮?lái)看一看文本行輸入/輸出函數(shù)
fputs函數(shù)示例:

//int fputs(const char *s, FILE *stream);函數(shù)聲明//s 代表要輸出的字符串的首地址,可以是字符數(shù)組名或字符指針變量名。//stream 表示向何種流中輸出,可以是標(biāo)準(zhǔn)輸出流 stdout,也可以是文件流。標(biāo)準(zhǔn)輸出流即屏幕輸出,printf 其實(shí)也是向標(biāo)準(zhǔn)輸出流中輸出的。int main(){	FILE*pf = fopen("E://c-language-notes//test.21.10.9//data.txt", "w");//以“只寫(xiě)W”的模式打開(kāi)文件	if (pf == NULL)	{		perror("fopen");//perror函數(shù)顯示錯(cuò)誤信息		return -1;	}	//寫(xiě)文件(寫(xiě)一行)	fputs("hello world/n", pf);	fputs("hello bit/n", pf);	fclose(pf);	pf = NULL;	return 0;}

和fputc差不多,fputc是寫(xiě)一個(gè)字母,fputs是寫(xiě)一行,運(yùn)行完上述程序,相關(guān)文件夾出現(xiàn)hello world 和hello bit

fgets函數(shù)示例:

//char *fgets(char *buf, int bufsize, FILE *stream);//*buf: 字符型指針,指向用來(lái)存儲(chǔ)所得數(shù)據(jù)的地址。//bufsize: 整型數(shù)據(jù),指明存儲(chǔ)數(shù)據(jù)的大小。//*stream: 文件結(jié)構(gòu)體指針,將要讀取的文件流。int main(){	FILE*pf = fopen("E://c-language-notes//test.21.10.9//data.txt", "r");//以“只讀r”的模式打開(kāi)文件	if (pf == NULL)	{		perror("fopen");//perror函數(shù)顯示錯(cuò)誤信息		return -1;	}	//讀文件(讀一行)	char arr[20] = { 0 };	fgets(arr,5,pf);	printf("%s/n", arr);//打印hell,說(shuō)是最多讀5個(gè)其實(shí)是讀到第四個(gè),然后第五個(gè)補(bǔ)/0	fclose(pf);	pf = NULL;	return 0;}

我們?cè)任募镉衕ello world 和hello bit,我們讀一行中的5個(gè)字符到arr里


說(shuō)是打印5個(gè)字符,其實(shí)是打印4個(gè)字符,第五個(gè)字符是自動(dòng)補(bǔ)/0

4.3格式化輸入輸出函數(shù)

格式化輸入輸出也就是按某種格式寫(xiě)入或讀取
fprintf函數(shù)示例:

struct S{	int n;	double d;};int main(){    //int fprintf(FILE *filename, const char *string, . . . .);函數(shù)聲明     //看起來(lái)函數(shù)聲明有點(diǎn)麻煩,我們?cè)賮?lái)看一下常見(jiàn)的printf函數(shù)聲明     //int printf( const char *format, … );     //對(duì)比一下很容易發(fā)現(xiàn)也就是比printf函數(shù)多一個(gè)指針參數(shù)而已,其他的都按printf來(lái)即可	    struct S s = { 100,3.14 };		FILE*pf = fopen("E://c-language-notes//test.21.10.9//data.txt", "w");//以“只寫(xiě)w”的模式打開(kāi)文件		if (pf == NULL)		{			perror("fopen");//perror函數(shù)顯示錯(cuò)誤信息			return -1;		}		//寫(xiě)文件		fprintf(pf,"%d %lf", s.n, s.d);		fclose(pf);		pf = NULL;		return 0;}

fprintf就是printf函數(shù)多一個(gè)pf指針,其他的和printf都是一樣的,上述代碼運(yùn)行一下,相關(guān)文件出現(xiàn)100,和3.140000(浮點(diǎn)型默認(rèn)6位小數(shù))

fscanf函數(shù)示例:

struct S{	int n;	double d;};int main(){    //int fscanf(FILE *stream, char *format,[argument...]);函數(shù)聲明    //和fprintf一樣,就是scanf函數(shù)前面多一個(gè)pf指針參數(shù)	struct S s = { 0};	FILE*pf = fopen("E://c-language-notes//test.21.10.9//data.txt", "r");//以“只讀r”的模式打開(kāi)文件	if (pf == NULL)	{		perror("fopen");//perror函數(shù)顯示錯(cuò)誤信息		return -1;	}	//讀文件	fscanf(pf,"%d %lf", &(s.n), &(s.d));	printf("%d %lf/n", s.n, s.d);	fclose(pf);	pf = NULL;	return 0;}


原先文件里有100 3.140000,運(yùn)行程序后讀取出這兩個(gè)數(shù)

4.4二進(jìn)制輸入輸出函數(shù)

fwrite函數(shù)聲明如下
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
ptr-- 這是指向要被寫(xiě)入的元素?cái)?shù)組的指針。
size-- 這是要被寫(xiě)入的每個(gè)元素的大小,以字節(jié)為單位。
nmemb-- 這是元素的個(gè)數(shù),每個(gè)元素的大小為 size 字節(jié)。
stream-- 這是指向 FILE 對(duì)象的指針,該 FILE 對(duì)象指定了一個(gè)輸出流。
fwrite函數(shù)示例:

//size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)//ptr-- 這是指向要被寫(xiě)入的元素?cái)?shù)組的指針。//size-- 這是要被寫(xiě)入的每個(gè)元素的大小,以字節(jié)為單位。//nmemb-- 這是元素的個(gè)數(shù),每個(gè)元素的大小為 size 字節(jié)。//stream-- 這是指向 FILE 對(duì)象的指針,該 FILE 對(duì)象指定了一個(gè)輸出流。struct S{	int n;	double d;	char name[20];};int main(){	    struct S s = { 100,3.14,"zhangsan" };		FILE*pf = fopen("E://c-language-notes//test.21.10.9//data.txt", "wb");//以“只寫(xiě)wb”的模式打開(kāi)文件		if (pf == NULL)		{			perror("fopen");//perror函數(shù)顯示錯(cuò)誤信息			return -1;		}		//寫(xiě)文件-二進(jìn)制方式寫(xiě)		fwrite(&s, sizeof(s), 1, pf);		//關(guān)閉文件		fclose(pf);		pf = NULL;		return 0;}

這里要注意的是,我們以二進(jìn)制fwrite寫(xiě)入,產(chǎn)生的是二進(jìn)制文件,所以我們以二進(jìn)制的wb模式打開(kāi),文件里的內(nèi)容如下

因?yàn)槭嵌M(jìn)制文件,我們直接看是看不懂的,但是我們知道可以二進(jìn)制讀,也就是下面的fread函數(shù)
函數(shù)聲明:size_t fread( void *buffer, size_t size, size_t count, FILE *stream )
buffer 是讀取的數(shù)據(jù)存放的內(nèi)存的指針(可以是數(shù)組,也可以是新開(kāi)辟的空間,buffer就是一個(gè)索引)
size 是每次讀取的字節(jié)數(shù)
count 是讀取次數(shù)
strean 是要讀取的文件的指針
fread函數(shù)示例:

struct S{	int n;	double d;	char name[20];};int main(){	struct S s = {0};	FILE*pf = fopen("E://c-language-notes//test.21.10.9//data.txt", "rb");//以“只寫(xiě)wb”的模式打開(kāi)文件	//wb	if (pf == NULL)	{		perror("fopen");//perror函數(shù)顯示錯(cuò)誤信息		return -1;	}	//讀文件-二進(jìn)制方式讀	fread(&s, sizeof(struct S), 1, pf);	//打印	printf("%d %lf %s/n", s.n, s.d, s.name);	fclose(pf);	pf = NULL;	return 0;}


我們現(xiàn)在文件里是這些東西,我們運(yùn)行程序讀一下

可以讀出之前寫(xiě)入的東西

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

5.1fseek

函數(shù)聲明:int fseek(FILE *stream, long offset, int fromwhere);
函數(shù)設(shè)置文件指針stream的位置。如果執(zhí)行成功,stream將指向以fromwhere為基準(zhǔn),偏移offset個(gè)字節(jié)的位置。如果執(zhí)行失敗(比如offset超過(guò)文件自身大小),則不改變stream指向的位置。執(zhí)行成功返回0,否則返回其他數(shù)。

fromwhere有三個(gè)值:
SEEK_CUR 文件指針當(dāng)前位置
SEEK_END 文件的末尾
SEEK_SET 文件的起始

比如a的地址就是文件的起始,f就是文件的末尾,假如我現(xiàn)在fgetc讀了一個(gè),指針從a往后移動(dòng)一位,指針指向b,那b所在位置就是SEEK_CUR,也就是文件指針當(dāng)前位置

注意:隨機(jī)讀寫(xiě)不是亂讀,而是想讀哪里讀哪里,比如我想讀文件第三個(gè)字母,我就可以直接用隨機(jī)讀寫(xiě)讀取第三個(gè)字母。我們?nèi)砸陨厦孢@個(gè)文本文檔為例:
現(xiàn)在我要讀第三個(gè),按照常規(guī)的順序讀寫(xiě),是有一個(gè)指針指向a,然后每讀一個(gè),指針往后移一位,讀第三個(gè)要移動(dòng)2次。fseek函數(shù)就是可以快速根據(jù)指針的位置和偏移量來(lái)定位文件指針,大白話講就是fseek函數(shù)可以快速找到第三個(gè)字母的指針。

#define _CRT_SECURE_NO_WARNINGS#include//fseek函數(shù)int main(){	//1.打開(kāi)文件	FILE*pf=fopen("E://c-language-notes//test.21.10.11//data.txt", "r");	if (pf == NULL)	{		perror("fopen");		return -1;	}	//2.讀文件(隨機(jī)讀寫(xiě))	//讀c	fseek(pf, 2, SEEK_SET);//現(xiàn)在我要讀c,剛開(kāi)始cur和set都是起始位置,用cur也可	int ch = fgetc(pf);	printf("%c/n", ch);	//讀b	fseek(pf, -2, SEEK_CUR);	ch = fgetc(pf);	printf("%c/n", ch);	//3.關(guān)閉文件	return 0;}

關(guān)于讀b,因?yàn)槲覀冏xc之后,指針會(huì)自動(dòng)往后移一位,所以cur是指向d的,b關(guān)于d的偏移量是-2,所以我們用fseek(pf, -2, SEEK_CUR);讀取

5.2ftell

函數(shù)聲明:long int ftell(FILE*filenname);

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

#include//fseek函數(shù)int main(){	//1.打開(kāi)文件	FILE*pf=fopen("E://c-language-notes//test.21.10.11//data.txt", "r");	if (pf == NULL)	{		perror("fopen");		return -1;	}	//2.讀文件(隨機(jī)讀寫(xiě))	//讀c	fseek(pf, 2, SEEK_SET);//現(xiàn)在我要讀c,剛開(kāi)始cur和set都是起始位置,用cur也可	int ch = fgetc(pf);	printf("%c/n", ch);	//讀b	fseek(pf, -2, SEEK_CUR);	ch = fgetc(pf);	printf("%c/n", ch);	int a=ftell(pf);//b讀完之后指針自動(dòng)往后一位到c,c相對(duì)a偏移量為2	printf("%d", a);//打印2	//3.關(guān)閉文件	return 0;}

繼上一段代碼,我們讀完b之后指針自動(dòng)往后移動(dòng)一位指向c,c相對(duì)起始位置a的偏移量為2,所以ftell會(huì)返回2

5.3rewind

函數(shù)聲明:void rewind(FILE *stream);
不管pf現(xiàn)在在什么位置,傳過(guò)去,pf重新指向文件起始位置

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

根據(jù)數(shù)據(jù)的組織形式,數(shù)據(jù)文件被稱為文本文件或者二進(jìn)制文件
數(shù)據(jù)在內(nèi)存中以二進(jìn)制的形式存儲(chǔ),如果不加轉(zhuǎn)換的輸出到外存,就是二進(jìn)制文件

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

一個(gè)數(shù)據(jù)在內(nèi)存中是怎么存儲(chǔ)的呢?
字符一律以ASCII碼的形式進(jìn)行存儲(chǔ),數(shù)值型的數(shù)據(jù)即可用ASCII碼的形式存儲(chǔ),也可以用二進(jìn)制形式存儲(chǔ),如下,我們進(jìn)行10000的存儲(chǔ)

(圖片來(lái)自比特就業(yè)課)
如果我們按ASCII形式存儲(chǔ),把10000共5位,我們把每位上的數(shù)字看做一個(gè)字符,共要5個(gè)字節(jié)

如果我們直接按二進(jìn)制形式進(jìn)行存儲(chǔ),二進(jìn)制的10000,是
00000000 00000000 00100111 00010000共需占4個(gè)字節(jié)(1個(gè)整形)

七、文件讀取結(jié)束的判斷

7.1被錯(cuò)誤使用的feof

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

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

*fgetc判斷是否為EOF
fgetc讀到一個(gè)字符返回int,如果文件結(jié)束沒(méi)讀到或者遇到錯(cuò)誤,返回EOF

原文件里有abcdef5個(gè)字符,現(xiàn)在我們?cè)趺蠢胒getc進(jìn)行打印,并判斷是否結(jié)束呢?

代碼如下:

#includeint main(){	    //打開(kāi)文件		FILE*pf=fopen("E://c-language-notes//test.21.10.11//data.txt", "r");		if (pf == NULL)		{			perror("fopen");			return -1;		}
            
                     
             
               

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/122562.html

相關(guān)文章

  • 【零基礎(chǔ)趣學(xué)C語(yǔ)言】- 史上最全C語(yǔ)言函數(shù)詳解萬(wàn)字圖文+代碼演示+圖解)

    摘要:語(yǔ)言在設(shè)計(jì)中考慮了函數(shù)的高效性和易用性兩個(gè)原則。在語(yǔ)言中,最常見(jiàn)的當(dāng)屬函數(shù)了。以上就是一個(gè)函數(shù),它被稱為語(yǔ)言的入口函數(shù),或者主函數(shù)。例如和都是函數(shù)名。形式參數(shù)當(dāng)函數(shù)調(diào)用完成之后就自動(dòng)銷毀了。 ...

    468122151 評(píng)論0 收藏0
  • 從小白程序員一路晉升為大廠高級(jí)技術(shù)專家我看過(guò)哪些書(shū)籍?(建議收藏)

    摘要:大家好,我是冰河有句話叫做投資啥都不如投資自己的回報(bào)率高。馬上就十一國(guó)慶假期了,給小伙伴們分享下,從小白程序員到大廠高級(jí)技術(shù)專家我看過(guò)哪些技術(shù)類書(shū)籍。 大家好,我是...

    sf_wangchong 評(píng)論0 收藏0
  • 首次公開(kāi),整理12年積累的博客收藏夾,零距離展示《收藏夾吃灰》系列博客

    摘要:時(shí)間永遠(yuǎn)都過(guò)得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過(guò)去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...

    Harriet666 評(píng)論0 收藏0
  • 技術(shù)棧:史上最全Ceph構(gòu)件及組件分析

    摘要:層確保數(shù)據(jù)一致性和可靠性。保證集群的相關(guān)組件在同一時(shí)刻能夠達(dá)成一致,相當(dāng)于集群的領(lǐng)導(dǎo)層,負(fù)責(zé)收集更新和發(fā)布集群信息。元數(shù)據(jù)服務(wù)器,跟蹤文件層次結(jié)構(gòu)并存儲(chǔ)只供使用的元數(shù)據(jù)。啟迪云-高級(jí)開(kāi)發(fā)工程師 ?侯玉彬前言上一次簡(jiǎn)單的介紹Ceph的過(guò)去和未來(lái)的發(fā)展。這一節(jié)將詳細(xì)介紹Ceph的構(gòu)件以及組件。Ceph存儲(chǔ)架構(gòu)Ceph 存儲(chǔ)集群由幾個(gè)不同的daemon組成,每個(gè)daemon負(fù)責(zé)Ceph 的一個(gè)獨(dú)特...

    big_cat 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<