文件操作(3)

前言,在上篇博客介绍了如何正确的打开一个文件和关闭一个文件,今天我们来学习如何在文件中输出和输入数据。
对文件数据的读写可以分为顺序读写和随机读写。顺序读写,即挨着顺序对文件中的数据进行输入或输出。

在这片博客中,我们首先介绍文件的顺序读写需要用到的文件操作函数。
我们今天这篇博客主要介绍这几个文件操作函数。
在这里插入图片描述

字符输入输出函数 - fgetc和fputc

fputc函数

int fputc ( int character, FILE * stream );

fputc函数的第一个参数是待输出的字符,第二个参数该字符输出的位置,即fputc函数的功能是将一个字符输出到指定的位置。该函数调用完毕会返回用户传入的字符
比如我们要输出26个字符到test.txt的文件中去。

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("open");
		return 1;
	}

	//对文件的一系列操作
	char i = 'a';
	for (i = 'a'; i <= 'z'; i++)
	{
		fputc(i, pf);
	}

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

fgetc文件输入函数

int fgetc ( FILE * stream );

fgetc函数只有一个参数,就是从你传入的文件指针开始读取一个字符。调用成功会返回所读取到的字符,而读取错误就会返回EOF。
我们将刚刚打印的26个字符全部读出来并打印到屏幕上。

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}

	//对文件的一系列操作
	int ch = 0;
	while ((ch = fgetc(pf)) != EOF)
	{
		printf("%c", ch);
	}

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

	return 0;
}

文本行输入函数-fgets和fputs(字符串输入和输出函数)

fputs

char * fgets ( char * str, int num, FILE * stream );

str表示要写的字符串,stream表示要输出的位置。即fputs函数的功能是将一个字符串输出到指定的位置(有没有发现fputs函数的参数设计和fputc函数参数的设计非常类似)。该函数调用成功会返回一个非负值;若输出时发生错误,则返回EOF。
我们来实现一个将welcome to china写进文件中试试

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

	//对文件的一系列操作
	fputs("welcome to china", pf);
	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

fgets

har * fgets ( char * str, int num, FILE * stream );

str表示将读取到的字符串放到所指的字符指针中去,num表示读取的数量,stream表示读取的位置。
第一个参数是你所读取到的数据的储存位置。fgets函数的功能就是从指定位置读取指定字符个数的数据储存到指定位置。该函数调用成功会返回用于储存数据的位置的地址,如果读取过程中发生错误,或是读取到了文件末尾,则返回一个空指针(NULL)
我们将刚刚中文本文件中写入的字符串读出三个试试。

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}

	//对文件的一系列操作
	char arr[20] = { 0 };
	fgets(arr,3,pf);
	printf("%s\n",arr);
	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

fgets函数读取字符的过程中会出现两种情况:

在fgets函数读取到指定字符数之前,若读取到换行符(’\n’),则停止读取,读取带回的字符包含换行符。
直到fgets函数读取到第n-1个字符时都没有遇到换行符(’\n’),则返回读取到的n-1个字符,并在末尾加上一个空字符一同返回(共n个字符)

格式化输入输出函数-fscanf和fprintf

fprintf

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

第一个是输出数据的目的地,后面的用法跟我们平时使用的printf用法一样,就是在前面多一个指针而已
在这里插入图片描述
例如我们要将一个结构体的类型的指针输出到文本文件中,我们可以这样子做

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

