两小时让你全方位的认识文件(一)
想必友友们在生活中经常会使用到各种各样的文件,那么我们是否了解它其中的奥秘呢,今天阿博就带领友友们深入地走入文件🛩️🛩️🛩️
文章目录
- 一.为什么使用文件
- 二.什么是文件
- 三.文件的打开和关闭
- 四.文件的顺序读写
一.为什么使用文件
二.什么是文件
三.文件的打开和关闭
四.文件的顺序读写
一.为什么使用文件
我们在生活中会应用到一些信息,应该把信息记录下来,只有我们自己选择删除数据的时候,数据才不复存在。这就涉及到了数据持久化的问题,我们一般数据持久化的方法有:把数据存放在磁盘文件、存放到数据库等方式。使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。
二.什么是文件
磁盘上的文件是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。
1.程序文件:包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。
2.数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
3.文件名:文件名包含3部分:文件路径+文件名主干+文件后缀,例如: c:\code\test.txt,这c:\code\就是文件路径,test就是文件名主干,.txt就是文件后缀
这里阿博在画图给友友们直观看一下它们的联系

三.文件的打开和关闭
首先给友友们介绍一下文件指针
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名FILE.每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。一般都是通过一个
FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件.
图解分析

ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件。




这里阿博给友友们总结一些比较常见的文件打开方式👀👀

代码解析
int main()
{FILE* pf = fopen("text.txt", "w");//FILE* pf = fopen("text.txt", "r");if (pf == NULL){perror("fopen");return;}fclose(pf);pf = NULL;return 0;
}

看吧,友友们,产生了一个新的文件,如果我们这里把这个文件删除,再用“r”的形式打开,让我们看看效果吧👻👻

这就是打开方式“r”和“w”的区别
刚才是相对路径下的文件,如果我们想打开桌面上的文件该如何处理呢
首先友友们用鼠标右击这个文件,找到属性,就能看到它的路径了

代码解析
int main()
{//FILE* pf = fopen("C:\Users\86166\Desktop.txt", "r");FILE* pf = fopen("C:\\Users\\86166\\Desktop.txt", "w");if (pf == NULL){perror("fopen");return;}fclose(pf);pf = NULL;return 0;
}
因为\t是转义字符,所以我们在加上一个斜杠,斜杠转义斜杠,这样它就是一个正常的斜杠了


所以友友们我们可以得出一个结论,如果文件里面有内容的话,当以“w”的形式打开时,它会把文件里面的内容销毁掉,创建一个新的文件
四.文件的顺序读写
又到了传授内功的环节了🥷🥷

fputc的功能

代码解析
int main()
{FILE* pf = fopen("text.txt", "w");if (pf == NULL){perror("fopen");return;}//读文件//把26个英文字母写到文件中int i = 0;for (i = 0; i < 26; i++){fputc('a'+i, pf);}fclose(pf);pf = NULL;return 0;
}

友友们,这就是写文件操作,让我们见识一下读文件操作吧
fgetc的功能

代码解析
int main()
{FILE* pf = fopen("text.txt", "r");if (pf == NULL){perror("fopen");return;}int ch = 0;for (int i = 0; i < 26; i++){ch = fgetc(pf);printf("%c ", ch);}fclose(pf);pf = NULL;return 0;
}

疑惑解析

fputs的功能

代码解析
int main()
{FILE* pf = fopen("text.txt", "w");if (pf == NULL){perror("fopen");return;}fputs("i love you", pf);fclose(pf);pf = NULL;return 0;
}

友友们,这就是写一行数据,下面让我们测试一下读一行数据吧
fgets的功能

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

注意了友友们,这里虽然我们让它读10个字符,但实际上最多读9个,因为它最后一个位置需要放\0
fprintf的功能

代码解析
#include<stdio.h>
struct S
{int n;float f;char arr[20];
};
int main()
{struct S s = { 100,3.14f,"zhangsan" };FILE* pf = fopen("text.txt", "w");if (pf == NULL){perror("fopen");return;}fprintf(pf, "%d %f %s\n", s.n, s.f, s.arr);fclose(pf);pf = NULL;return 0;
}

友友们,这就是我们的写文件操作,接下来我们来看看读文件操作
fscanf的功能

