成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

??學(xué)懂C語(yǔ)言文件操作讀這篇就夠了(萬(wàn)字總結(jié),附習(xí)題)??

Genng / 4257人閱讀

目錄

???

一,寫(xiě)在前面

二,為什么使用文件

1,原因

2,數(shù)據(jù)流

3,緩沖區(qū)(Buffer)

4,C語(yǔ)言中帶緩沖區(qū)的文件處理

5,文件類型

6,文件存取方式

三,什么是文件

1,程序文件

?2,數(shù)據(jù)文件

3,文件名

四,文件的打開(kāi)和關(guān)閉?

1,文件指針

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

五,文件的順序讀寫(xiě)

1,功能

2,代碼實(shí)現(xiàn)

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

1,fseek

2,ftell

3,rewind

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

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

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

九,文件緩沖區(qū)

十,習(xí)題?

1,C語(yǔ)言文件概念

2,文件類型指針

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

4,文件的讀寫(xiě)


一,寫(xiě)在前面

本文是在學(xué)校和教學(xué)視頻下總結(jié)的自己億點(diǎn)點(diǎn)心得,文章篇幅有一點(diǎn)長(zhǎng),如果讀者想要更深入的了解C語(yǔ)言文件操作,文件操作在C語(yǔ)言中比較獨(dú)立,沒(méi)那么重要,建議上手練一練,學(xué)編程不練習(xí),不敲代碼進(jìn)步會(huì)很慢,(保姆級(jí)教學(xué))最后,如果你感覺(jué)本文寫(xiě)的不錯(cuò),求收藏,求點(diǎn)贊,求評(píng)論,爆肝不易,你的三連是我學(xué)習(xí)最大的動(dòng)力?。?!

二,為什么使用文件

1,原因

這就涉及到了數(shù)據(jù)持久化的問(wèn)題,我們一般數(shù)據(jù)持久化的方法有,把數(shù)據(jù)存放在磁盤(pán)文件、存放到數(shù)據(jù) 庫(kù)等方式。 使用文件我們可以將數(shù)據(jù)直接存放在電腦的硬盤(pán)上,做到了數(shù)據(jù)的持久化。

2,數(shù)據(jù)流

指程序與數(shù)據(jù)的交互是以流的形式進(jìn)行的。進(jìn)行C語(yǔ)言文件的存取時(shí),都會(huì)先進(jìn)行“打開(kāi)文件”操作,這個(gè)操作就是在打開(kāi)數(shù)據(jù)流,而“關(guān)閉文件”操作就是關(guān)閉數(shù)據(jù)流。

3,緩沖區(qū)(Buffer)

指在程序執(zhí)行時(shí),所提供的額外內(nèi)存,可用來(lái)暫時(shí)存放做準(zhǔn)備執(zhí)行的數(shù)據(jù)。它的設(shè)置是為了提高存取效率,因?yàn)閮?nèi)存的存取速度比磁盤(pán)驅(qū)動(dòng)器快得多。

4,C語(yǔ)言中帶緩沖區(qū)的文件處理

C語(yǔ)言的文件處理功能依據(jù)系統(tǒng)是否設(shè)置“緩沖區(qū)”分為兩種:一種是設(shè)置緩沖區(qū),另一種是不設(shè)置緩沖區(qū)。由于不設(shè)置緩沖區(qū)的文件處理方式,必須使用較低級(jí)的I/O函數(shù)(包含在頭文件io.h和fcntl.h中)來(lái)直接對(duì)磁盤(pán)存取,這種方式的存取速度慢,并且由于不是C的標(biāo)準(zhǔn)函數(shù),跨平臺(tái)操作時(shí)容易出問(wèn)題。下面只介紹第一種處理方式,即設(shè)置緩沖區(qū)的文件處理方式:

當(dāng)使用標(biāo)準(zhǔn)I/O函數(shù)(包含在頭文件stdio.h中)時(shí),系統(tǒng)會(huì)自動(dòng)設(shè)置緩沖區(qū),并通過(guò)數(shù)據(jù)流來(lái)讀寫(xiě)文件。當(dāng)進(jìn)行文件讀取時(shí),不會(huì)直接對(duì)磁盤(pán)進(jìn)行讀取,而是先打開(kāi)數(shù)據(jù)流,將磁盤(pán)上的文件信息拷貝到緩沖區(qū)內(nèi),然后程序再?gòu)木彌_區(qū)中讀取所需數(shù)據(jù),如下圖所示:

事實(shí)上,當(dāng)寫(xiě)入文件時(shí),并不會(huì)馬上寫(xiě)入磁盤(pán)中,而是先寫(xiě)入緩沖區(qū),只有在緩沖區(qū)已滿或“關(guān)閉文件”時(shí),才會(huì)將數(shù)據(jù)寫(xiě)入磁盤(pán),如下圖所示。

5,文件類型

分為文本文件和二進(jìn)制文件兩種。

文本文件是以字符編碼的方式進(jìn)行保存的。二進(jìn)制文件將內(nèi)存中數(shù)據(jù)原封不至文件中,適用于非字符為主的數(shù)據(jù)。如果以記事本打開(kāi),只會(huì)看到一堆亂碼。

其實(shí),除了文本文件外,所有的數(shù)據(jù)都可以算是二進(jìn)制文件。二進(jìn)制文件的優(yōu)點(diǎn)在于存取速度快,占用空間小,以及可隨機(jī)存取數(shù)據(jù)。

6,文件存取方式

包括順序存取方式和隨機(jī)存取方式兩種。

