当前位置:首页 » 《休闲阅读》 » 正文

❤️学懂C语言文件操作读这篇就够了(万字总结,附习题)❤️_/少司命的博客

24 人参与  2022年02月06日 14:33  分类 : 《休闲阅读》  评论

点击全文阅读


目录

​​​

一,写在前面

二,为什么使用文件

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 <stdio.h>
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 <stdio.h>
#include <stdlib.h>
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 <stdio.h>
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 <stdio.h>
#include <windows.h>
//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个元素,每个元素size字节,如果调用成功返回count。 参考解析:[解析]Fread(void*缓冲区,大小t大小,大小t计数,文件*流);功能是从一个文件流中读数据,读取计数个元素,每个元素大小字节,如果调用成功返回计数。
buffer :用于接收数据的内存地址,大小至少是size*count字节;size:单个元素的大小,单位是字节; 缓冲区:用于接收数据的内存地址,大小至少是大小*计数字节;大小:单个元素的大小,单位是字节;
count:元素的个数,每个元素是size字节;stream:输入流。 count:元素的个数,每个元素是size字节;stream:输入流。


 参考解析:【解析】程序首先将数组a[10]中的元素1、2、3分别写入了文件d1.dat文件中,然后又将d1.dat文件中的数据123,整体写入到了变量n的空间中,所以打印n时输出的数据为123。

 参考解析:【解析】fprintf)函数向文件输出,将输出的内容输出到硬盘上的文件或是相当于文件的设备上执行两次fnrint后文件中有123 456,所以D选项正确。

 参考解析:【解析】本题考查文件操作函数,两次fwrite后,p文件中已经写入1.2,3,0,0.1.2,3.0.0然后将文件p中的内容重新写入数组a中,最后输出a为1,2,3,0,0,1,2,3,0,0,所以选项D正确。

See You!!!!! 


点击全文阅读


本文链接:http://zhangshiyu.com/post/34332.html

文件  指针  数据  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1