文件操作(二)

 =͟͟͞͞🏀前言上一篇我们加们讲了什么是文件,为什么使用文件,以及流的概念。我们继续接上一篇来继续讲解我们的文件操作,这一篇将会详细的讲如何对文件进行读写。

目录

🚀一.文件的顺序读写

1.fgetc和fputc

2.fgets和fputs 

3. fscanf和fprintf 

4. fread和fwerite

✈️二.文件的随机读写 

1.fseek

2.ftell 

3.rewind 

🌈三.结言


🚀一.文件的顺序读写

在文件操作中我们如下几种方式进行读写:

函数名功能适用于
fgetc字符输入函数所有输入流
fputc字符输出函数所有输入流
fgets文本行输入函数所有输入流
fputs文本行输出函数所有输入流
fscanf格式化输入函数所有输入流
fprintf格式化输出函数

所有输入流

fread二进制输入文件
fwrite二进制输出文件

这些函数分别两两一组,下面来详细的介绍一下他们吧! 

1.fgetc和fputc

int character:像文件中传入的数据。

FILE * stream:指向文件的流。

FILE * stream:指向文件的流。

int main()
{//打开文件FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror(fopen);}//文件操作char ch = 0;scanf("%c", &ch);fputc(ch, pf);//关闭文件fclose(pf);pf=NULL;return 0;
}

fputc就是向文件中输出一个指定的字符。而fgetc就是从文件中输出一个字符。

int main()
{//打开文件FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror(fopen);}//文件操作char ch = 0;ch=fgetc(pf);printf("%c\n", ch);//scanf("%c", &ch);//fputc(ch, pf);//关闭文件fclose(pf);pf=NULL;return 0;
}

这就是fputc与fgetc的作用了。

2.fgets和fputs 

const char*str:像文件中输入文本的地址。

FILE * stream:指向文件的流。

char*str:接收文本的地址。

int num:接受文本的个数。

FILE * stream:指向文件的流。

fputs的使用:

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

fgets的使用:

int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror(fopen);}char arr[10] = { 0 };fgets(arr,6,pf);printf("%s\n", arr);fclose(pf);pf = NULL;return 0;
}

3. fscanf和fprintf 

看到这一对函数我们是不是首先就想到了我们常用的scanf和printf那他们有什么区别呢?

 可以看到相比之下fprintf多了一个参数也就是我们上面提到的指向文件的流。那么使用的话只需要在前面加上这个参数即可。 

fprintf的使用:

struct stu
{char name[20];int age;float score;
};
int main()
{struct stu stu1 = { "zhangsan",18,90.5 };FILE* pf=fopen("test.txt", "w");if (pf == NULL){perror(fopen);return 1;}fprintf(pf, "%s %d %.1f", stu1.name, stu1.age, stu1.score);fclose(pf);pf = NULL;return 0;
}

我们可以看到fprintf就是将一个格式化的东西向文件中输出,那么fprintf也就是从文件向外面输出了。 

同样也是fscanf多了我们上面提到的指向文件的流。

fscanf的使用:

struct stu
{char name[20];int age;float score;
};int main()
{struct stu s = { 0 };FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror(fopen);return 1;}fscanf(pf, "%s %d %f", s.name, &(s.age),&(s.score));fprintf(stdout, "%s %d %.1f", s.name, s.age, s.score);return 0;
}

4. fread和fwerite

 const void * ptr:输入内容的地址。

size_t size:单个输入内容的大小。

size_t count:输入内容的数量。

 FILE * stream:指向文件的流。

 void * ptr:输出内容的地址。

size_t size:单个输出内容的大小。

size_t count:输出内容的数量。

FILE * stream:指向文件的流。

他们两个也就是对二进制进行的文件操作函数。

fwrite的使用:

struct stu
{char name[20];int age;float score;
};int main()
{struct stu stu1 = { "zhangsan",18,90.5 };FILE* pf=fopen("test.txt", "w");if (pf == NULL){perror(fopen);return 1;}fwrite(&stu1, sizeof(stu1), 1, pf);fclose(pf);pf = NULL;return 0;
}

 我们可以看到文件出现了一些看不懂的乱码(由于字符的二进制储存与文本储存方式相同都是一ASCII码的形式),也就是说这就是以二进制存储的内容。 

fread的使用:

struct stu
{char name[20];int age;float score;
};int main()
{struct stu s = { 0 };FILE* pf = fopen("test.txt", "rb");if (pf == NULL){perror(fopen);return 1;}fread(&s,sizeof(s),1,pf);printf("%s %d %.1f", s.name, s.age, s.score);fclose(pf);pf = NULL;return 0;
}

✈️二.文件的随机读写 

