文件的顺序读写函数举例介绍

news2024/11/16 19:51:40

目录

  • 例1:(使用字符输出函数fputc)
  • 例2:(使用字符输入函数fgetc)
  • 例3:(使用文本行输出函数fputs )
  • 例4:(使用文本行输入函数fgets )
  • 例5:(使用格式化输出函数fprintf)
  • 例6:(使用格式化输入函数fscanf)
  • 例7:(使用二进制输出函数fwrite)
  • 例8:(使用二进制输入函数fread)
  • 补充1:(sprintf函数)
  • 补充2:(sscanf函数)

结构:

//主函数
int main()
{
	//打开文件(写"w"/读"r")
	FILE* pF = fopen("myfile.txt", "w");
	//判断文件是否存在
	if (pF == NULL)
	{
		perror("fopen");
		return 1;
	}
	//进行写/读操作
	
	//关闭文件
	fclose(pF);
	pF = NULL;
	return 0;
}

stream在此例中都为pF,代表指向标识输出流的FILE对象的指针

例1:(使用字符输出函数fputc)

	FILE* pF = fopen("myfile.txt", "w");
	//使用循环
	int i = 0;
	for (i = 0; i < 26; i++)
	{
		//打印在文件中
		fputc('a' + i, pF);
		//打印在屏幕上
		fputc('a' + i, stdout);
	}

fputc的使用:int fputc ( int character, FILE * stream );

  1. 字符character被写入流stream的内部位置
  2. 指示器所指示的位置,然后自动向前移动一个。

运行后:
在这里插入图片描述

例2:(使用字符输入函数fgetc)

	 FILE* pF = fopen("myfile.txt", "r");
	//读文件
	int ch = fgetc(pF);
	printf("%c\n", ch);
	ch = fgetc(pF);
	printf("%c\n", ch);
	ch = fgetc(pF);
	printf("%c\n", ch);
	ch = fgetc(pF);
	printf("%c\n", ch);

fgetc的使用:int fgetc ( FILE * stream );

  1. 返回指定流stream 的内部文件位置指示符当前指向的字符,然后将内部文件位置指示符推进到下一个字符
  2. 如果流在被调用时位于文件的末尾,则该函数返回EOF并为流stream 设置文件结束指示器(feof)
  3. 如果发生读错误,该函数返回EOF并设置流stream 的错误指示器(error)

运行后:
在这里插入图片描述

例3:(使用文本行输出函数fputs )

	FILE* pF = fopen("myfile.txt", "w");
	//写文本文件
	fputs("hello word\n", pF);
	fputs("hello real word\n", pF);
	//打印在屏幕上
	fputs("hello word\n", stdout);

fputs的使用:int fputs ( const char * str, FILE * stream );

  1. 函数从指定的地址(str)开始复制,直到到达结束的空字符(‘\0’)
  2. 这个终止的空字符不会复制到流stream
  3. fputs不会写入额外的字符,换行需要自己加上'\n'

运行后:
在这里插入图片描述

例4:(使用文本行输入函数fgets )

	FILE* pF = fopen("myfile.txt", "r");
	//读文本文件
	char arr[10] = { 0 };
	fgets(arr, 10, pF);
	printf("%s\n", arr);
	fgets(arr, 10, pF);
	printf("%s\n", arr);

fgets的使用:char * fgets ( char * str, int num, FILE * stream );

  1. 从流stream中读取字符,并将其作为字符串存储到str中,直到读取(num-1)个字符,或者到达换行符或文件结束符,以先发生的为准。
  2. 换行符使fgets停止读取,但它被函数认为是一个有效字符,并包含在复制到str的字符串中
  3. 若先读取到(num-1)个字符,则需要自行添加'\n'使得在打印屏幕上显示出换行
  4. 在复制到str的字符之后,将自动追加一个终止null字符

运行后:
在这里插入图片描述

例5:(使用格式化输出函数fprintf)

