资讯专栏INFORMATION COLUMN

❤️学懂C语言文件操作读这篇就够了(万字总结,附习题)❤️

Genng / 4241人阅读

目录

​​​

一,写在前面

二,为什么使用文件

1,原因

2,数据流

3,缓冲区(Buffer)

4,C语言中带缓冲区的文件处理

5,文件类型

6,文件存取方式

三,什么是文件

1,程序文件

 2,数据文件

3,文件名

四,文件的打开和关闭 

1,文件指针

 2,文件的打开和关闭

五,文件的顺序读写

1,功能

2,代码实现

六,文件的随机读写

1,fseek

2,ftell

3,rewind

七,文本文件和二进制文件

八,文件读取结束的判定

1 被错误使用的feof

九,文件缓冲区

十,习题 

1,C语言文件概念

2,文件类型指针

3,文件的打开与关闭

4,文件的读写


一,写在前面

本文是在学校和教学视频下总结的自己亿点点心得,文章篇幅有一点长,如果读者想要更深入的了解C语言文件操作,文件操作在C语言中比较独立,没那么重要,建议上手练一练,学编程不练习,不敲代码进步会很慢,(保姆级教学)最后,如果你感觉本文写的不错,求收藏,求点赞,求评论爆肝不易,你的三连是我学习最大的动力!!!

二,为什么使用文件

1,原因

这就涉及到了数据持久化的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据 库等方式。 使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。

2,数据流

指程序与数据的交互是以流的形式进行的。进行C语言文件的存取时,都会先进行“打开文件”操作,这个操作就是在打开数据流,而“关闭文件”操作就是关闭数据流。

3,缓冲区(Buffer)

指在程序执行时,所提供的额外内存,可用来暂时存放做准备执行的数据。它的设置是为了提高存取效率,因为内存的存取速度比磁盘驱动器快得多。

4,C语言中带缓冲区的文件处理

C语言的文件处理功能依据系统是否设置“缓冲区”分为两种:一种是设置缓冲区,另一种是不设置缓冲区。由于不设置缓冲区的文件处理方式,必须使用较低级的I/O函数(包含在头文件io.h和fcntl.h中)来直接对磁盘存取,这种方式的存取速度慢,并且由于不是C的标准函数,跨平台操作时容易出问题。下面只介绍第一种处理方式,即设置缓冲区的文件处理方式:

当使用标准I/O函数(包含在头文件stdio.h中)时,系统会自动设置缓冲区,并通过数据流来读写文件。当进行文件读取时,不会直接对磁盘进行读取,而是先打开数据流,将磁盘上的文件信息拷贝到缓冲区内,然后程序再从缓冲区中读取所需数据,如下图所示:

事实上,当写入文件时,并不会马上写入磁盘中,而是先写入缓冲区,只有在缓冲区已满或“关闭文件”时,才会将数据写入磁盘,如下图所示。

5,文件类型

分为文本文件和二进制文件两种。

文本文件是以字符编码的方式进行保存的。二进制文件将内存中数据原封不至文件中,适用于非字符为主的数据。如果以记事本打开,只会看到一堆乱码。

其实,除了文本文件外,所有的数据都可以算是二进制文件。二进制文件的优点在于存取速度快,占用空间小,以及可随机存取数据。

6,文件存取方式

包括顺序存取方式和随机存取方式两种。

顺序读取也就是从上往下,一笔一笔读取文件的内容。保存数据时,将数据附加在文件的末尾。这种存取方式常用于文本文件,而被存取的文件则称为顺序文件。

随机存取方式多半以二进制文件为主。它会以一个完整的单位来进行数据的读取和写入,通常以结构为单位。

三,什么是文件

磁盘上的文件是文件。 但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。

1,程序文件

包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境 后缀为.exe)。

 2,数据文件

文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文 件,或者输出内容的文件。

其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理 的就是磁盘上文件。

3,文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。

文件名包含3部分:文件路径+文件名主干+文件后缀

例如: c:/code/test.txt

为了方便起见,文件标识常被称为文件名。

四,文件的打开和关闭 