说到随机我们可能会想到我们的rand函数,产生一个随机数。那么我们的随机读写是在任意一个地方去读写吗?其实不是的,随机读写指的是有很大的主观性,我们可以在我们想要读写的地方读写。接下来我们会认识到三个函数分别是fseek,ftell以及rewind。

1.fseek

 FILE * stream:指向文件的流。

long int offest:偏移量。

int origin:偏移的地点。(第二张图片的内容)

SEEK_SET:文件起始位置。

SEEK_CUR:光标所在的位置。

SEEK_END;文件末尾位置。

int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror(fopen);return 1;}fseek(pf,2, SEEK_SET);int ch = fgetc(pf);printf("%c\n", ch);return 0;
}

2.ftell 

在了解了我们的fseek函数之后我们应该怎么去找我们的光标在哪里呢?或者是说偏移量是多少?我们的ftell函数也就整好解决了这个问题。

ftell:返回⽂件指针相对于起始位置的偏移量。

这个函数就简单多了只有一个流的参数。

ftell的使用:

int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror(fopen);return 1;}fseek(pf,2, SEEK_SET);int ch = fgetc(pf);int count = ftell(pf);printf("%c\n", ch);printf("count的值是%d\n", count);return 0;
}

3.rewind 

这个函数与ftell的参数的相同。作用是将光标回到文件的起始位置。

rewind的使用:

int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror(fopen);return 1;}fseek(pf,2, SEEK_SET);int ch = fgetc(pf);int count = ftell(pf);printf("%c\n", ch);printf("count的值是%d\n", count);rewind(pf);count = ftell(pf);printf("rewind之后count的值是%d\n", count);return 0;
}

🌈三.结言

我们的文件操作大体就介绍完了,如果有喜欢的可以三连哦!!欢迎大家互相探讨,博主会经常发布一些编程语言上的知识以及题,感谢大家的支持!!  =͟͟͞͞💌=͟͟͞͞💌=͟͟͞͞💌

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

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

相关文章

【ROS2简单例程】基于python的发布订阅实现

1、自定义消息类型Student 1.1 创建base_interfaces_demo包 1.2 创建Student.msg文件 string name int32 age float64 height 1.2 在cmakeLists.txt中增加如下语句 #增加自定义消息类型的依赖 find_package(rosidl_default_generators REQUIRED) # 为接口文件生成源代码 ro…

Shell中cp和mv命令说明

在Shell(如Bash)中,cp 和 mv 是两个常用的命令,用于处理文件和目录。它们的用法和作用如下: cp 命令 作用:cp(copy的缩写)用于复制文件或目录。基本用法:cp [选项] 源文…

【OJ】环形链表

目录 1. 环形链表||(142)1.1 题目描述1.2 题目分析1.3 代码 2. 环形链表(141)2.1 题目描述2.2 题目分析2.3 代码 1. 环形链表||(142) 1.1 题目描述 1.2 题目分析 带环链表:尾节点的next指向链…

ROS OpenCV ROI

在图像处理和计算机视觉领域,ROI(Region of Interest)是一个核心概念,它指的是从原始图像中定义出的特定区域,该区域对于后续的分析、处理或操作具有特别的意义。 ROI的选择通常基于应用需求,例如目标检测…

【Rust日报】Xilem 项目在 2024 年的计划

Xilem 项目在 2024 年的计划 2024 年,Xilem 项目备受关注。Google Fonts 将资助四位开源贡献者:Aaron Muir Hamilton、Daniel McNab、Matt Campbell 和 Olivier Faure,他们将主导项目的不同方面。Aaron 将专注于文本布局和 Android 集成&…

Python异步网络编程库之twisted 详解

概要 Python twisted 是一个强大的异步网络编程框架,它允许开发者轻松构建高性能的网络应用和协议。无论是构建网络服务器、客户端、聊天应用还是实时通信工具,twisted 都提供了丰富的工具和组件。本文将深入探讨 twisted 的基本概念、安装方法以及详细…

Python常用日期函数和日期处理方法

Python常用日期函数和日期处理方法 Python常用的日期处理函数使用案例, 和一些简单的日期处理方法(持续更新) 1. 使用time获取当前的日期和时间 import time from time import gmtime, strftimet time.localtime() print (t) # time.struct_time(tm_year2024, tm_mon1, tm…

sql | 学生参加各科考试次数

学生表: Students------------------------ | Column Name | Type | ------------------------ | student_id | int | | student_name | varchar | ------------------------ 在 SQL 中,主键为 student_id(学生ID)。 该表内的每…

What is `@PathVariable` does?

PathVariable 是SpringMVC中的注解,用于将HTTP请求的URI路径变量映射到Controller方法参数上。 当URL路径中包含占位符(由大括号 {} 包围的部分)时,可以使用此注解来绑定这些动态部分到方法参数。 使用样例 获取单个路径变量 …