int main()
{
	struct S s[2] = { {"wangchengdong",22,98.5},{"liumeili",24,96.5} };
	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	for (int i = 0; i < 2; i++)
	{
		//对文件的一系列操作
		fprintf(pf, "%s %d %f\n", s[i].name, s[i].age, s[i].score);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

在这里插入图片描述
其实,fprintf函数的功能就是将“区域三”的数据,以“区域二”的格式输出到“区域一”。
fscanf函数

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

在这里插入图片描述
这俩个是非常相似的,我们可以将刚刚fprintf函数输出到文本文件中的结构体读取出来。

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

int main()
{
	struct S s[2] = {0};
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}

	//对文件的一系列操作
	fscanf(pf,"%s %d %f %s %d %f\n",s[0].name, &(s[0].age), &(s[0].score),s[1].name,&(s[1].age),&(s[1].score));
	int i = 0;
	for (i = 0; i < 2; i++)
	{
		printf("%s %d %.1f\n",s[i].name,s[i].age,s[i].score);

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

	return 0;
}

在这里插入图片描述
其实,fscanf函数的功能就是将“区域一”的数据,以“区域二”的格式输入到“区域三”

fwrite和fread二进制文件的读写

fwrite

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

fwrite函数的第一个参数是输出数据的位置,第二个参数是要输出数据的元素个数,第三个参数是每个元素的大小,第四个参数是数据输出的目标位置。该函数调用完后,会返回实际写入目标位置的元素个数,当输出时发生错误或是待输出数据元素个数小于要求输出的元素个数时,会返回一个小于count的数。
比如我们要把刚刚的结构体信息写进二进制文件中去。

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

int main()
{
	struct S s[2] = { {"wangchengdong",22,98.5},{"liumeili",24,96.5} };
	FILE* pf = fopen("test.txt", "wb");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	
		//对文件的一系列操作
		fwrite(s,2,sizeof(struct S),pf);
	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

此时打开文件的方式是wb的形式,是二进制的形式
fread

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

fread函数的第一个参数是接收数据的位置,第二个参数是要读取的每个元素的大小,第三个参数是要读取的元素个数,第四个参数是读取数据的位置。函数调用完会返回实际读取的元素个数,若在读取过程中发生错误或是在未读取到指定元素个数时读取到文件末尾,则返回一个小于count的数。
我们将刚刚的二进制文件读出来并打印在屏幕上

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

int main()
{
	struct S s[2] = {0};
	FILE* pf = fopen("test.txt", "rb");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	
		//对文件的一系列操作
	struct S tmp[5] = { 0 };
		fread(tmp,5,sizeof(struct S),pf);
		int i = 0;
		for (i = 0; i < 5; i++)
		{
			printf("%s %d %.1f\n", tmp[i].name, tmp[i].age, tmp[i].score);
		}
	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/914727.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Openstack7--安装消息队列服务RabbitMQ

只需要在控制节点安装 安装RabbitMQ yum -y install rabbitmq-server 启动RabbitMQ并设置开机自启 systemctl start rabbitmq-server;systemctl enable rabbitmq-server 创建 rabbitmq 用户 并设置密码为 000000 rabbitmqctl add_user rabbitmq 000000 如果你不慎创错了…

Unity图形学之Shader2.0 模板测试

1.模版测试&#xff1a;符合条件的 通过 不符合条件的 像素 丢弃 比较公式&#xff1a; if&#xff08;&#xff08;referenceValue&readMask&#xff09; comparisonFunction &#xff08;stencilBufferValue&readMask&#xff09;&#xff09; 通过像素 else 抛弃…

020_Servlet_Mysql学生选课系统(新版)_lwplus87

摘 要 随着在校大学生人数的不断增加&#xff0c;教务系统的数据量也不断的上涨。针对学生选课这一环节&#xff0c;本系统从学生网上自主选课以及课程发布两个大方面进行了设计&#xff0c;基本实现了学生的在线信息查询、选课功能以及教师对课程信息发布的管理等功能&…

SpringBoot教程(二十五) | SpringBoot配置多个数据源

SpringBoot教程&#xff08;二十五&#xff09; | SpringBoot配置多个数据源 前言方式一&#xff1a;使用dynamic-datasource-spring-boot-starter引入maven依赖配置数据源动态切换数据源实战 方式二&#xff1a;使用AbstractRoutingDataSource1. 创建数据源枚举类2. 创建数据源…

Python 正则表达式进阶用法:分组与引用详解

Python 正则表达式进阶用法&#xff1a;分组与引用详解 正则表达式是一种用于字符串匹配和处理的强大工具。它不仅能识别简单的文本模式&#xff0c;还能通过更高级的特性来完成复杂的文本处理任务。本文将深入探讨 Python 正则表达式中的“分组”和“引用”——两个在高级匹配…

米家通过HomeAssistant控制笔记本电脑开关机

米家通过HomeAssistant控制笔记本电脑开关机 配置HomeAssistant配置EMQX mqtt自动化配置电脑关机实现电脑开机实现&#xff08;网络唤醒WOL包&#xff09; 环境准备&#xff1a; HomeAssistant&#xff1a;能配置接入米家的设备&#xff0c;我这里采用fnos安装MQTT服务器&…

前端环境配置

对于换公司的小伙伴来讲&#xff0c;重新安装环境&#xff0c;百度或许稍微有点麻烦&#xff0c;本文章让你无脑式直接操作&#xff0c;保证环境畅通无阻。 1.安装nvm-setup 该插件是一款管理nodeJs的包&#xff0c;无需你单独下载nodeJs去安装&#xff0c;只需要下载安装此…

[CKS] K8S AppArmor Set Up

最近准备花一周的时间准备CKS考试&#xff0c;在准备考试中发现有一个题目关于AppArmor Pod操作权限的问题。 ​ 专栏其他文章: [CKS] Create/Read/Mount a Secret in K8S-CSDN博客[CKS] Audit Log Policy-CSDN博客 -[CKS] 利用falco进行容器日志捕捉和安全监控-CSDN博客[CKS] …

提升自然排名的有效策略与方法

内容概要 在数字营销的快速发展背景下&#xff0c;自然排名的提升日益显得重要。自然排名不仅影响网站的流量&#xff0c;同时也直接关系到品牌的曝光度和市场竞争力。针对这个主题&#xff0c;我们将探讨多个关键因素&#xff0c;帮助读者更好地理解自然排名的重要性及其影响…

golang go语言 组建微服务架构详解 - 代码基于开源框架grpc+nacos服务管理配置平台

整体介绍&#xff1a; 本文主要介绍如何用go语言 来组建微服务的框架&#xff0c;grpc服务管理 示例框架 代码由grpcnacos go sdk 组成。 grpc负责将调用序列化并传递到远端&#xff0c;nacos负责服务发现和服务管理。 grpc和nacos都是开源产品。代码复制下来就能跑。 微服…

软件测试项目实战

软件测试是使用人工或者自动的手段来运行或者测定某个软件系统的过程&#xff0c;其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。 在软件投入使用前&#xff0c;要经过一系列的严格测试&#xff0c;才能保证交付质量。 一、引言 1.编写目的 本文档…

基于百度飞桨paddle的paddlepaddle2.4.2等系列项目的运行

PPASR 必看&#xff01;&#xff01;&#xff01; PaddleSpeech develop --> PaddlePaddle 2.5.0/2.5.1 PaddleSpeech < 1.4.1 --> PaddlePaddle < 2.4.2 1.创建虚拟环境 conda create --name test python3.10 2.激活环境&#xff0c;安装ppasr的paddlepaddl…

MySQL数据库专栏(四)MySQL数据库链接操作C#篇

摘要 本篇文章主要介绍C#链接MySQL数据库的接口介绍&#xff0c;使用实例及注意事项&#xff0c;辅助类的封装及调用实例&#xff0c;可以直接移植到项目里面使用。 目录 1、添加引用 2、接口介绍 2.1、MySqlConnection 2.2、MySqlCommand 2.3、MySqlDataReader…

【Pikachu】File Inclusion文件包含实战

永远也不要忘记能够笑的坚强&#xff0c;就算受伤&#xff0c;我也从不彷徨。 1.File Inclusion(文件包含漏洞)概述 File Inclusion(文件包含漏洞)概述 文件包含&#xff0c;是一个功能。在各种开发语言中都提供了内置的文件包含函数&#xff0c;其可以使开发人员在一个代码…

计算机网络基本概念总结

IP地址 概念 使网络中的设备都有唯一的地址标识&#xff0c;用于表示其在网络中的位置。 格式 IP地址是一个32位的二进制数&#xff0c;通常被分割为4个8位二进制数&#xff08;也就是4个字节&#xff09;&#xff0c;如&#xff1a;01100100.00001000.00001010.00000110。通常…

CSS回顾-基础知识详解

一、引言 在前端开发领域&#xff0c;CSS 曾是构建网页视觉效果的关键&#xff0c;与 HTML、JavaScript 一起打造精彩的网络世界。但随着组件库的大量涌现&#xff0c;我们亲手书写 CSS 样式的情况越来越少&#xff0c;CSS 基础知识也逐渐被我们遗忘。 现在&#xff0c;这种遗…

RabbitMq项目实战--延迟队列实现超时订单处理

简单实现版 RabbitMq创建队列绑定交换机_rabbitmq 绑定交换机-CSDN博客 Configuration public class RabbitmqConfig {Value("${rabbitmq.exchange}")private String exchange;Value("${rabbitmq.host}")private String host;Value("${rabbitmq.por…

Vivado+Vscode联合打造verilog环境

一、Vivado下载安装 详细参考我另一篇文章&#xff1a; Vivado2022.2下载安装_fpga vivado下载-CSDN博客https://blog.csdn.net/weixin_61081689/article/details/143460790?spm1001.2014.3001.5501 二、Vscode下载安装 详细参考我另一篇文章&#xff1a; VscodeAnacond…

Unity 热更新 之 一篇文章完全入门AssetBundle

本篇知识来源于unity官方手册以及siki学院的相关教程,链接如下,仅作学习分享 AssetBundle&#xff08;创建打包&#xff09;入门学习(基于Unity2017) - SiKi学院|SiKi学堂 - unity|u3d|虚幻|ue4/5|java|python|人工智能|视频教程|在线课程 目录 0.热更新是什么 1.AssetBundl…

思考:linux Vi Vim 编辑器的简明原理,与快速用法之《 7 字真言 》@ “鱼爱返 说 温泉啊“ (**)

Linux vi/vim | 菜鸟教程 https://zhuanlan.zhihu.com/p/602675406 Linux Vim编辑器的基本使用_vim文本编辑器-CSDN博客 这里提出使用 vi / vim 进行简单的编辑操作的原因&#xff0c;主要是在容器镜像中&#xff0c;普遍都是使用这个。 在 linux 服务器应用场景&#x…