1,文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名 字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统 声明的,取名FILE.

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

不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。

每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息, 使用者不必关心细节。

一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。

下面我们可以创建一个FILE*的指针变量:

FILE* pf;//文件指针变量

定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变 量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联 的文件。

 2,文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。

在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了 指针和文件的关系。

ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件。

//打开文件FILE * fopen ( const char * filename, const char * mode );//关闭文件int fclose ( FILE * stream );
文件使用方式                      含义如果指定文件不存在
“r”(只读)为了输入数据,打开一个已经存在的文本文件出错
“w”(只写)为了输出数据,打开一个文本文件建立一个新的文件
“a”(追加)向文本文件尾添加数据出错
“rb”(只读)为了输入数据,打开一个二进制文件出错
“wb”(只写)为了输出数据,打开一个二进制文件建立一个新的文件
“ab”(追加)为了输出数据,打开一个二进制文件出错
“r+”(读写)为了读和写,打开一个文本文件出错
“w+”(读写)为了读和写,建议一个新的文件建立一个新的文件
“a+”(读写)打开一个文件,在文件尾进行读写建立一个新的文件
“rb+”(读写)为了读和写打开一个二进制文件出错
“wb+”(读写)为了读和写,新建一个新的二进制文件建立一个新的文件
“ab+”(读写)打开一个二进制文件,在文件尾进行读和写建立一个新的文件

五,文件的顺序读写

1,功能

功能函数名适用于
字符输入函数fgetc所有输入流
字符输出函数fputc所有输入流
文本行输入函数gets所有输入流
文本行输出函数fputs所有输入流
格式化输入函数fscanf所有输入流
格式化输出函数fprintf所有输入流
二进制输入fread文件
二进制输出fwrite文件

从流(fgetc、fgetwc)或stdin(fgetchar、fgetchar)中读取字符

 

将字符写入流(fputc,fputwc)或标准输出(_fputchar,_fputwchar)。

 

 从stdin流中获取一行。

 将字符串写入流。

从流中读取格式化数据。

 

 将格式化数据打印到流。

从流中读取数据。

 

将数据写入流。 

2,代码实现

 首先在桌面上创建一个321.txt文件,如上图