//结构体
struct S
{
	int a;
	float f;
};
	//主函数
	FILE* pF = fopen("myfile.txt", "w");
	//写文本文件
	struct S s = { 100,3.14f };
	//打印在文本内
	fprintf(pF, "%d %f", s.a, s.f);
	//打印在屏幕上
	fprintf(stdout, "%d %f", s.a, s.f);

fprintf的使用:int fprintf ( FILE * stream, const char * format, ... );

  1. printf的区别仅在于形参FILE * stream
  2. printf的用法上加上参数流stream

运行后:
在这里插入图片描述

例6:(使用格式化输入函数fscanf)

//结构体
struct S
{
	int a;
	float f;
};
	//主函数
	FILE* pF = fopen("myfile.txt", "r");
	//从文本内读取
	struct S s = { 100,3.14f };
	fscanf(pF, "%d %f", &(s.a), &(s.f));
	//打印在屏幕上
	printf("%d %f", s.a, s.f);

fscanf的使用:int fscanf ( FILE * stream, const char * format, ... );

  1. scanf的区别仅在于形参FILE * stream
  2. scanf的用法上加上参数流stream

运行后:
在这里插入图片描述

例7:(使用二进制输出函数fwrite)

//结构体
struct S
{
	int a;
	float f;
	char str[10];
};
//主函数
	FILE* pF = fopen("myfile.txt", "wb");
	//写文件
	struct S s = { 100,3.14f,"hello"};
	fwrite(&s, sizeof(struct S), 1, pF);

fwrite的使用:size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

  1. 将由count元素组成的数组(每个元素的大小为size字节)从ptr所指向的内存块写入流stream 中的当前位置
  2. stream 的位置指示器按写入的总字节数前进
  3. 在内部,该函数将ptr指向的块解释为unsigned char类型的(size*count)元素数组,并将它们顺序写入流stream

运行后:
在这里插入图片描述
文本文件中为乱码的原因:fwrite写入文本中的为二进制编码,无法直接显示出,用fread函数可以读取出

例8:(使用二进制输入函数fread)

//结构体
struct S
{
	int a;
	float f;
	char str[10];
};
//主函数
	FILE* pF = fopen("myfile.txt", "rb");
	//读文件
	struct S s = { 0 };
	fread(&s, sizeof(struct S), 1, pF);
	printf("%d %f %s\n", s.a, s.f, s.str);

fread的使用:size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

  1. 从流stream 中读取一个由count元素组成的数组,每个元素的大小为size字节,并将它们存储在ptr指定的内存块中
  2. stream 的位置指示器按读取的总字节数前进
  3. 如果成功读取的总字节数为(size*count)

运用后:
在这里插入图片描述

补充1:(sprintf函数)

int sprintf ( char * str, const char * format, ... );

将格式化的数据,转换为字符串

  1. 如果在printf上使用format,则使用将打印的相同文本组成一个字符串,但不是打印,而是将内容作为字符串存储在str指向的缓冲区中
  2. 缓冲区的大小应该大到足以包含整个结果字符串
  3. 在内容之后自动附加一个终止null字符
struct S
{
	int a;
	float f;
	char str[10];
};
int main()
{
	char arr[30] = { 0 };
	struct S s = { 100,3.14f,"hehe"};
	sprintf(arr, "%d %f %s", s.a, s.f, s.str);
	printf("%s\n", arr);

	return 0;
}

将结构体struct S s中的数据按照"%d %f %s"的格式,转化为字符串存储在arr指向的缓冲区中

观察arr内的变化
在这里插入图片描述

补充2:(sscanf函数)

int sscanf ( const char * s, const char * format, ...);

从字符串中读取格式化的数据

  1. s中读取数据,并根据参数格式将其存储到附加参数给出的位置,就像使用了scanf一样,但从s中读取数据,而不是从标准输入(stdin)中读取
  2. 额外的参数应该指向已经分配的对象,其类型由格式字符串中相应的格式说明符指定