順序讀取也就是從上往下,一筆一筆讀取文件的內(nèi)容。保存數(shù)據(jù)時(shí),將數(shù)據(jù)附加在文件的末尾。這種存取方式常用于文本文件,而被存取的文件則稱為順序文件。

隨機(jī)存取方式多半以二進(jìn)制文件為主。它會(huì)以一個(gè)完整的單位來(lái)進(jìn)行數(shù)據(jù)的讀取和寫(xiě)入,通常以結(jié)構(gòu)為單位。

三,什么是文件

磁盤(pán)上的文件是文件。 但是在程序設(shè)計(jì)中,我們一般談的文件有兩種:程序文件、數(shù)據(jù)文件(從文件功能的角度來(lái)分類的)。

1,程序文件

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

?2,數(shù)據(jù)文件

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

其實(shí)有時(shí)候我們會(huì)把信息輸出到磁盤(pán)上,當(dāng)需要的時(shí)候再?gòu)拇疟P(pán)上把數(shù)據(jù)讀取到內(nèi)存中使用,這里處理 的就是磁盤(pán)上文件。

3,文件名

一個(gè)文件要有一個(gè)唯一的文件標(biāo)識(shí),以便用戶識(shí)別和引用。

文件名包含3部分:文件路徑+文件名主干+文件后綴

例如: c:/code/test.txt

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

四,文件的打開(kāi)和關(guān)閉?

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) 聲明的,取名FILE.

例如,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;

不同的C編譯器的FILE類型包含的內(nèi)容不完全相同,但是大同小異。

每當(dāng)打開(kāi)一個(gè)文件的時(shí)候,系統(tǒng)會(huì)根據(jù)文件的情況自動(dòng)創(chuàng)建一個(gè)FILE結(jié)構(gòu)的變量,并填充其中的信息, 使用者不必關(guān)心細(xì)節(jié)。

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

下面我們可以創(chuàng)建一個(gè)FILE*的指針變量:

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

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

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

文件在讀寫(xiě)之前應(yīng)該先打開(kāi)文件,在使用結(jié)束之后應(yīng)該關(guān)閉文件。

在編寫(xiě)程序的時(shí)候,在打開(kāi)文件的同時(shí),都會(huì)返回一個(gè)FILE*的指針變量指向該文件,也相當(dāng)于建立了 指針和文件的關(guān)系。

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

//打開(kāi)文件FILE * fopen ( const char * filename, const char * mode );//關(guān)閉文件int fclose ( FILE * stream );
文件使用方式? ? ? ? ? ? ? ? ? ? ? 含義如果指定文件不存在
“r”(只讀)為了輸入數(shù)據(jù),打開(kāi)一個(gè)已經(jīng)存在的文本文件出錯(cuò)
“w”(只寫(xiě))為了輸出數(shù)據(jù),打開(kāi)一個(gè)文本文件建立一個(gè)新的文件
“a”(追加)向文本文件尾添加數(shù)據(jù)出錯(cuò)
“rb”(只讀)為了輸入數(shù)據(jù),打開(kāi)一個(gè)二進(jìn)制文件出錯(cuò)
“wb”(只寫(xiě))為了輸出數(shù)據(jù),打開(kāi)一個(gè)二進(jìn)制文件建立一個(gè)新的文件
“ab”(追加)為了輸出數(shù)據(jù),打開(kāi)一個(gè)二進(jìn)制文件出錯(cuò)
“r+”(讀寫(xiě))為了讀和寫(xiě),打開(kāi)一個(gè)文本文件出錯(cuò)
“w+”(讀寫(xiě))為了讀和寫(xiě),建議一個(gè)新的文件建立一個(gè)新的文件
“a+”(讀寫(xiě))打開(kāi)一個(gè)文件,在文件尾進(jìn)行讀寫(xiě)建立一個(gè)新的文件
“rb+”(讀寫(xiě))為了讀和寫(xiě)打開(kāi)一個(gè)二進(jìn)制文件出錯(cuò)
“wb+”(讀寫(xiě))為了讀和寫(xiě),新建一個(gè)新的二進(jìn)制文件建立一個(gè)新的文件
“ab+”(讀寫(xiě))打開(kāi)一個(gè)二進(jìn)制文件,在文件尾進(jìn)行讀和寫(xiě)建立一個(gè)新的文件

五,文件的順序讀寫(xiě)

1,功能

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

從流(fgetc、fgetwc)或stdin(fgetchar、fgetchar)中讀取字符。

?

將字符寫(xiě)入流(fputc,fputwc)或標(biāo)準(zhǔn)輸出(_fputchar,_fputwchar)。

?

?從stdin流中獲取一行。

?將字符串寫(xiě)入流。

從流中讀取格式化數(shù)據(jù)。

?

?將格式化數(shù)據(jù)打印到流。

從流中讀取數(shù)據(jù)。

?

將數(shù)據(jù)寫(xiě)入流。?

2,代碼實(shí)現(xiàn)

?首先在桌面上創(chuàng)建一個(gè)321.txt文件,如上圖