int main(){	//打开文件	FILE* pf = fopen("C://Users//12556//Desktop//321.txt", "r");	if (pf == NULL)	{		perror("fopen");		return -1;	}	//读文件	// 	//关闭文件	fclose(pf);	pf = NULL;	return 0;}

无错误,打开成功

int main(){	fputc("b", stdout);//putchar  printf("%c", ch);	fputc("i", stdout);	fputc("t", stdout);	return 0;}
int main(){	//打开文件	FILE* pf = fopen("C://Users//12556//Desktop//321.txt", "w");	if (pf == NULL)	{		perror("fopen");		return -1;	}	    //写文件	fputc("b", pf);	fputc("i", pf);	fputc("t", pf);	//关闭文件	fclose(pf);	pf = NULL;	return 0;}

 写入成功

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	//关闭文件	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;	}	//写文件	//写一行数据	fputs("hello world/n", pf);	fputs("hello bit/n", pf);	//关闭文件	fclose(pf);	pf = NULL;}

在C语言文件下,我们找到data.txt文件,打开发现输入成功

 

int main(){	FILE* pf = fopen("data.txt", "r");	if (NULL == pf)	{		perror("fopen");		return -1;	}	//读文件	//读一行数据	char arr[20] = { 0 };	fgets(arr, 20, pf);	printf("%s/n", arr);	fgets(arr, 20, pf);	printf("%s/n", arr);	//关闭文件	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;	}	//写文件	fprintf(pf, "%d %lf", s.n, s.d);	//关闭文件	fclose(pf);	pf = NULL;}

 

写入成功

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);	//关闭文件	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;	}	//写文件 - 二进制的方式写	fwrite(&s, sizeof(s), 1, pf);	//关闭文件	fclose(pf);	pf = NULL;}

文件格式不同,但计算机是以二进制表示

//二进制的形式读//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;	}	//读文件 - 二进制的方式读	fread(&s, sizeof(struct S), 1, pf);	//打印	printf("%d %lf %s/n", s.n, s.d, s.name);	//100 3.140000 zhangsan		//关闭文件	fclose(pf);	pf = NULL;}

 二进制阅读成功

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" };	//把一个格式化的数据转换成字符串	sprintf(arr, "%d %lf %s", s.n, s.d, s.name);	//打印	printf("%s/n", arr);		//从arr中的字符串中提取出一个格式化的数据	sscanf(arr, "%d %lf %s", &(tmp.n), &(tmp.d), tmp.name);	//打印	printf("%d %lf %s/n", tmp.n, tmp.d, tmp.name);	return 0;}

 格式化字符串成功

六,文件的随机读写

在C语言文件下创建data.txt.

 添加abcdef

1,fseek

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

根据文件指针的位置和偏移量来定位文件指针

int main(){	//打开文件		FILE *pf = fopen("data.txt", "r");	if (NULL == pf)	{		perror("fopen");		return -1;	}	//随机读写	/*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 );

返回文件指针相对于起始位置的偏移量

int main(){	//打开文件	FILE* pf = fopen("data.txt", "r");	if (NULL == pf)	{		perror("fopen");		return -1;	}	//随机读写	/*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(){	//打开文件	FILE* pf = fopen("data.txt", "r");	if (NULL == pf)	{		perror("fopen");		return -1;	}	//随机读写	/*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;}

七,文本文件和二进制文件

根据数据的组织形式,数据文件被称为文本文件或者二进制文件。 数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。 如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件

一个数据在内存中是怎么存储的呢? 字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。 如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而 二进制形式输出,则在磁盘上只占4个字节(VS2019测试)。

 在C语言文件下创建321.txt

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

打开321.txt,发现无法识别,以二进制表现

 我们在VS里面查找

 

 

 16进制表示

八,文件读取结束的判定

1 被错误使用的feof

牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。 而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束

1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )

例如: fgetc 判断是否为 EOF . fgets 判断返回值是否为 NULL .

2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。

例如: fread判断返回值是否小于实际要读的个数。

#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 当读取失败的时候或者遇到文件结束的时候,都会返回EOF	while ((c = fgetc(fp)) != EOF) // 标准C I/O读取文件循环	{		putchar(c);	}	//判断是什么原因结束的	if (ferror(fp))		puts("I/O error when reading");	else if (feof(fp))		puts("End of file reached successfully");	fclose(fp);}

以二进制文件为例

#include enum { SIZE = 5 };int main(void){	double a[SIZE] = { 1.,2.,3.,4.,5. };	FILE* fp = fopen("test.bin", "wb"); // 必须用二进制模式	fwrite(a, sizeof * a, SIZE, fp); // 写 double 的数组	fclose(fp);	double b[SIZE];	fp = fopen("test.bin", "rb");	size_t ret_code = fread(b, sizeof * b, SIZE, fp); // 读 double 的数组	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的用途:是文件读取结束了,判断是不是遇到文件末尾而结束的

ferror的用途:文件读取结束了,判读是不是遇到错误而结束

九,文件缓冲区

ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序 中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装 满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓 冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根 据C编译系统决定的。

#include #include //VS2013 WIN10环境测试int main(){	FILE* pf = fopen("test.txt", "w");	fputs("abcdef", pf);//先将代码放在输出缓冲区	printf("睡眠10秒-已经写数据了,打开test.txt文件,发现文件没有内容/n");	Sleep(10000);	printf("刷新缓冲区/n");	fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到文件(磁盘)	//注:fflush 在高版本的VS上不能使用了	printf("再睡眠10秒-此时,再次打开test.txt文件,文件有内容了/n");	Sleep(10000);	fclose(pf);	//注:fclose在关闭文件的时候,也会刷新缓冲区	pf = NULL;	return 0;}

这里可以得出一个结论: 因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文 件。 如果不做,可能导致读写文件的问题。

十,习题 

1,C语言文件概念

第1题:以下叙述中正确的是( )。

A、当对文件的读(写)操作完成之后,必须将它关闭,否则可能导致数据丢失

B、打开一个已存在的文件并进行了写操作后,原有文件中的全部数据必定被覆盖

C、在一个程序中当对文件进行了写操作后,必须先关闭该文件然后再打开,才能读到第1个数据

D、c语言中的文件是流式文件,因此只能顺序存取数据

参考解析:【解析】B)选项中打开一个已存在的文件并进行了写操作后,原有文件中的全部数据不一定被覆盖,也可以对源文件进行追加操作等。C)选项中在一个程序中当对文件进行了写操作后,不用先关闭该文件然后再打开,才能读到第1个数据,可以用fseek()函数进行重新定位即可。D)选项中,c语言中的文件可以进行随机读写。

第2题:下列关于c语言文件的叙述中正确的是
A、文件由一系列数据依次排列组成,只能构成二进制文件

B、文件由结构序列组成,可以构成二进制文件或文本文件

C、文件由数据序列组成,可以构成二进制文件或文本文件

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

参考解析:【解析】本题考查文件的概念,文件是由数据序列组成,可以构成二进制文件或文本文件,所以答案为C选项。
 

第3题:下面选项中关于"文件指针"概念的叙述正确的是
A、文件指针是程序中用FILE定义的指针变量

B、文件指针就是文件位置指针,表示当前读写数据的位嚣

C、文件指针指向文件在计算机中的存储位置

D、把文件指针传给fscanf函数,就可以向文本文件中写入任意的字符

参考解析:【解析】在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。文件指针不是文件位置指针,所以BC选项错误,D选项中不可以写入任意的字符。
 

第4题:以下选项中叙述正确的是
A、文件指针是指针类型的变量

B、文件指针可同时指向不同文件

C、文件指针的值是文件在计算机磁盘中的路径信息

D、调用fscanf涵数可以向文本文件中写入任意字符

参考解析:【解析】所谓文件指针,实际上是指向一个结构体类型的指针变量,这个结构体中包含有文件的一些信息,如缓冲区的地址,在缓冲区中当前存取的字符的位置,对文件是“读""还是“写”,是否出错,是否已经遇到文件结束标志等信息。文件指钎本身是指针类型的变量,A选项正确。一个指钎在同一时间只能指向一个文件,B选项错误。文件指针是指针变量,存储的是文件缓存区音地址,而不是文件在计算机磁盘中的路径信息,C选项错误。fscanf函数从文本文件中按格式读入到程序中,而不是向文本文件中写入数据,D选项错误。

第5题:以下叙述正确的是
A、文件指针是指针类型的变量

B、文件指针变量的值是文件的当前读取位器

C、文件指针变量的值是文件的当前读取位置

D、调用fscanf函丞|数能向所有类型的文件中写入任意字符

参考解析:【解析】文件指针指向的是文件缓冲区,而不是文件本身位置,因此BC选项错误;fscanfi)函数作用是从指定的文件中格式化读数据,读取数据类型由格式控制符决定,D选项错误,答案为A选项。
 

