文件操作(超详细讲解)

前言
在C语言中,文件操作是通过stdio库中提供的一组函数来实现的。这些函数可以用于创建、打开、读取、写入和关闭文件,以及进行其他与文件操作相关的任务。今天我就来给大家讲解一下文件操作。

在这里插入图片描述

1,文件

文件是以硬盘为载体存储在计算机上的信息集合,文件可以是文本文档、图片、程序之类的,把数据卸载文件上十分的方便,需要的时候就添加,不需要的时候就删除,而且可以想保存多久就存多久。
文件分为两类,一类是程序文件,另一类是数据文件。
程序文件:包裹源程序文件,目标文件和可执行程序。
数据文件:指用于存储和组织数据的文件。它可以包含不同类型的数据,例如文本、数字、图像等。文件操作指的就是对数据文件进行操作。

2,文件指针

文件指针,其定义采用这样的格式:FILE*
FILE是一个已经被定义过的结构体,而文件指针则是指向该结构体的指针,文件的信息可以保存到这个结构体里,那么我们就需要先打开文件。这就需要用到我们的fopen函数。
FILE * fopen ( const char * filename, const char * mode );
他的第一个参数是文件名(就是文件名的意思,你也可以包含文件目录),第二个参数表示你要使用的方式,有以下几种方式。

在这里插入图片描述
简单给大家写个例子 FILE * pf = fopen("date.txt","w");
另外,我们还需要进行错误处理,以处理可能出现的文件打开错误,如果成功打开文件,那么会返回一个有效地址,如果失败就会返回NULL。
既然打开了文件,再不用的时候我们就需要将其关闭,并且释放文件资源。这时候我们需要用到fclose函数。
int fclose ( FILE * stream );
使用方法:fclose(pf); pf = NULL;
在结束操作后关闭文件,并确保文件资源的正确释放。

3,顺序读写

那么我们要怎么对文件进行读写操作呢?我们可以用到下面这下函数。
在这里插入图片描述
下面我来给大家挨个展示他们的用法。
fputc和fgetc

int main()
{
    
    
	FILE* pf = fopen("date.txt", "w+");//打开文件
	if (pf == NULL)//判断是否打开成功
	{
    
    
		printf("打开失败");
		return 1;
	}
	fputc('a', pf);//将字符存进文件
	fputc('a', pf);
	fputc('a', pf);
	fputc('a', pf);
	fputc('a', pf);//现在文件中是aaaaa
	fclose(pf);//关闭文件
	pf = NULL;//置为空
	return 0;
}
int main()
{
    
    
	FILE* pf = fopen("date.txt", "w+");//打开文件
	if (pf == NULL)//判断是否打开成功
	{
    
    
		printf("打开失败");
		return 1;
	}
	char arr[5];
	arr[0] = fgetc("pf");//读取数据
	arr[1] = fgetc("pf");
	arr[2] = fgetc("pf");
	arr[3] = fgetc("pf");
	arr[4] = fgetc("pf");//现在arr数组里存的是aaaaa
	fclose(pf);//关闭文件
	pf = NULL;//置为空
	return 0;
}

fputs和fgets

int main()
{
    
    
	FILE* pf = fopen("date.txt", "w+");//打开文件
	if (pf == NULL)//判断是否打开成功
	{
    
    
		printf("打开失败");
		return 1;
	}
	fputs("aaaaa", pf);//再文件中放入字符串
	fclose(pf);//关闭文件
	pf = NULL;//置为空
	return 0;
}
int main()
{
    
    
	FILE* pf = fopen("date.txt", "w+");//打开文件
	if (pf == NULL)//判断是否打开成功
	{
    
    
		printf("打开失败");
		return 1;
	}
	char* a; 
	fgets(a, 5, pf);//a现在指向的字符串为aaaaa
	fclose(pf);//关闭文件
	pf = NULL;//置为空
	return 0;
}

fscanf和fprintf

int main()
{
    
    
	FILE* pf = fopen("date.txt", "w+");//打开文件
	if (pf == NULL)//判断是否打开成功
	{
    
    
		printf("打开失败");
		return 1;
	}
	char arr[] = "aaaaa";
	int a = 5;
	fprintf(pf, "%s %d", arr, a);//将字符串和整形以格式化的形式存进文件
	int b = 0;
	char arr2[5] = {
    
     0 };
	fscanf(pf, "%s %d", &arr2, &b);//往文件中存储aaaaa和5
	printf("%d", b);
	fclose(pf);//关闭文件
	pf = NULL;//置为空
	return 0;
}
int main()
{
    
    
	FILE* pf = fopen("date.txt", "w+");//打开文件
	if (pf == NULL)//判断是否打开成功
	{
    
    
		printf("打开失败");
		return 1;
	}
	int b = 0;
	char arr2[5] = {
    
     0 };
	fscanf(pf, "%s %d", arr2, &b);//现在b是5arr2是aaaaa
	fclose(pf);//关闭文件
	pf = NULL;//置为空
	return 0;
}

fread和fwrite用法与上面类似,只不过只能以二进制的方式读写。人类没有办法看懂,但是计算机可以看懂。

4,随机读写

随机读写其实并不是随机的,而是能从我们想要的位置开始读或写。
我们会用到fseek,ftell,rewind这三个函数。
fseek
int fseek( FILE * stream, long offset, int origin );
第一个参数是文件流,第二个参数是偏移量,第三个参数是起始位置。
即我们会从从起始位置+偏移量位置开始读写函数比如起始位置是1偏移量是3我们就会从4的位置开始读写,偏移量可以位负值。如果成功会返还一个非零值,失败则会返回一个非零的值。
第三个参数我们也可用写成这样SEEK_SET(文件的起始位置即0),SEEK_END(文件的末尾位置),SEEK_CUR(当前读到的位置)。
ftell
该函数可以返回文件指针相对于起始位置的偏移量。
rewind
会让文件指针返回起始位置。

5,feof和ferror

在读写文件的时候有可能会出现读取和写入错误,但是我们不知道是怎么出错的或是那一步出错的,这时就可以使用feof函数和ferro函数。
当使用fgetc函数时用feof判定若读取成功则会返回读取的字符的ASCII值,不然会返回EOF。
当使用fgets函数时用feof判定如果返回值为NULL则读取失败。
ferror可以判断当文件读取结束时,判断是不是遇到文件末尾才结束的,如果是则返回0,如果不是则返回一个非0的值。
使用:

if (ferror(pf))
{
    
    
	printf("读取时出现了错误");
}
else if (feof(pf))
{
    
    
	printf("成功到达文件尾");
}

6,尾声

关于本期的文件操作分享就到这里了,如果觉得博主讲的不错的话请给博主一个关注,点赞,收藏,博主还将持续更新知识分享,我们下期再见!

猜你喜欢

转载自blog.csdn.net/Tokai___Teio/article/details/135035760