int main(){	//打開(kāi)文件	FILE* pf = fopen("C://Users//12556//Desktop//321.txt", "r");	if (pf == NULL)	{		perror("fopen");		return -1;	}	//讀文件	// 	//關(guān)閉文件	fclose(pf);	pf = NULL;	return 0;}

無(wú)錯(cuò)誤,打開(kāi)成功

int main(){	fputc("b", stdout);//putchar  printf("%c", ch);	fputc("i", stdout);	fputc("t", stdout);	return 0;}
int main(){	//打開(kāi)文件	FILE* pf = fopen("C://Users//12556//Desktop//321.txt", "w");	if (pf == NULL)	{		perror("fopen");		return -1;	}	    //寫(xiě)文件	fputc("b", pf);	fputc("i", pf);	fputc("t", pf);	//關(guān)閉文件	fclose(pf);	pf = NULL;	return 0;}

?寫(xiě)入成功

int main(){	FILE* pf = fopen("C://Users//12556//Desktop//321.txt", "r");	if (NULL == pf)	{		perror("fopen");		return -1;	}	//讀文件	int ch = fgetc(pf);	printf("%c/n", ch);//a	ch = fgetc(pf);	printf("%c/n", ch);//b	ch = fgetc(pf);	printf("%c/n", ch);//c	//關(guān)閉文件	fclose(pf);	pf = NULL;		return 0;}
int main(){	int ch = fgetc(stdin);//getchar scanf("%c")	printf("%c/n", ch);//a	ch = fgetc(stdin);	printf("%c/n", ch);//b	ch = fgetc(stdin);	printf("%c/n", ch);//c	return 0;}

字符串輸入成功

int main(){	FILE* pf = fopen("data.txt", "w");	if (NULL == pf)	{		perror("fopen");		return -1;	}	//寫(xiě)文件	//寫(xiě)一行數(shù)據(jù)	fputs("hello world/n", pf);	fputs("hello bit/n", pf);	//關(guān)閉文件	fclose(pf);	pf = NULL;}

在C語(yǔ)言文件下,我們找到data.txt文件,打開(kāi)發(fā)現(xiàn)輸入成功

?

int main(){	FILE* pf = fopen("data.txt", "r");	if (NULL == pf)	{		perror("fopen");		return -1;	}	//讀文件	//讀一行數(shù)據(jù)	char arr[20] = { 0 };	fgets(arr, 20, pf);	printf("%s/n", arr);	fgets(arr, 20, pf);	printf("%s/n", arr);	//關(guān)閉文件	fclose(pf);	pf = NULL;}

?

?文件閱讀成功

struct S{	int n;	double d;};int main(){	struct S s = { 100, 3.14 };	FILE* pf = fopen("data.txt", "w");	if (NULL == pf)	{		perror("fopen");		return -1;	}	//寫(xiě)文件	fprintf(pf, "%d %lf", s.n, s.d);	//關(guān)閉文件	fclose(pf);	pf = NULL;}

?

寫(xiě)入成功

struct S{	int n;	double d;};int main(){	struct S s = {0};	FILE* pf = fopen("data.txt", "r");	if (NULL == pf)	{		perror("fopen");		return -1;	}	//讀文件	fscanf(pf, "%d %lf", &(s.n), &(s.d));	printf("%d %lf/n", s.n, s.d);	//關(guān)閉文件	fclose(pf);	pf = NULL;}

?讀文件成功

struct S{	int n;	double d;	char name[10];};int main(){	struct S s = {100, 3.14, "zhangsan"};	FILE* pf = fopen("data.txt", "wb");	if (NULL == pf)	{		perror("fopen");		return -1;	}	//寫(xiě)文件 - 二進(jìn)制的方式寫(xiě)	fwrite(&s, sizeof(s), 1, pf);	//關(guān)閉文件	fclose(pf);	pf = NULL;}

文件格式不同,但計(jì)算機(jī)是以二進(jìn)制表示

//二進(jìn)制的形式讀//struct S{	int n;	double d;	char name[10];};int main(){	struct S s = {0};	FILE* pf = fopen("data.txt", "rb");	if (NULL == pf)	{		perror("fopen");		return -1;	}	//讀文件 - 二進(jìn)制的方式讀	fread(&s, sizeof(struct S), 1, pf);	//打印	printf("%d %lf %s/n", s.n, s.d, s.name);	//100 3.140000 zhangsan		//關(guān)閉文件	fclose(pf);	pf = NULL;}

?二進(jìn)制閱讀成功

struct S{	int n;	double d;	char name[10];};int main(){	char arr[100] = { 0 };	struct S tmp = { 0 };	struct S s = { 100, 3.14, "zhangsan" };	//把一個(gè)格式化的數(shù)據(jù)轉(zhuǎn)換成字符串	sprintf(arr, "%d %lf %s", s.n, s.d, s.name);	//打印	printf("%s/n", arr);		//從arr中的字符串中提取出一個(gè)格式化的數(shù)據(jù)	sscanf(arr, "%d %lf %s", &(tmp.n), &(tmp.d), tmp.name);	//打印	printf("%d %lf %s/n", tmp.n, tmp.d, tmp.name);	return 0;}

?格式化字符串成功

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

在C語(yǔ)言文件下創(chuàng)建data.txt.

?添加abcdef

1,fseek

int fseek ( FILE * stream, long int offset, int origin );

根據(jù)文件指針的位置和偏移量來(lái)定位文件指針

int main(){	//打開(kāi)文件		FILE *pf = fopen("data.txt", "r");	if (NULL == pf)	{		perror("fopen");		return -1;	}	//隨機(jī)讀寫(xiě)	/*int ch = fgetc(pf);	printf("%c/n", ch);*/	fseek(pf, 2, SEEK_SET);	int ch = fgetc(pf);	printf("%c/n", ch);	fseek(pf, -2, SEEK_CUR);		fclose(pf);	pf = NULL;	return 0;}

2,ftell

long int ftell ( FILE * stream );

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

int main(){	//打開(kāi)文件	FILE* pf = fopen("data.txt", "r");	if (NULL == pf)	{		perror("fopen");		return -1;	}	//隨機(jī)讀寫(xiě)	/*int ch = fgetc(pf);	printf("%c/n", ch);*/	fseek(pf, 2, SEEK_SET);	int ch = fgetc(pf);	printf("%c/n", ch);	fseek(pf, -2, SEEK_CUR);	ch = fgetc(pf);	printf("%c/n", ch);	int ret = ftell(pf);	printf("%c/n", ret);	fclose(pf);	pf = NULL;	return 0;}

?

3,rewind

void rewind ( FILE * stream );

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

int main(){	//打開(kāi)文件	FILE* pf = fopen("data.txt", "r");	if (NULL == pf)	{		perror("fopen");		return -1;	}	//隨機(jī)讀寫(xiě)	/*int ch = fgetc(pf);	printf("%c/n", ch);*/	fseek(pf, 2, SEEK_SET);	int ch = fgetc(pf);	printf("%c/n", ch);	fseek(pf, -2, SEEK_CUR);	ch = fgetc(pf);	printf("%c/n", ch);	int ret = ftell(pf);	printf("%c/n", ret);	rewind(pf);	printf("%c/n", ret);	fclose(pf);	pf = NULL;	return 0;}

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

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

一個(gè)數(shù)據(jù)在內(nèi)存中是怎么存儲(chǔ)的呢? 字符一律以ASCII形式存儲(chǔ),數(shù)值型數(shù)據(jù)既可以用ASCII形式存儲(chǔ),也可以使用二進(jìn)制形式存儲(chǔ)。 如有整數(shù)10000,如果以ASCII碼的形式輸出到磁盤(pán),則磁盤(pán)中占用5個(gè)字節(jié)(每個(gè)字符一個(gè)字節(jié)),而 二進(jìn)制形式輸出,則在磁盤(pán)上只占4個(gè)字節(jié)(VS2019測(cè)試)。

?在C語(yǔ)言文件下創(chuàng)建321.txt

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

打開(kāi)321.txt,發(fā)現(xiàn)無(wú)法識(shí)別,以二進(jìn)制表現(xiàn)

?我們?cè)赩S里面查找

?

?

?16進(jìn)制表示

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

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 . fgets 判斷返回值是否為 NULL .

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

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

#include #include 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);}

以二進(jìn)制文件為例

#include enum { SIZE = 5 };int main(void){	double a[SIZE] = { 1.,2.,3.,4.,5. };	FILE* fp = fopen("test.bin", "wb"); // 必須用二進(jìn)制模式	fwrite(a, sizeof * a, SIZE, fp); // 寫(xiě) double 的數(shù)組	fclose(fp);	double b[SIZE];	fp = fopen("test.bin", "rb");	size_t ret_code = fread(b, sizeof * b, SIZE, fp); // 讀 double 的數(shù)組	if (ret_code == SIZE) {		puts("Array read successfully, contents: ");		for (int n = 0; n < SIZE; ++n) printf("%f ", b[n]);		putchar("/n");	}	else { // error handling		if (feof(fp))			printf("Error reading test.bin: unexpected end of file/n");		else if (ferror(fp)) {			perror("Error reading test.bin");		}	}	fclose(fp);}

feof的用途:是文件讀取結(jié)束了,判斷是不是遇到文件末尾而結(jié)束的

ferror的用途:文件讀取結(jié)束了,判讀是不是遇到錯(cuò)誤而結(jié)束

九,文件緩沖區(qū)

ANSIC 標(biāo)準(zhǔn)采用“緩沖文件系統(tǒng)”處理的數(shù)據(jù)文件的,所謂緩沖文件系統(tǒng)是指系統(tǒng)自動(dòng)地在內(nèi)存中為程序 中每一個(gè)正在使用的文件開(kāi)辟一塊“文件緩沖區(qū)”。從內(nèi)存向磁盤(pán)輸出數(shù)據(jù)會(huì)先送到內(nèi)存中的緩沖區(qū),裝 滿緩沖區(qū)后才一起送到磁盤(pán)上。如果從磁盤(pán)向計(jì)算機(jī)讀入數(shù)據(jù),則從磁盤(pán)文件中讀取數(shù)據(jù)輸入到內(nèi)存緩 沖區(qū)(充滿緩沖區(qū)),然后再?gòu)木彌_區(qū)逐個(gè)地將數(shù)據(jù)送到程序數(shù)據(jù)區(qū)(程序變量等)。緩沖區(qū)的大小根 據(jù)C編譯系統(tǒng)決定的。

#include #include //VS2013 WIN10環(huán)境測(cè)試int main(){	FILE* pf = fopen("test.txt", "w");	fputs("abcdef", pf);//先將代碼放在輸出緩沖區(qū)	printf("睡眠10秒-已經(jīng)寫(xiě)數(shù)據(jù)了,打開(kāi)test.txt文件,發(fā)現(xiàn)文件沒(méi)有內(nèi)容/n");	Sleep(10000);	printf("刷新緩沖區(qū)/n");	fflush(pf);//刷新緩沖區(qū)時(shí),才將輸出緩沖區(qū)的數(shù)據(jù)寫(xiě)到文件(磁盤(pán))	//注:fflush 在高版本的VS上不能使用了	printf("再睡眠10秒-此時(shí),再次打開(kāi)test.txt文件,文件有內(nèi)容了/n");	Sleep(10000);	fclose(pf);	//注:fclose在關(guān)閉文件的時(shí)候,也會(huì)刷新緩沖區(qū)	pf = NULL;	return 0;}

這里可以得出一個(gè)結(jié)論: 因?yàn)橛芯彌_區(qū)的存在,C語(yǔ)言在操作文件的時(shí)候,需要做刷新緩沖區(qū)或者在文件操作結(jié)束的時(shí)候關(guān)閉文 件。 如果不做,可能導(dǎo)致讀寫(xiě)文件的問(wèn)題。

十,習(xí)題?

1,C語(yǔ)言文件概念

第1題:以下敘述中正確的是( )。

A、當(dāng)對(duì)文件的讀(寫(xiě))操作完成之后,必須將它關(guān)閉,否則可能導(dǎo)致數(shù)據(jù)丟失

B、打開(kāi)一個(gè)已存在的文件并進(jìn)行了寫(xiě)操作后,原有文件中的全部數(shù)據(jù)必定被覆蓋

C、在一個(gè)程序中當(dāng)對(duì)文件進(jìn)行了寫(xiě)操作后,必須先關(guān)閉該文件然后再打開(kāi),才能讀到第1個(gè)數(shù)據(jù)

D、c語(yǔ)言中的文件是流式文件,因此只能順序存取數(shù)據(jù)

參考解析:【解析】B)選項(xiàng)中打開(kāi)一個(gè)已存在的文件并進(jìn)行了寫(xiě)操作后,原有文件中的全部數(shù)據(jù)不一定被覆蓋,也可以對(duì)源文件進(jìn)行追加操作等。C)選項(xiàng)中在一個(gè)程序中當(dāng)對(duì)文件進(jìn)行了寫(xiě)操作后,不用先關(guān)閉該文件然后再打開(kāi),才能讀到第1個(gè)數(shù)據(jù),可以用fseek()函數(shù)進(jìn)行重新定位即可。D)選項(xiàng)中,c語(yǔ)言中的文件可以進(jìn)行隨機(jī)讀寫(xiě)。

第2題:下列關(guān)于c語(yǔ)言文件的敘述中正確的是
A、文件由一系列數(shù)據(jù)依次排列組成,只能構(gòu)成二進(jìn)制文件

B、文件由結(jié)構(gòu)序列組成,可以構(gòu)成二進(jìn)制文件或文本文件

C、文件由數(shù)據(jù)序列組成,可以構(gòu)成二進(jìn)制文件或文本文件

D、文件由字符序列組成,其類型只能是文本文件

參考解析:【解析】本題考查文件的概念,文件是由數(shù)據(jù)序列組成,可以構(gòu)成二進(jìn)制文件或文本文件,所以答案為C選項(xiàng)。
?

第3題:下面選項(xiàng)中關(guān)于"文件指針"概念的敘述正確的是
A、文件指針是程序中用FILE定義的指針變量

B、文件指針就是文件位置指針,表示當(dāng)前讀寫(xiě)數(shù)據(jù)的位囂

C、文件指針指向文件在計(jì)算機(jī)中的存儲(chǔ)位置

D、把文件指針傳給fscanf函數(shù),就可以向文本文件中寫(xiě)入任意的字符

參考解析:【解析】在C語(yǔ)言中用一個(gè)指針變量指向一個(gè)文件,這個(gè)指針?lè)Q為文件指針。通過(guò)文件指針就可對(duì)它所指的文件進(jìn)行各種操作。文件指針不是文件位置指針,所以BC選項(xiàng)錯(cuò)誤,D選項(xiàng)中不可以寫(xiě)入任意的字符。
?

第4題:以下選項(xiàng)中敘述正確的是
A、文件指針是指針類型的變量

B、文件指針可同時(shí)指向不同文件

C、文件指針的值是文件在計(jì)算機(jī)磁盤(pán)中的路徑信息

D、調(diào)用fscanf涵數(shù)可以向文本文件中寫(xiě)入任意字符

參考解析:【解析】所謂文件指針,實(shí)際上是指向一個(gè)結(jié)構(gòu)體類型的指針變量,這個(gè)結(jié)構(gòu)體中包含有文件的一些信息,如緩沖區(qū)的地址,在緩沖區(qū)中當(dāng)前存取的字符的位置,對(duì)文件是“讀""還是“寫(xiě)”,是否出錯(cuò),是否已經(jīng)遇到文件結(jié)束標(biāo)志等信息。文件指釬本身是指針類型的變量,A選項(xiàng)正確。一個(gè)指釬在同一時(shí)間只能指向一個(gè)文件,B選項(xiàng)錯(cuò)誤。文件指針是指針變量,存儲(chǔ)的是文件緩存區(qū)音地址,而不是文件在計(jì)算機(jī)磁盤(pán)中的路徑信息,C選項(xiàng)錯(cuò)誤。fscanf函數(shù)從文本文件中按格式讀入到程序中,而不是向文本文件中寫(xiě)入數(shù)據(jù),D選項(xiàng)錯(cuò)誤。

第5題:以下敘述正確的是
A、文件指針是指針類型的變量

B、文件指針變量的值是文件的當(dāng)前讀取位器

C、文件指針變量的值是文件的當(dāng)前讀取位置

D、調(diào)用fscanf函丞|數(shù)能向所有類型的文件中寫(xiě)入任意字符

參考解析:【解析】文件指針指向的是文件緩沖區(qū),而不是文件本身位置,因此BC選項(xiàng)錯(cuò)誤;fscanfi)函數(shù)作用是從指定的文件中格式化讀數(shù)據(jù),讀取數(shù)據(jù)類型由格式控制符決定,D選項(xiàng)錯(cuò)誤,答案為A選項(xiàng)。
?

第6題:以下敘述正確的是
A、表達(dá)式sizeof(FILE*) == sizeof(int*)的值為真

B、文件指針的值是一個(gè)整數(shù),它的值一定小于文件字節(jié)數(shù)

C、文件指針的值是所指文件的當(dāng)前讀取位置

D、使用fscanf函數(shù)可以向任意類型的文件中寫(xiě)入任意數(shù)量的字符

參考解析∶【解析】sizeof(FILE*)=4,因?yàn)閒ile*為指針,指針的大小4,sizeof(int*)=4理由同前面。文件指針的值是地址,是一個(gè)16進(jìn)制的數(shù),它的值不一定小于文件字節(jié)數(shù),因此選項(xiàng)B錯(cuò)誤。文件指針是所指文件的當(dāng)前讀取位置,而不是文件指針的值因此選項(xiàng)C錯(cuò)誤。intfscanf(FILE*stream.constchar*format, [argument.]):
fscanf函數(shù)可以向任意類型的文件,寫(xiě)入任意數(shù)量不能超過(guò)系統(tǒng)的緩沖區(qū),寫(xiě)文件先寫(xiě)入緩沖區(qū),最后一起寫(xiě)入文件,因此選項(xiàng)D錯(cuò)誤。答案為A選項(xiàng)
?

第7題:以下關(guān)于c語(yǔ)言文件的敘述中正確的是
A、文件由數(shù)據(jù)序列組成,其類型可以為二進(jìn)制文件或文本文件

B、文件由記錄序列組成,其類型可以為二進(jìn)制文件或文本文件

C、文件由字符序列組成,其類型可以為二進(jìn)制文件或文本文件

D、文件由數(shù)據(jù)序列組成,其類型只能是二進(jìn)制文件

參考解析︰【解析】C語(yǔ)言文件是指一組相關(guān)數(shù)據(jù)的有序集合,從文件編碼的方式看,文件可分為ASCII碼文件和二進(jìn)制文件兩種,其中ASCII文件也稱為文本文件,所以文件由數(shù)據(jù)序列組成,類型可以為二進(jìn)制文件或文本文件,選項(xiàng)A正確。
?

2,文件類型指針

第1題:以下敘述中正確的是()。
A、文件指針是一種特殊的指針類型變量

B、文件指針的值等于文件當(dāng)前讀寫(xiě)位置,以字節(jié)為單位

C、文件指針的值等于文件在計(jì)算機(jī)硬盤(pán)中的存儲(chǔ)位置

D、調(diào)用fscanf涵數(shù)只能向文本文件中寫(xiě)入任意字符

參考解析:【解析】文件指針實(shí)際上是指向一個(gè)結(jié)構(gòu)體類型的指針,這個(gè)結(jié)構(gòu)體中包含有諸如:緩沖區(qū)的地址、在緩沖區(qū)中當(dāng)前存取的字符的位置、對(duì)文件是“讀"還是“寫(xiě)”、是否出錯(cuò)、是否已經(jīng)遇到文件結(jié)束標(biāo)志等信息,選項(xiàng)A正確,選項(xiàng)B、c錯(cuò)誤;fscanf)函數(shù)只能從文本文件中輸入數(shù)據(jù)到內(nèi)存,選項(xiàng)D錯(cuò)誤;本題答案為A。
?

第2題:下面說(shuō)法正確的是()。
A、文件指針的值是文件的長(zhǎng)度(以字節(jié)為單位)

B、文件指針的值是文件名字符串存放的首地址

C、文件指針是指針類型的變量

D、fscanf函數(shù)可以向任意指定文件中寫(xiě)入任意指定字符

參考解析:【解析】文件指針實(shí)際上是指向一個(gè)結(jié)構(gòu)體類型的指針,這個(gè)結(jié)構(gòu)體中包含有諸如:緩沖區(qū)的地址、在緩沖區(qū)中當(dāng)前存取的字符的位置、對(duì)文件是“讀還是“寫(xiě)"、是否出錯(cuò)、是否已經(jīng)遇到文件結(jié)束標(biāo)志等信息,選項(xiàng)C正確,選項(xiàng)A、B錯(cuò)誤;fscanf()函數(shù)只能從文本文件中輸入數(shù)據(jù)到內(nèi)存,選項(xiàng)D錯(cuò)誤;本題答案為C。

第3題:以下敘述中正確的是
A、C語(yǔ)言中的文件是流式文件,因此只能順序存取數(shù)據(jù)

B、打開(kāi)一個(gè)已存在的文件并進(jìn)行了寫(xiě)操作后,原有文件中的全部數(shù)據(jù)必定被覆蓋

C、在一個(gè)程序中,若對(duì)文件進(jìn)行了寫(xiě)操作,則必須先關(guān)i閉該文件然后再打開(kāi),才能讀到第1個(gè)數(shù)據(jù)

D、對(duì)文件的讀(寫(xiě))操作后,必須將它關(guān)閉,否則可能會(huì)導(dǎo)致數(shù)據(jù)丟失

參考解析:【解析】在C語(yǔ)言中,有兩種對(duì)文件的存取方式:順序存取和直接存取。如果以"a"”的方式對(duì)已打開(kāi)的文件進(jìn)行寫(xiě)操作后,則原文件中內(nèi)容將保存,新的數(shù)據(jù)寫(xiě)在原有內(nèi)容之后。如果以“a+”的方式為讀和寫(xiě)操作而打開(kāi)文件,則可以對(duì)文件進(jìn)行讀/寫(xiě),而且在讀和寫(xiě)操作之間不必關(guān)閉文件??梢詮馁I(mǎi)開(kāi)始讀。當(dāng)對(duì)文件的讀(寫(xiě))操作完成之后,必須將它關(guān)閉。本題答案為D選項(xiàng)。
?

第4題:下面說(shuō)法正確的是
A、文件指針指向文件當(dāng)前正在處理的字節(jié)地址

B、文件指針變量中保存的是所指文件包含的字符數(shù)

C、文件指針變量中的值是個(gè)常量,不能修改

D、文件指針變量的類型是FILE*

參考解析:【解析】在C語(yǔ)言中用一個(gè)指針變量指向一個(gè)文件,這個(gè)指針?lè)Q為文件指針。通過(guò)文件指針就可對(duì)它所指的文件進(jìn)行各種操作。文件指針變量的類型是FILE*。本題答案為D選項(xiàng)。

第5題:下面說(shuō)法正確的是
A、文件指針變量中保存的是文件在硬盤(pán)上的位置信息

B、文件指針變量的類型是指針類型

C、文件指針變量指向文件名字符串的內(nèi)存地址

D、文件指針指向文件當(dāng)前正在處理的字節(jié)地址

參考解析:【解析】在C語(yǔ)言中用一個(gè)指針變量指向一個(gè)文件,這個(gè)指針?lè)Q為文件指針。通過(guò)文件指針就可對(duì)它所指的文件進(jìn)行各種操作。這個(gè)指針是用來(lái)存放文件的首地址。這個(gè)指針是專門(mén)用來(lái)指向文件的。文件指針變量的類型是指針類型。本題答案為B選項(xiàng)。

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

第1題:設(shè)文件指針fp已定義,執(zhí)行語(yǔ)句fp=fopen("file" "w");后,以下針對(duì)文本文件file操作敘述的選項(xiàng)中正確的是 第1題:設(shè)文件指針FP已定義,執(zhí)行語(yǔ)句fp=fopen(文件“w”);后,以下針對(duì)文本文件文件操作敘述的選項(xiàng)中正確的是
A、只能寫(xiě)不能讀 、只能寫(xiě)不能讀

B、寫(xiě)操作結(jié)束后可以從頭開(kāi)始讀

C、可以在原有內(nèi)容后追加寫(xiě)

D、可以隨意讀和寫(xiě)
參考解析:【解析】考查文件操作函數(shù)fopen的基礎(chǔ)知識(shí),以"w"方式打開(kāi)文件,只能寫(xiě)不能讀。?

第2題:以下關(guān)于fclose(fp)函數(shù)的敘述正確的是 第2題:以下關(guān)于flose(FP)函數(shù)的敘述正確的是
A、當(dāng)程序中對(duì)文件的所有寫(xiě)操作完成之后,必須調(diào)用fclose(fp)函數(shù)關(guān)閉文件

B、當(dāng)程序中對(duì)文件的所有寫(xiě)操作完成之后,不一定要調(diào)用flose(FP)函數(shù)關(guān)閉文件

C 、只有對(duì)文件進(jìn)行輸入操作之后,才需要調(diào)用flose(FP)函數(shù)關(guān)閉文件

D、只有對(duì)文件進(jìn)行輸出操作之后,才能調(diào)用fclose(fp)函數(shù)關(guān)閉文件?

參考解析︰【解析】對(duì)一個(gè)文件操作完成后,要將該文件關(guān)閉,“關(guān)閉′就是使文件指針變量不再指向該文件。程序編寫(xiě)者應(yīng)該在程序終止之前關(guān)閉所有文件,如果不關(guān)閉,文件將會(huì)丟失數(shù)據(jù)。因?yàn)?,在向文件?xiě)數(shù)據(jù)時(shí),是先將數(shù)據(jù)輸出到緩沖反,待緩沖區(qū)充滿后才正式輸出給文件。如果當(dāng)數(shù)據(jù)未充滿緩沖區(qū)而程序結(jié)束運(yùn)行,就會(huì)將緩沖區(qū)中的數(shù)據(jù)丟失。用fclose函數(shù)關(guān)閉文件,可以避免這個(gè)問(wèn)題,它先把緩沖區(qū)中的數(shù)據(jù)輸出到磁盤(pán)文件,然后才釋放文件指針變量。所以對(duì)文件的所有寫(xiě)操作完成之后必須要關(guān)閉文件,A選項(xiàng)正確,B選項(xiàng)錯(cuò)誤。只要對(duì)文件進(jìn)行操作后,都要調(diào)用fclose文件關(guān)閉文件,C、D進(jìn)項(xiàng)錯(cuò)誤。?

參考解析∶【解析】fopen函賽數(shù)以一定方式打開(kāi)指定文件,返回一個(gè)指向文件的文件指針,如果不能實(shí)現(xiàn)打開(kāi)指定文件的操作,則返回一個(gè)空指針NULL。如果指定文件不存在則創(chuàng)建一個(gè)文件名為指定文件名的新文件,然后打開(kāi)它。在指定文件有錯(cuò)誤或者指定文件不存在卻不能創(chuàng)建新文件的情況下,打開(kāi)文件操作錯(cuò)誤,返回空指針。本題程序中,文件test.txt不存在,但無(wú)其他異常,表示可以建立新文件,命名為test.txt,C洗項(xiàng)敘述正確,并以只寫(xiě)方式打開(kāi)它,D選項(xiàng)敘述正確,返回指向?yàn)?zāi)件的指釬,if條件不成立,輸出“成功打開(kāi)文件!”,B選項(xiàng)敘述正確,A選項(xiàng)敘述錯(cuò)誤。所以選擇A選項(xiàng)。