第6题:以下叙述正确的是
A、表达式sizeof(FILE*) == sizeof(int*)的值为真

B、文件指针的值是一个整数,它的值一定小于文件字节数

C、文件指针的值是所指文件的当前读取位置

D、使用fscanf函数可以向任意类型的文件中写入任意数量的字符

参考解析∶【解析】sizeof(FILE*)=4,因为file*为指针,指针的大小4,sizeof(int*)=4理由同前面。文件指针的值是地址,是一个16进制的数,它的值不一定小于文件字节数,因此选项B错误。文件指针是所指文件的当前读取位置,而不是文件指针的值因此选项C错误。intfscanf(FILE*stream.constchar*format, [argument.]):
fscanf函数可以向任意类型的文件,写入任意数量不能超过系统的缓冲区,写文件先写入缓冲区,最后一起写入文件,因此选项D错误。答案为A选项
 

第7题:以下关于c语言文件的叙述中正确的是
A、文件由数据序列组成,其类型可以为二进制文件或文本文件

B、文件由记录序列组成,其类型可以为二进制文件或文本文件

C、文件由字符序列组成,其类型可以为二进制文件或文本文件

D、文件由数据序列组成,其类型只能是二进制文件

参考解析︰【解析】C语言文件是指一组相关数据的有序集合,从文件编码的方式看,文件可分为ASCII码文件和二进制文件两种,其中ASCII文件也称为文本文件,所以文件由数据序列组成,类型可以为二进制文件或文本文件,选项A正确。
 