struct S
{
	int a;
	float f;
	char str[10];
};
int main()
{
	char arr[30] = { 0 };
	struct S s = { 100,3.14f,"hehe" };
	struct S tmp = { 0 };
	sprintf(arr, "%d %f %s", s.a, s.f, s.str);
	sscanf(arr, "%d %f %s", &(tmp.a), &(tmp.f), tmp.str);
	printf("%d %f %s\n", tmp.a, tmp.f, tmp.str);
	return 0;
}

arr中读取数据,由"%d %f %s"的格式字符串中相应的格式说明符指定分配到结构体struct S tmp

观察数据变化
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序屏蔽控制台黄色提示信息

我们很多时候 一个小程序 啥都没有 终端就一直报一些黄色的警告 可以打开项目的 project.config.json 找一下setting 下面有没有 checkSiteMap 字段 如果没有加一个 如果有 直接将值改为 false 这样 再运行 就不会有这个黄色的提示信息了

牛客网C++专项题目整理(1)

1. 若有定义语句:char s[3][10],(*k)[3],*p;则以下赋值语句错误的是 1.p s; 2.p k; 3.p s[0]; 4.k s; 答案&#xff1a;124 char s[3][10] s 是数组指针&#xff0c;类型为char (*)[3]&#xff0c;所指向的每个数组长度为10; char (*k)[3] k是一个数组指针&a…

Windows下用crashRpt让C++程序崩溃自动生成dump

背景 我们的Windows c程序如果在客户或者没有代码调试的环境下崩溃了。我们只能从机器异常报错里得知寥寥无几的信息&#xff0c;如果程序崩溃时&#xff0c;能自动触发当前堆栈信息的收集&#xff0c;那么对于开发人员复现BUG就尤为重要 CrashRpt CrashRpt主要功能 1.崩溃报…

【Java基础系列】时间戳

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

政安晨【示例演绎虚拟世界开发】(五):从制作一个对战小游戏开始(Cocos Creator 《击败老大》)(第二段)

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: AI虚拟世界大讲堂 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 现在我们已经学会了如何向场景中添加图片&#xff0c;接下来继…

Django路由层(反向解析、路由分发、命名空间、路径转换)

Django路由层&#xff08;反向解析、路由分发、命名空间、路径转换&#xff09; 目录 Django路由层&#xff08;反向解析、路由分发、命名空间、路径转换&#xff09;路由配置反向解析前端用法后端用法 反向解析的本质路由分发用法示例 分发时遇到的问题解决方案1解决方案2 命名…

过于老旧的pytorch_ssim包 请从github下载源码

有些冷门算法真的不要随便pip&#xff0c;有可能下载到史前版本…最好还是找源代码 汗 今天要用到SSIM损失函数&#xff0c;从网上简单看了一下原理就想测试一下&#xff0c;偷了一下懒就直接在命令行输入pip install pytorch_ssim了&#xff0c;结果报了一堆错误&#xff08;汗…

vue3编写H5适配横竖屏

具体思路如下&#xff1a; 1、监听浏览器屏幕变化&#xff0c;通过监听屏幕宽高&#xff0c;辨别出是横屏&#xff0c;还是竖屏状态 在项目的起始根页面进行监听&#xff0c;我就是在App.vue文件下进行监听 代码如下&#xff1a; <template><RouterView /> <…

【MySQL】:约束全解析

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. 约束概述二. 约束演示三. 外键约束3.1 介绍3.2 语法3.3 删除/更新行为 &…

Ribbon负载均衡(黑马学习笔记)

上Eureka一节中&#xff0c;我们添加了LoadBalanced注解&#xff0c;即可实现负载均衡功能&#xff0c;这是什么原理呢&#xff1f; 负载均衡原理 SpringCloud底层其实是利用了一个名为Ribbon的组件&#xff0c;来实现负载均衡功能的。 那么我们发出的请求明明是http://users…

文献阅读:The Unreasonable Effectiveness of Easy Training Data for Hard Tasks