?參考解析︰【解析】fopen函數(shù)以一定方式打開(kāi)指定文件,返回一個(gè)指向文件的文件指針,如果不能實(shí)現(xiàn)打開(kāi)指定文件的操作,則返回一個(gè)空指針NULL。如果指定文件不存在則創(chuàng)建一個(gè)文件名為指定文件名的新文件,然后打開(kāi)它。在指定文件有錯(cuò)誤或者指定文件不存在卻不能創(chuàng)建新文件的情況下,打開(kāi)文件操作錯(cuò)誤,返回空指針。本題程序中,文件test.txt不存在,但無(wú)其他異常,表示可以建立新文件,命名為test.txt,C選項(xiàng)敘述正確,并以只寫(xiě)方式打開(kāi)它,D選項(xiàng)敘述正確,返回指向文件的指釬,if條件不成立,輸出“成功打開(kāi)文件!”,B選項(xiàng)敘述正確,A選項(xiàng)敘述錯(cuò)誤。所以選擇A選項(xiàng)。

參考解析︰【解析】fopen函藥以一定方式打開(kāi)指定文件,返回一個(gè)指向文件的文件指針,如果不能實(shí)現(xiàn)打開(kāi)指定文件的操作,則返回一個(gè)空指針NULL。如果指定文件不存在則創(chuàng)建一個(gè)文件名為指定文件名的新文件,然后打開(kāi)它。在指定文件有錯(cuò)誤或者指定文件不存在卻不能創(chuàng)建新文件的情況下,打開(kāi)文件操作錯(cuò)誤,返回空指針。本題程序中,文件test.txt已存在,程序運(yùn)行后,文件test.txt中的原有內(nèi)容將全部消失,A選項(xiàng)正確。文件原本就存在,不會(huì)導(dǎo)致程序出錯(cuò),會(huì)按照指定的方式打開(kāi)文件,B選項(xiàng)錯(cuò)誤。對(duì)文件進(jìn)行寫(xiě)操作,只能對(duì)指針指向的位置內(nèi)容進(jìn)行寫(xiě)操作,不能隨機(jī)讀寫(xiě),C選項(xiàng)錯(cuò)誤。對(duì)文件test.txt寫(xiě)入的內(nèi)容寫(xiě)到指針?biāo)赶虻奈皇穑皇翘砑釉谖募膊?,D洗項(xiàng)錯(cuò)誤。