代码解析
struct S
{int n;float f;char arr[20];
};
int main()
{struct S s = {0};FILE* pf = fopen("text.txt", "r");if (pf == NULL){perror("fopen");return;}fscanf(pf, "%d %f %s\n", &(s.n),&(s.f), s.arr);printf("%d %f %s", s.n, s.f, s.arr);fclose(pf);pf = NULL;return 0;
}

友友们,这里阿博给大家总结一下流的类型和概念😊😊

sprintf的功能

功能:把一个格式化的数据写到字符串中(把一个格式化的数据转换成字符串)
sscanf的功能

功能:把一个字符串转换成对应的格式化数据
代码解析
struct S
{int n;float f;char arr[20];
};
int main()
{struct S s = { 200,3.5f,"wangwu" };//把一个结构体转换成字符串char arr[200] = { 0 };sprintf(arr, "%d %f %s\n", s.n, s.f, s.arr);printf("字符串的数据:%s\n", arr);struct S temp = { 0 };sscanf(arr, "%d %f %s\n", &(temp.n) ,&(temp.f), temp.arr);printf("格式化的数据:%d %f %s\n", temp.n, temp.f, temp.arr);return 0;
}

这里阿博给友友们总结一下
scanf–>针对标准输入流(stdin)的格式化的输入函数
printf–>针对标准输出流(stdout)的格式化的输出函数
fscanf–>针对所有输入流(文件流/stdin)的格式化的输入函数
fprintf–>针对所有输出流(文件流/stdout)的格式化的输出函数
sscanf–>把字符串转换成格式化的数据
sprintf–>把格式化的数据转换成字符串
| 好了友友们,本期内容讲到这里就结束了,下期阿博会完结文件知识,码字不易,可以给阿博点个关注哦,让我们下期再见💐💐💐 |
相关文章:
两小时让你全方位的认识文件(一)
想必友友们在生活中经常会使用到各种各样的文件,那么我们是否了解它其中的奥秘呢,今天阿博就带领友友们深入地走入文件🛩️🛩️🛩️ 文章目录 一.为什么使用文件二.什么是文件三.文件的打开和关闭四.文件的顺序读写 一…...
基于Java+Springboot+vue网上商品订单转手系统设计和实现
基于JavaSpringbootvue网上商品订单转手系统设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式…...
旅游-商场购物
标题 前言必学场景词汇及用法售货员接待促销活动选购商品询问材质与质量试穿衣服杀价修改衣服结账售后服务退换货情境常用单词化妆品类别护肤品类别护肤品功能前言 加油 必学场景词汇及用法 售货员接待 1.be of service to sb 服务某人 Hello, ma’am. Could I be of serv…...
毕业论文用什么流程图软件比较好?
在写作论文的时候使用流程图,会让我们的论文看起来更加有逻辑。并且流程图的图片都可以在PPT中随意插入以及使用。 基础流程图作为最为基本和简单的的流程图方式,一般不区分用户角色和场景,适用于简单场景,梳理单一的流程情况&am…...
算法刷题|70.爬楼梯(进阶)、322.零钱兑换、279.完全平方数
爬楼梯(进阶) 题目:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 思路:本题也可以抽象成完全背包的问题,背包就是总共多少阶台阶&am…...
【MCS-51】51单片机结构原理
至今为止,MCS-51系列单片机有许多种型号的产品:其中又分为普通型51(8031、8051、89S51)和增强型52(8032、8052、89S52等)。它们最大的区别在于存储器配置各有差异。下面我举例子的都是8051这一系列的单片机…...
软件测试技术之如何编写测试用例(3)
14、对于类似于手机版淘宝这种软件,它拥有客户端,服务器端还有一个后台管理系统类似于进销存管理系统,我如何设计测试用例才能保证功能的完全覆盖?他们之间的交互如何设计测试用例? 专家分析:对于复合型的…...
移远通信笔试题
限时60分钟 1.下列关于栈叙述正确的是 A A) 栈顶元素最先能被删除 B)栈顶元素最后才能被删除 C)栈底元素永远不能被删除 D)以上三种都不对 在栈中,最后被压入的元素总是在栈顶上方,而栈顶元素总是最先被弹出的元…...
python算法中的机器学习算法之监督学习知识点(详解)
目录 学习目标: 学习内容: Ⅰ. 线性回归(Linear Regression) Ⅱ. 逻辑回归(Logistic Regression)...
Flink主要有两种基础类型的状态:keyed state
Flink主要有两种基础类型的状态:keyed state 和operator state。 Keyed State Keyed State总是和keys相关,并且只能用于KeyedStream上的函数和操作。 你可以将Keyed State视为是已经被分片或分区的Operator State,每个key都有且仅有一个状态分…...
js录音支持h5 pc ios android
最近在做h5录音的页面要求可暂停录音,继续录音,写好后发现不兼容ios,无奈只能找兼容方法,找了一天也没找到,后来看到一个网站在ios上可以暂停录音,后来引入他的js文件果然能用了 网站放下面了 Recorder H5: 用于html5网页中的前…...
mybatis04-mybatis缓存、分页插件、注解开发(一对一、多对一、多对多)
mybatis04 mybatis 缓存 一、mybatis 缓存概述 1、缓存 缓存 是存在于内存中的临时数据,使用缓存的目的是:减少和数据库的交互次数,提高执行效率。 2、mybatis 缓存 mybatis 与 大多数的持久层框架一样,提供了缓存策略…...
软件平台接口常见问题汇总
接口常见问题汇总 一、接口技术层面 1、输入参数验证校验不全面。如: 1.1入参数据类型长度边界,范围边界。 1.2 入参数据内容、成员内容,有效无效,合法非法。 1.3 入参数据 特殊字符 敏感字符过滤。 1.4 入参可否必选。 2、接口…...
SparkStreaming学习之——无状态与有状态转化、遍历kafka的topic消息、WindowOperations
目录 一、状态转化 二、kafka topic A→SparkStreaming→kafka topic B (一)rdd.foreach与rdd.foreachPartition (二)案例实操1 1.需求: 2.代码实现: 3.运行结果 (三)案例实操2 1.需求: 2.代码实现: 3.运行结果 三、W…...
上市公司碳排放测算数据(1992-2022年)
根据《温室气体核算体系》,企业的碳排放可以分为三个范围。 范围一是直接温室气体排放,产生于企业拥有或控制的排放源,例如企业拥有或控制的锅炉、熔炉、车辆等产生的燃烧排放;拥有或控制的工艺设备进行化工生产所产生的排放。 范…...
Springboot 整合 JPA 及 Swagger2
首先是官方文档: Spring Data JPA - Reference Documentationhttps://docs.spring.io/spring-data/jpa/docs/2.2.4.RELEASE/reference/html/#repositories.query-methods 1、JPA相关概念 2、创建 Springboot 项目 修改 pom 文件,可以直接进行复制粘贴&a…...
android aidl
本文只是记录个人学习aidl的实现,如需学习请参考下面两篇教程 官方文档介绍Android 接口定义语言 (AIDL) | Android 开发者 | Android Developers 本文参考文档Android进阶——AIDL详解_android aidl_Yawn__的博客-CSDN博客 AIDL定义:Android 接口…...
MYSQL---主从同步概述与配置
一、MYSQL主从同步概述 1、什么是MySQL主从同步? 实现数据自动同步的服务结构 主服务器(master): 接受客户端访问连接 从服务器(slave):自动同步主服务器数据 2、主从同步原理 Maste:启用binlog 日志 Slave:Slave_IO: 复制master主…...
WebClient学习
1. 介绍 Java中传统的RestTemplate 的主要问题在于不支持响应式流规范,也就无法提供非阻塞式的流式操作。而WebClient是响应式、非阻塞的客户端,属于Spring5中的spring-webflux库 2. 依赖 maven依赖 <dependency><groupId>org.springfra…...
「计算机控制系统」6. 直接设计法
特殊类型系统的最小拍无差设计 一般系统的最小拍无差设计 最小拍控制器的工程化改进 Dahlin算法 文章目录 特殊类型系统的最小拍无差设计理论分析典型输入函数的最小拍无差系统 一般系统的最小拍无差设计有波纹最小拍无差设计无波纹最小拍无差设计 最小拍控制器的工程化改进针对…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
