文件操作(二)

发布时间:2024年01月14日

?=????🏀前言上一篇我们加们讲了什么是文件,为什么使用文件,以及流的概念。我们继续接上一篇来继续讲解我们的文件操作,这一篇将会详细的讲如何对文件进行读写。

目录

🚀一.文件的顺序读写

1.fgetc和fputc

2.fgets和fputs?

3.?fscanf和fprintf?

4.?fread和fwerite

??二.文件的随机读写?

1.fseek

2.ftell?

3.rewind?

🌈三.结言


🚀一.文件的顺序读写

在文件操作中我们如下几种方式进行读写:

函数名功能适用于
fgetc字符输入函数所有输入流
fputc字符输出函数所有输入流
fgets文本行输入函数所有输入流
fputs文本行输出函数所有输入流
fscanf格式化输入函数所有输入流
fprintf格式化输出函数

所有输入流

fread二进制输入文件
fwrite二进制输出文件

这些函数分别两两一组,下面来详细的介绍一下他们吧!?

1.fgetc和fputc

int character:像文件中传入的数据。

FILE * stream:指向文件的流。

FILE * stream:指向文件的流。

int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror(fopen);
	}
	//文件操作
	char ch = 0;
	scanf("%c", &ch);
	fputc(ch, pf);
	//关闭文件
	fclose(pf);
    pf=NULL;
	return 0;
}

fputc就是向文件中输出一个指定的字符。而fgetc就是从文件中输出一个字符。

int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror(fopen);
	}
	//文件操作
	char ch = 0;
	ch=fgetc(pf);
	printf("%c\n", ch);
	//scanf("%c", &ch);
	//fputc(ch, pf);
	//关闭文件
	fclose(pf);
    pf=NULL;
	return 0;
}

这就是fputc与fgetc的作用了。

2.fgets和fputs?

const char*str:像文件中输入文本的地址。

FILE * stream:指向文件的流。

char*str:接收文本的地址。

int num:接受文本的个数。

FILE * stream:指向文件的流。

fputs的使用:

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror(fopen);
	}
	fputs("abcdef", pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

fgets的使用:

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror(fopen);
	}
	char arr[10] = { 0 };
	fgets(arr,6,pf);
	printf("%s\n", arr);
	fclose(pf);
	pf = NULL;
	return 0;
}

3.?fscanf和fprintf?

看到这一对函数我们是不是首先就想到了我们常用的scanf和printf那他们有什么区别呢?

?可以看到相比之下fprintf多了一个参数也就是我们上面提到的指向文件的流。那么使用的话只需要在前面加上这个参数即可。?

fprintf的使用:

struct stu
{
	char name[20];
	int age;
	float score;
};
int main()
{
	struct stu stu1 = { "zhangsan",18,90.5 };
	FILE* pf=fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror(fopen);
		return 1;
	}
	fprintf(pf, "%s %d %.1f", stu1.name, stu1.age, stu1.score);
	fclose(pf);
	pf = NULL;
	return 0;
}

我们可以看到fprintf就是将一个格式化的东西向文件中输出,那么fprintf也就是从文件向外面输出了。?

同样也是fscanf多了我们上面提到的指向文件的流。

fscanf的使用:

struct stu
{
	char name[20];
	int age;
	float score;
};

int main()
{
	struct stu s = { 0 };
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror(fopen);
		return 1;
	}
	fscanf(pf, "%s %d %f", s.name, &(s.age),&(s.score));
	fprintf(stdout, "%s %d %.1f", s.name, s.age, s.score);
	return 0;
}

4.?fread和fwerite

?const void * ptr:输入内容的地址。

size_t size:单个输入内容的大小。

size_t count:输入内容的数量。

?FILE * stream:指向文件的流。

?void * ptr:输出内容的地址。

size_t size:单个输出内容的大小。

size_t count:输出内容的数量。

FILE * stream:指向文件的流。

他们两个也就是对二进制进行的文件操作函数。

fwrite的使用:

struct stu
{
	char name[20];
	int age;
	float score;
};

int main()
{
	struct stu stu1 = { "zhangsan",18,90.5 };
	FILE* pf=fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror(fopen);
		return 1;
	}
	fwrite(&stu1, sizeof(stu1), 1, pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

?我们可以看到文件出现了一些看不懂的乱码(由于字符的二进制储存与文本储存方式相同都是一ASCII码的形式),也就是说这就是以二进制存储的内容。?

fread的使用:

struct stu
{
	char name[20];
	int age;
	float score;
};

int main()
{
	struct stu s = { 0 };
	FILE* pf = fopen("test.txt", "rb");
	if (pf == NULL)
	{
		perror(fopen);
		return 1;
	}
	fread(&s,sizeof(s),1,pf);
	printf("%s %d %.1f", s.name, s.age, s.score);
	fclose(pf);
	pf = NULL;
	return 0;
}

??二.文件的随机读写?

说到随机我们可能会想到我们的rand函数,产生一个随机数。那么我们的随机读写是在任意一个地方去读写吗?其实不是的,随机读写指的是有很大的主观性,我们可以在我们想要读写的地方读写。接下来我们会认识到三个函数分别是fseek,ftell以及rewind。

1.fseek

?FILE * stream:指向文件的流。

long int offest:偏移量。

int origin:偏移的地点。(第二张图片的内容)

SEEK_SET:文件起始位置。

SEEK_CUR:光标所在的位置。

SEEK_END;文件末尾位置。

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror(fopen);
		return 1;
	}
	fseek(pf,2, SEEK_SET);
	int ch = fgetc(pf);
	printf("%c\n", ch);
	return 0;
}

2.ftell?

在了解了我们的fseek函数之后我们应该怎么去找我们的光标在哪里呢?或者是说偏移量是多少?我们的ftell函数也就整好解决了这个问题。

ftell:返回?件指针相对于起始位置的偏移量。

这个函数就简单多了只有一个流的参数。

ftell的使用:

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror(fopen);
		return 1;
	}
	fseek(pf,2, SEEK_SET);
	int ch = fgetc(pf);
	int count = ftell(pf);
	printf("%c\n", ch);
	printf("count的值是%d\n", count);
	return 0;
}

3.rewind?

这个函数与ftell的参数的相同。作用是将光标回到文件的起始位置。

rewind的使用:

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror(fopen);
		return 1;
	}
	fseek(pf,2, SEEK_SET);
	int ch = fgetc(pf);
	int count = ftell(pf);
	printf("%c\n", ch);
	printf("count的值是%d\n", count);
	rewind(pf);
	count = ftell(pf);
	printf("rewind之后count的值是%d\n", count);
	return 0;
}

🌈三.结言

我们的文件操作大体就介绍完了,如果有喜欢的可以三连哦!!欢迎大家互相探讨,博主会经常发布一些编程语言上的知识以及题,感谢大家的支持!!??=????💌=????💌=????💌

文章来源:https://blog.csdn.net/2302_79772464/article/details/135586210
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。