2,文件类型指针

第1题:以下叙述中正确的是()。
A、文件指针是一种特殊的指针类型变量

B、文件指针的值等于文件当前读写位置,以字节为单位

C、文件指针的值等于文件在计算机硬盘中的存储位置

D、调用fscanf涵数只能向文本文件中写入任意字符

参考解析:【解析】文件指针实际上是指向一个结构体类型的指针,这个结构体中包含有诸如:缓冲区的地址、在缓冲区中当前存取的字符的位置、对文件是“读"还是“写”、是否出错、是否已经遇到文件结束标志等信息,选项A正确,选项B、c错误;fscanf)函数只能从文本文件中输入数据到内存,选项D错误;本题答案为A。
 

第2题:下面说法正确的是()。
A、文件指针的值是文件的长度(以字节为单位)

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

C、文件指针是指针类型的变量

D、fscanf函数可以向任意指定文件中写入任意指定字符

参考解析:【解析】文件指针实际上是指向一个结构体类型的指针,这个结构体中包含有诸如:缓冲区的地址、在缓冲区中当前存取的字符的位置、对文件是“读还是“写"、是否出错、是否已经遇到文件结束标志等信息,选项C正确,选项A、B错误;fscanf()函数只能从文本文件中输入数据到内存,选项D错误;本题答案为C。

第3题:以下叙述中正确的是
A、C语言中的文件是流式文件,因此只能顺序存取数据

B、打开一个已存在的文件并进行了写操作后,原有文件中的全部数据必定被覆盖

C、在一个程序中,若对文件进行了写操作,则必须先关i闭该文件然后再打开,才能读到第1个数据

D、对文件的读(写)操作后,必须将它关闭,否则可能会导致数据丢失

参考解析:【解析】在C语言中,有两种对文件的存取方式:顺序存取和直接存取。如果以"a"”的方式对已打开的文件进行写操作后,则原文件中内容将保存,新的数据写在原有内容之后。如果以“a+”的方式为读和写操作而打开文件,则可以对文件进行读/写,而且在读和写操作之间不必关闭文件。可以从买开始读。当对文件的读(写)操作完成之后,必须将它关闭。本题答案为D选项。
 

第4题:下面说法正确的是
A、文件指针指向文件当前正在处理的字节地址

B、文件指针变量中保存的是所指文件包含的字符数

C、文件指针变量中的值是个常量,不能修改

D、文件指针变量的类型是FILE*

参考解析:【解析】在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。文件指针变量的类型是FILE*。本题答案为D选项。

第5题:下面说法正确的是
A、文件指针变量中保存的是文件在硬盘上的位置信息

B、文件指针变量的类型是指针类型

C、文件指针变量指向文件名字符串的内存地址

D、文件指针指向文件当前正在处理的字节地址

参考解析:【解析】在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。这个指针是用来存放文件的首地址。这个指针是专门用来指向文件的。文件指针变量的类型是指针类型。本题答案为B选项。

3,文件的打开与关闭

第1题:设文件指针fp已定义,执行语句fp=fopen("file" "w");后,以下针对文本文件file操作叙述的选项中正确的是 第1题:设文件指针FP已定义,执行语句fp=fopen(文件“w”);后,以下针对文本文件文件操作叙述的选项中正确的是
A、只能写不能读 、只能写不能读

B、写操作结束后可以从头开始读

C、可以在原有内容后追加写

D、可以随意读和写
参考解析:【解析】考查文件操作函数fopen的基础知识,以"w"方式打开文件,只能写不能读。 

