C语言:文件操作(中)

片头

嗨!小伙伴们,大家好!在上一篇中,我们学习了C语言:文件操作(上),在这一篇中,我们将继续学习文件操作,准备好了吗?Ready Go ! ! !

 文件的顺序读写

来复习一下这个表格

函数名功能适用于
fgetc字符输入函数/读所有输入流(stdin-标准输入流和文件输入流)
fputc字符输出函数/写所有输出流(stdout-标准输出流和文件输出流)
fgets文本行输入函数所有输入流
fputs文本行输出函数所有输出流
fscanf格式化输入函数所有输入流
fprintf格式化输出函数所有输出流
fread二进制输入文件输入流
fwrite二进制输出文件输出流

在上一篇中,我们学习了fgetc、fputc、fgets、fputs函数,今天我们来讲解后面几个函数~

1 fprintf函数

fprintf函数是C语言标准库中的一个输出函数,用于将格式化的数据输出到指定的文件中。

函数声明如下:

int fprintf( FILE* stream,const char* format,.......);

 参数意义如下:

stream: 表示文件指针,用于指定输出的目标文件

format: 是一个格式化字符串,指定输出的格式

....... : 表示可变参数,用于提供要输出的数据

通过对比,我们可以观察到,fprintf函数和printf函数差不多, fprintf函数只不过多了一个参数FILE* stream,printf函数是将数据输出到标准输出流(stdout)【类似于:显示器界面(控制台)】,而fprintf函数是将数据输出到指向文件的指针stream(指针类型为 FILE*)中。

代码如下:

#include<stdio.h>
//创建一个结构体Stu
struct Stu {
	char name[20];
	int age;
	float score;
};

int main() {
	//定义一个结构体变量s,分别对属性进行初始化
	struct Stu s = { "zhangsan",24,98.00000 };
	//以“只写”的方式打开文件
	FILE* pfwrite = fopen("data.txt", "w");
	if (pfwrite == NULL) {
		perror("fopen->pfwite");
		return 1;
	}
	//将信息输出到流中
	fprintf(pfwrite,"%s %d %.1f", s.name, s.age, s.score);
	
	//关闭文件
	fclose(pfwrite);
	pfwrite = NULL;//置空
	return 0;
}

运行结果如下:

fprintf函数的返回值是成功输出的字符数。如果出现错误则返回负数。函数会根据format字符串中的格式指示符,将可变参数列表中的数据按照指定的格式输出到文件中。

2 fscanf函数

fscanf函数是C语言标准库中的一个输入函数,用于从文件中读取格式化的数据。它可以根据给定的格式字符串从文件中读取数据,并将读取到的数据存储到对应的变量中。

函数原型如下:

int fscanf(FILE* stream, const char* format, ...);

参数说明:
- stream:指向要读取的文件的指针。
- format:格式化字符串,指定了要读取的数据的格式。
- ...:可变参数,用来接收读取到的数据的变量。

通过对比,我们可以发现,其实 fscanf 函数和 scanf 函数差不多,fscanf函数只不过多了一个参数FILE* stream,scanf函数是从标准输入流(从键盘中)读取数据,fscanf函数是从指向文件的指针stream(指针类型为 FILE*)中读取数据。

代码如下:

#include<stdio.h>

//创建一个结构体Stu
struct Stu {
	char name[20];
	int age;
	float score;
};
int main() {
//定义一个结构体变量s,初始化为0
	struct Stu s = { 0 };
//以“只读”的模式,打开文件
	FILE* pfread = fopen("data.txt", "r");
//从文件中读取属性值
	fscanf(pfread,"%s %d %f", s.name, &(s.age), &(s.score));
//在控制台上打印属性值
	fprintf(stdout,"%s %d %.1f", s.name, s.age, s.score);

//关闭文件
	fclose(pfread);
	pfread = NULL;//置空

	return 0;
}

运行结果如下:

这样,我们就成功地使用fscanf函数从文件中读取了数据。需要注意的是,fscanf函数会按照格式化字符串中的格式要求进行读取,如果格式不匹配,可能会导致读取错误或结果不正确。因此,在使用fscanf函数时,要确保格式化字符串与文件中的数据格式相匹配。 

3 fwrite函数

fwrite函数是C语言中的一个文件操作函数,用于向文件中写入数据。

函数原型如下:

size_t fwrite( const void* ptr, size_t size,  size_t  count,  FILE* stream);

参数含义如下:

ptr: 指向要写入的数据的指针

size: 每个数据项的大小(以字节为单位) 

count: 要写入的数据项的个数

stream: 指向要写入的文件的指针

返回值: 成功写入数据的个数

fwrite函数将指定的数据写入文件,写入的数据来自指针ptr指向的内存区域。写入的数据项大小为size字节,总共写入count个数据项。函数调用成功后,返回实际写入的数据项个数,如果返回值与count不相等,可能是因为写入出错或到达文件末尾。

fwrite函数一般用于向二进制文件中写入数据,例如将内存中的结构体保存到文件中。它可以写入任意类型的数据,包括整数、浮点数、字符等。

代码如下:

//创建一个结构体Stu
struct Stu {
	char name[20];
	int age;
	float score;
};

int main() {
	//定义一个结构体变量s,分别对属性进行初始化
	struct Stu s = { "zhangsan",18,95.00000 };
	//以二进制的模式读和写
	FILE* pf = fopen("data.txt", "wb");
	if (pf == NULL) {
		perror("pf");
		return 1;
	}

	//二进制输出到流中
	fwrite(&s, sizeof(s), 1, pf);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

运行结果如下:

 

4 fread函数

 fread函数时C语言中的文件输入函数,用于从文件中读取指定数量的数据项,并将其存储到指定的内存块中。它的函数原型如下:

size_t fread(void* ptr,size_t size,size_t count,FILE* stream)

 参数说明:

ptr: 指向存储数据的内存块的指针。

size: 每个数据项的字节数。

count: 要读取的数据项的数量

stream: 文件指针,指向要读取的文件。

返回值:为实际读取的数据项数量。

fread函数按照指定的size和count来计算要读取的总字节数,并将这些字节从文件中读取到ptr指向的内存块中。读取的位置随着每次读取而向后移动。

fread函数常用于读取二进制文件,可以读取任意类型的数据。读取字符串时,需要注意字符串结束标志'\0'字符,因为fread函数不会自动追加字符串结束符。

代码如下:

//创建一个结构体Stu
struct Stu {
	char name[20];
	int age;
	float score;
};

//定义一个结构体变量s,初始化为0
int main() {
	struct Stu S = { 0 };
	FILE* pf = fopen("data.txt", "rb");
	if (pf == NULL) {
		perror("pf");
		return 1;
	}
	//以二进制的形式读文件
	fread(&S, sizeof(S), 1, pf);
	//输出属性值
	printf("%s %d %f\n", S.name, S.age, S.score);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

运行结果如下:

 片尾

今天我们学习了另外4个函数,分别是fprintf函数,fscanf函数,fwrite函数,fread函数,希望看完这篇文章能对友友们有所帮助!!!

点赞收藏加关注!!!

谢谢大家!!!

  • 30
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值