在控制理论里,单个输入变量被施加了饱和特性处理,那么后续怎么利用李雅普诺夫判据判断系统稳定性呢?

在控制理论中,当一个系统的输入变量被施加了饱和特性(即输入被限制在某个范围内),系统的稳定性分析可能变得更复杂。使用李雅普诺夫方法判断这样的系统稳定性通常需要考虑非线性特性。下面是如何使用李雅普诺夫方法进行稳定性分析…

多机TCP通讯之hello world(C++)

文章目录 TCP是什么准备工作CMakeLists.txt服务端代码客户端代码参考 TCP是什么 TCP(传输控制协议)是一种在计算机网络中广泛使用的协议,它提供了可靠的、面向连接的数据传输服务。TCP 是 OSI 模型中的传输层协议,它确保了数据的…

[NAND Flash 6.4] NAND FLASH基本读操作及原理_NAND FLASH Read Operation源码实现

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< ​全文 6000 字 内容摘要 NAND Flash 引脚功能 读操作步骤 NAND Flash中的特殊硬件结构 NAND Flash 读写时的数据流向 Read 操作时序 读时序操作过…

第 11 章 树结构实际应用

文章目录 11.1 堆排序11.1.1 堆排序基本介绍11.1.2 堆排序基本思想11.1.3 堆排序步骤图解说明11.1.4 堆排序代码实现 11.2 赫夫曼树11.2.1 基本介绍11.2.2 赫夫曼树几个重要概念和举例说明11.2.3 赫夫曼树创建思路图解11.2.4 赫夫曼树的代码实现 11.3 赫夫曼编码11.3.1 基本介绍…

【NI国产替代】USB‑7846 Kintex-7 160T FPGA,500 kS/s多功能可重配置I/O设备

Kintex-7 160T FPGA&#xff0c;500 kS/s多功能可重配置I/O设备 USB‑7846具有用户可编程FPGA&#xff0c;可用于高性能板载处理和对I/O信号进行直接控制&#xff0c;以确保系统定时和同步的完全灵活性。 您可以使用LabVIEW FPGA模块自定义这些设备&#xff0c;开发需要精确定时…

【GitHub项目推荐--13 个 Python 学习资源】【转载】

近些年&#xff0c;人工智能应用铺天盖地。人脸识别、老照片复活、换脸等应用都得益于人工智能算法。 许多人工智能算法封装的框架基于 Python 语言&#xff0c;这也导致了 Python 的热度只增不减。 Python 简单易学&#xff0c;根据 2020 年 StackOverflow 开发者调查报告显…

智能路由器中的 dns.he.net可使用自定义域名的免费 DDNS 服务配置方法

今天介绍的这个是可以使用自定义域名同时支持使用二级域名的免费DDNS服务 dns.he.net的动态DDNS服务的配置方法, 这个服务相对还是比较稳定的, 其配置也和其他的DDNS服务有些不太一样, 首先他的主机名: 这里需要设置为登录后分配的区域域名: ipv6.he.net 然后就是 DDNS 用户…

gRPC vs HTTP

性能 gRPC 消息使用 Protobuf&#xff08;一种高效的二进制消息格式&#xff09;进行序列化。 Protobuf 在服务器和客户端上可以非常快速地序列化。 Protobuf 序列化产生的有效负载较小&#xff0c;这在移动应用等带宽有限的方案中很重要。 gRPC 专为 HTTP/2&#xff08;HTTP…

浅谈Vue2与Vue3的双向绑定原理的理解

一、Vue2双向绑定原理 Vue2使用双向绑定核心原理是基于数据劫持发布-订阅模式。一部分通过数据劫持&#xff08;Object.defineProperty()&#xff09;和Watcher类。 数据劫持&#xff1a;Vue2使用Object.defineProperty()方法劫持数据对象的属性&#xff0c;对属性getter和sett…

让一个元素水平居中的方式有哪些

今天总结一下我所遇到过的 让一个元素水平居中的方式 <!--* Author: HuKang* Date: 2023-09-19 11:07:44* LastEditTime: 2023-12-22 22:52:38* LastEditors: HuKang* Description: * FilePath: \route-planning\tempDemo.html --> <!DOCTYPE html> <html>…

案例:新闻数据加载

文章目录 介绍相关概念相关权限约束与限制完整示例 代码结构解读构建主界面数据请求下拉刷新总结 介绍 本篇Codelab是基于ArkTS的声明式开发范式实现的样例&#xff0c;主要介绍了数据请求和touch事件的使用。包含以下功能&#xff1a; 数据请求。列表下拉刷新。列表上拉加载…