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

目录

  • 例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.mzph.cn/news/716919.shtml

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

相关文章

Docker基础教程 - 2 Docker安装

更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 2 Docker安装 Docker 的官网地址&#xff1a;https://www.docker.com/&#xff0c;在官网可以找到 Docker Engine 的安装步骤。 下面进行 Docker 环境的安装&#xff0c;正常情况下 Docker …

服务发现:CP or AP?

1 服务发现的意义 为高可用&#xff0c;生产环境中服务提供方都以集群对外提供服务&#xff0c;集群里这些IP随时可能变化&#xff0c;也需要用一本“通信录”及时获取对应服务节点&#xff0c;这获取过程即“服务发现”。 对服务调用方和服务提供方&#xff0c;其契约就是接…

(3)(3.1) FlightDeck FrSky发射器应用程序

文章目录 前言 1 概述 2 Turnkey Packages 3 参数说明 前言 ​Craft and Theory 的 FlightDeck 可让你轻松查看飞行模式、高度、速度、姿态和关键系统警报&#xff0c;包括故障保护和电池错误&#xff0c;如电池不平衡警告和发射机低电量警报。 1 概述 Craft and Theory 的…

【自然语言处理】NLP入门(二):1、正则表达式与Python中的实现(2):字符串格式化输出(%、format()、f-string)

文章目录 一、前言二、正则表达式与Python中的实现1.字符串构造2. 字符串截取3. 字符串格式化输出3.1 %符号格式化字符串1. 一般形式2. 常用格式字符3. 最小宽度和精度4. 进位制和科学计数法5. 多个对象的格式化输出6. 典例 3.2 format()方法格式化字符串1. 一般形式2. 参数传递…

51单片机-(中断系统)

51单片机-&#xff08;中断系统&#xff09; 了解51单片机中断系统、中断源、中断响应条件和优先级等&#xff0c;通过外部中断0实现按键控制LED亮灭为例理解中断工作原理和编程实现过程。 1.中断系统结构 89C51/52的中断系统有5个中断源 &#xff0c;2个优先级&#xff0c;…

WiFi模块引领智能家居革命:连接未来的生活

随着科技的快速发展&#xff0c;智能家居正成为现代生活的一部分&#xff0c;极大地改变了我们与家庭环境互动的方式。其中&#xff0c;WiFi模块作为关键的连接技术&#xff0c;在推动智能家居革命中发挥着不可忽视的作用。本文将深入探讨WiFi模块如何驱动智能家居革命。 设备互…

【探索Linux】—— 强大的命令行工具 P.24(网络基础)

阅读导航 引言一、计算机网络背景1. 网络发展历史 二、认识 "协议"1. 网络协议概念2. 网络协议初识&#xff08;1&#xff09;协议分层&#xff08;2&#xff09;OSI参考模型&#xff08;Open Systems Interconnection Reference Model&#xff09;&#xff08;3&…

NoSQL--1.虚拟机网络配置

目录 1.初识NoSQL 1.1 NoSQL之虚拟机网络配置 1.1.1 首先&#xff0c;导入预先配置好的NoSQL版本到VMware Workstation中 1.1.2 开启虚拟机操作&#xff1a; 1.1.2.1 点击开启虚拟机&#xff1a; 1.1.2.2 默认选择回车CentOS Linux&#xff08;3.10.0-1127.e17.x86_64) 7 …

MCU 串口接收环形缓冲区的实现

环形缓冲区 1. 环形缓冲区的特性 1.先进先出 2. 当缓冲区被使用完&#xff0c;且又有新的数据需要存储时&#xff0c;丢掉历史最久的数据&#xff0c;保存最新的数据 现实中的存储介质都是线性的&#xff0c;因此我们需要做一下处理&#xff0c;才能在功能上实现环形缓冲区 …

[计算机网络]--I/O多路转接之poll和epoll

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、poll函…

web漏洞与规避

文章目录 一、XSS 跨站脚本攻击1.1 XSS攻击的主要类型反射型XSS存储型XSSDOM型XSS 1.2 前端开发如何应对XSS 二、CSRF 跨站请求伪造2.1 CSRF例子2.2 前端开发如何应对CSRF 三、SQL 注入3.1 前端如何防御SQL注入 四、前端如何使用CSP 一、XSS 跨站脚本攻击 攻击者通过在受害者的…

stm32学习笔记:IIC通信(未完)

概述 第一块&#xff1a;介绍协议规则&#xff0c;然后用软件模拟的形式来实现协议。 第二块&#xff1a;介绍STM32的iic外设&#xff0c;然后用硬件来实现协议。 程序一现象&#xff1a;通过软件I2C通信&#xff0c;对MPU6050芯片内部的寄存器进行读写&#xff0c;写入到配…

【Synchronized同步原理】

Synchronized同步原理 1. synchronized的使用&#xff1f;2. 如何保证线程安全的&#xff1f;3.可重入原理&#xff08;加锁次数计数器&#xff09;4. 原子性和可见性(顺序性) 1. synchronized的使用&#xff1f; 对象锁方法锁类锁 2. 如何保证线程安全的&#xff1f; publi…

关于数据提交上传服务端的数据类型以及项目打包上线的流程

1 请求头的类型&#xff1a; content-type&#xff1b; 01: application/json 数据以json格式请求&#xff1a;{"key":"value"} 02: application/x-www.form-urlencoded from表单的数据格式 name"zs"&age12 03 mutipart/form-data…

重学SpringBoot3-自动配置机制

重学SpringBoot3-自动配置机制 引言Spring Boot 自动配置原理示例&#xff1a;Spring Boot Web 自动配置深入理解总结相关阅读 引言 Spring Boot 的自动配置是其最强大的特性之一&#xff0c;它允许开发者通过最少的配置实现应用程序的快速开发和部署。这一切都得益于 Spring …

OmniPlan Pro mac版:简单、智能,项目管理新选择!

OmniPlan Pro是一款功能强大的项目管理软件&#xff0c;它以其直观的用户界面和丰富的功能&#xff0c;帮助用户轻松管理各种复杂的项目。无论是个人任务还是团队协作&#xff0c;OmniPlan Pro都能提供全面的解决方案&#xff0c;让项目管理变得更加简单高效。 OmniPlan Pro软…

从0开始回顾Mysql --- MySQL初体验

大白话从0开始回顾MySQL&#xff0c;去除了一些繁琐的操作的演示以及内容&#xff0c;如MySQL安装等&#xff0c;本篇文章适合复习MySQL语法&#xff0c;学习MySQL语句&#xff0c;对MySQL不太熟练的同学&#xff0c;希望对大家有一些帮助。 MySQL初体验 首先&#xff0c;我将…

如何在Window系统部署VisualSVN服务并结合cpolar实现无公网ip远程访问

文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写&#xff0c;是一个开放源代码的版本控制系统…

数字孪生与智慧交通的融合发展:推动交通行业数字化转型,构建智慧城市新生态

随着信息技术的快速发展和城市化进程的深入推进&#xff0c;交通行业正面临着前所未有的机遇与挑战。传统的交通管理模式已难以满足日益增长的交通需求&#xff0c;而数字化转型则成为了推动交通行业创新发展的必由之路。数字孪生技术作为一种前沿的信息技术手段&#xff0c;为…

基于springboot+vue的公寓报修管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…