第2题:以下关于fclose(fp)函数的叙述正确的是 第2题:以下关于flose(FP)函数的叙述正确的是
A、当程序中对文件的所有写操作完成之后,必须调用fclose(fp)函数关闭文件

B、当程序中对文件的所有写操作完成之后,不一定要调用flose(FP)函数关闭文件

C 、只有对文件进行输入操作之后,才需要调用flose(FP)函数关闭文件

D、只有对文件进行输出操作之后,才能调用fclose(fp)函数关闭文件 

参考解析︰【解析】对一个文件操作完成后,要将该文件关闭,“关闭′就是使文件指针变量不再指向该文件。程序编写者应该在程序终止之前关闭所有文件,如果不关闭,文件将会丢失数据。因为,在向文件写数据时,是先将数据输出到缓冲反,待缓冲区充满后才正式输出给文件。如果当数据未充满缓冲区而程序结束运行,就会将缓冲区中的数据丢失。用fclose函数关闭文件,可以避免这个问题,它先把缓冲区中的数据输出到磁盘文件,然后才释放文件指针变量。所以对文件的所有写操作完成之后必须要关闭文件,A选项正确,B选项错误。只要对文件进行操作后,都要调用fclose文件关闭文件,C、D进项错误。 

参考解析∶【解析】fopen函赛数以一定方式打开指定文件,返回一个指向文件的文件指针,如果不能实现打开指定文件的操作,则返回一个空指针NULL。如果指定文件不存在则创建一个文件名为指定文件名的新文件,然后打开它。在指定文件有错误或者指定文件不存在却不能创建新文件的情况下,打开文件操作错误,返回空指针。本题程序中,文件test.txt不存在,但无其他异常,表示可以建立新文件,命名为test.txt,C洗项叙述正确,并以只写方式打开它,D选项叙述正确,返回指向灾件的指钎,if条件不成立,输出“成功打开文件!”,B选项叙述正确,A选项叙述错误。所以选择A选项。

 参考解析︰【解析】fopen函数以一定方式打开指定文件,返回一个指向文件的文件指针,如果不能实现打开指定文件的操作,则返回一个空指针NULL。如果指定文件不存在则创建一个文件名为指定文件名的新文件,然后打开它。在指定文件有错误或者指定文件不存在却不能创建新文件的情况下,打开文件操作错误,返回空指针。本题程序中,文件test.txt不存在,但无其他异常,表示可以建立新文件,命名为test.txt,C选项叙述正确,并以只写方式打开它,D选项叙述正确,返回指向文件的指钎,if条件不成立,输出“成功打开文件!”,B选项叙述正确,A选项叙述错误。所以选择A选项。

参考解析︰【解析】fopen函药以一定方式打开指定文件,返回一个指向文件的文件指针,如果不能实现打开指定文件的操作,则返回一个空指针NULL。如果指定文件不存在则创建一个文件名为指定文件名的新文件,然后打开它。在指定文件有错误或者指定文件不存在却不能创建新文件的情况下,打开文件操作错误,返回空指针。本题程序中,文件test.txt已存在,程序运行后,文件test.txt中的原有内容将全部消失,A选项正确。文件原本就存在,不会导致程序出错,会按照指定的方式打开文件,B选项错误。对文件进行写操作,只能对指针指向的位置内容进行写操作,不能随机读写,C选项错误。对文件test.txt写入的内容写到指针所指向的位署,而不是添加在文件尾部,D洗项错误。

4,文件的读写

第1题:读取二进制文件的函数调用形式为:fread(buffer,size,count,fp);,其中buffer代表的是()。 第1题:读取二进制文件的函数调用形式为:Fread(缓冲区、大小、计数、FP);其中缓冲区代表的是()。
A、一个内存块的字节数 、一个内存块的字节数

B、一个整型变量,代表待读取的数据的字节数 

C、一个文件指针,指向待读取的文件 

D、一个内存块的首地址,代表读入数据存放的地址

参考解析:【解析】fread(void *buffer,size t size,size t count,FILE *stream);功能是从一个文件流中读数据,读取count个元素

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/121545.html

相关文章

发表评论

0条评论

最新活动
阅读需要支付1元查看
<