文献阅读&#xff1a;The Unreasonable Effectiveness of Easy Training Data for Hard Tasks 1. 文章简介2. 方法介绍 1. 数据集难易度分析2. 模型训练前后变化 3. 实验考察 & 结论 1. 实验设计 1. 使用数据集2. 使用模型 2. 实验结果 1. 数据集难度分析2. 在Easy数据集下…

迭代器模式:分离遍历逻辑与数据结构,实现统一访问接口与灵活扩展

文章目录 一、引言二、应用场景与技术背景三、模式定义与实现四、优缺点分析总结&#xff1a; 一、引言 ​ 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;它提供了一种方法顺序访问聚合对象的元素&#xff0c;而又不暴露其底层表示。迭…

SaaS 电商设计 (九) 动态化且易扩展的实现购物车底部弹层(附:一套普适的线上功能切量的发布方案)

目录 一.背景1.1 业务背景1.2 技术负债 二.技术目标三.方案设计3.1 解决移动端频繁发版3.1.1 场景分析3.1.2 技术方案 3.2 减少后端坏味道代码&无法灵活扩展问题3.2.1 通过抽象接口完成各自单独楼层渲染逻辑3.2.2 通过配置能力做到部分字段可配 四.升级上线(普适于高并发大…

NoSQL--2.MongoDB配置

目录 2.MongdoDB配置 2.1 Windows环境下操作 2.1.1 注册MongDB Atlas&#xff1a; 2.1.2 MongoDB Community Server Download&#xff1a; 2.1.3 启动MondgoDB服务&#xff1a; 2.1.3.1 命令行参数的方式启动MongoDB服务&#xff1a; 2.1.3.2 使用配置文件方式启动Mongo…

Python算法100例-3.4 完数

完整源代码项目地址&#xff0c;关注博主私信源代码后可获取 1.问题描述2.问题分析3.算法设计4.确定程序框架5.完整的程序6.问题拓展 1&#xff0e;问题描述 求某一范围内完数的个数。 如果一个数等于它的因子之和&#xff0c;则称该数为“完数”&#xff08;或“完全数”&…

C#中多语言编程原理及实例解析

文章目录 一、了解C#多语言编程原理1. 通用语言运行库&#xff08;CLR&#xff09;2. 通用类型系统&#xff08;CTS&#xff09;3. 微软中间语言&#xff08;MSIL&#xff09;4. 元数据和反射5. 公共语言规范&#xff08;CLS&#xff09; 二、实例说明 一、了解C#多语言编程原理…

Linux笔记--用户与用户组

Linux系统是一个多用户多任务的操作系统&#xff0c;任何一个要使用系统资源的用户&#xff0c;都必须首先向系统管理员(root)申请一个账号&#xff0c;然后以这个账号的身份进入系统。 用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪&#xff0c;并控制他们对系…

MIT-BEVFusion系列九--CUDA-BEVFusion部署6 前向推理的数据加载与图像预处理

目录 加载图像数据加载点云数据模型推理并计时预热操作模型推理检查点云输入数据量打印信息中CopyLidar部分的计算和耗时打印信息中ImageNrom图像预处理部分计算和耗时 该系列文章与qwe、Dorothea一同创作&#xff0c;喜欢的话不妨点个赞。 接上面的文章&#xff0c;目光聚焦回…

为啥要用C艹不用C?

在很多时候&#xff0c;有人会有这样的疑问 ——为什么要用C&#xff1f;C相对于C优势是什么&#xff1f; 最近两年一直在做Linux应用&#xff0c;能明显的感受到C带来到帮助以及快感 之前&#xff0c;我在文章里面提到环形队列 C语言&#xff0c;环形队列 环形队列到底是怎么回…

数据结构——lesson5栈和队列详解

hellohello~这里是土土数据结构学习笔记&#x1f973;&#x1f973; &#x1f4a5;个人主页&#xff1a;大耳朵土土垚的博客 &#x1f4a5; 所属专栏&#xff1a;数据结构学习笔记 &#x1f4a5;对于顺序表链表有疑问的都可以在上面数据结构的专栏进行学习哦~感谢大家的观看与…