4,文件的讀寫(xiě)

第1題:讀取二進(jìn)制文件的函數(shù)調(diào)用形式為:fread(buffer,size,count,fp);,其中buffer代表的是()。 第1題:讀取二進(jìn)制文件的函數(shù)調(diào)用形式為:Fread(緩沖區(qū)、大小、計(jì)數(shù)、FP);其中緩沖區(qū)代表的是()。
A、一個(gè)內(nèi)存塊的字節(jié)數(shù) 、一個(gè)內(nèi)存塊的字節(jié)數(shù)

B、一個(gè)整型變量,代表待讀取的數(shù)據(jù)的字節(jié)數(shù)?

C、一個(gè)文件指針,指向待讀取的文件?

D、一個(gè)內(nèi)存塊的首地址,代表讀入數(shù)據(jù)存放的地址

參考解析:【解析】fread(void *buffer,size t size,size t count,F(xiàn)ILE *stream);功能是從一個(gè)文件流中讀數(shù)據(jù),讀取count個(gè)元素

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/121545.html

相關(guān)文章

  • 萬(wàn)字15張導(dǎo)圖Java自學(xué)路線,小白零基礎(chǔ)入門(mén),程序員進(jìn)階,收藏這篇就夠了

    摘要:本文收錄于技術(shù)專家修煉文中配套資料合集路線導(dǎo)圖高清源文件點(diǎn)擊跳轉(zhuǎn)到文末點(diǎn)擊底部卡片回復(fù)資料領(lǐng)取哈嘍,大家好,我是一條最近粉絲問(wèn)我有沒(méi)有自學(xué)路線,有了方向才能按圖索驥,事半功倍。 ...

    suosuopuo 評(píng)論0 收藏0
  • ??爆肝十二萬(wàn)字《python從零到精通教程》,從零教你變大佬??(建議收藏)

    文章目錄 強(qiáng)烈推薦系列教程,建議學(xué)起來(lái)??! 一.pycharm下載安裝二.python下載安裝三.pycharm上配置python四.配置鏡像源讓你下載嗖嗖的快4.1pycharm內(nèi)部配置 4.2手動(dòng)添加鏡像源4.3永久配置鏡像源 五.插件安裝(比如漢化?)5.1自動(dòng)補(bǔ)碼神器第一款5.2漢化pycharm5.3其它插件 六.美女背景七.自定義腳本開(kāi)頭八、這個(gè)前言一定要看九、pyt...

    booster 評(píng)論0 收藏0
  • 前端基礎(chǔ)進(jìn)階(十三):透徹掌握Promise的使用,讀這篇就夠了

    摘要:在對(duì)象的構(gòu)造函數(shù)中,將一個(gè)函數(shù)作為第一個(gè)參數(shù)。二對(duì)象中的方法,可以接收構(gòu)造函數(shù)中處理的狀態(tài)變化,并分別對(duì)應(yīng)執(zhí)行。 showImg(https://segmentfault.com/img/remote/1460000008932857); Promise的重要性我認(rèn)為我沒(méi)有必要多講,概括起來(lái)說(shuō)就是必須得掌握,而且還要掌握透徹。這篇文章的開(kāi)頭,主要跟大家分析一下,為什么會(huì)有Promise...

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

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

0條評(píng)論

閱讀需要支付1元查看
<