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

目录

  • 例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模块如何驱动智能家居革命。 设备互…

1027 打印沙漏

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”&#xff0c;要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”&#xff0c;是指每行输出奇数个符号&#xff1b;各行符号中心对齐&#xff1b;相邻两行符号数差2&#xff1b;符号数先从大到…

多线程:线程通信

线程通信 什么是线程通信 当多个线程共同操作共享的资源时&#xff0c;线程间通过某种方式互相告知自己的的状态&#xff0c;以相互协调&#xff0c;并避免无效的资源争夺。 线程通信的常见模型&#xff08;生产者与消费者模型&#xff09; 生产者线程负责生产数据消费者线…

对抽象工厂模式的理解

目录 1 背景1.1 题目描述1.2 输入描述1.3 输出描述1.4 输入示例1.5 输出示例 2 抽象工厂模式3 思考3.1 我的实现3.2 什么时候用抽象工厂模式&#xff1f;&#xff08;怎么用才是合适的&#xff1f;&#xff09;3.3 [更好的例子](https://refactoringguru.cn/design-patterns/ab…

【探索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 …

cobalt strike钓鱼lnk报错:无法连接到远程服务器

笔者在学习 cobalt strike 制作钓鱼文件时发现多次失败&#xff0c;在 win10 虚拟机的 powershell 的多次排查后发现这样一个报错&#xff1a; 使用“1”个参数调用“DownloadString”时发生异常:“无法连接到远程服务器“ 经过多次排查后发现问题出在 cs 的 team server上&…

解决:Glide 在回调中再次加载图片报错

一、问题说明 Glide 加载图片时监听了回调&#xff0c;并在失败时再次加载其它图片后报错。 代码&#xff1a; Glide.with(mContext).load(imgTeacher).listener(new RequestListener<Drawable>() {Overridepublic boolean onLoadFailed(Nullable GlideException e, O…

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 …