当前位置: 首页 > news >正文

两小时让你全方位的认识文件(一)

想必友友们在生活中经常会使用到各种各样的文件,那么我们是否了解它其中的奥秘呢,今天阿博就带领友友们深入地走入文件🛩️🛩️🛩️

文章目录

    • 一.为什么使用文件
    • 二.什么是文件
    • 三.文件的打开和关闭
    • 四.文件的顺序读写

一.为什么使用文件

二.什么是文件

三.文件的打开和关闭

四.文件的顺序读写

一.为什么使用文件

我们在生活中会应用到一些信息,应该把信息记录下来,只有我们自己选择删除数据的时候,数据才不复存在。这就涉及到了数据持久化的问题,我们一般数据持久化的方法有:把数据存放在磁盘文件、存放到数据库等方式。使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。

二.什么是文件

磁盘上的文件是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。
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–>把格式化的数据转换成字符串

好了友友们,本期内容讲到这里就结束了,下期阿博会完结文件知识,码字不易,可以给阿博点个关注哦,让我们下期再见💐💐💐

相关文章:

两小时让你全方位的认识文件(一)

想必友友们在生活中经常会使用到各种各样的文件&#xff0c;那么我们是否了解它其中的奥秘呢&#xff0c;今天阿博就带领友友们深入地走入文件&#x1f6e9;️&#x1f6e9;️&#x1f6e9;️ 文章目录 一.为什么使用文件二.什么是文件三.文件的打开和关闭四.文件的顺序读写 一…...

基于Java+Springboot+vue网上商品订单转手系统设计和实现

基于JavaSpringbootvue网上商品订单转手系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式…...

旅游-商场购物

标题 前言必学场景词汇及用法售货员接待促销活动选购商品询问材质与质量试穿衣服杀价修改衣服结账售后服务退换货情境常用单词化妆品类别护肤品类别护肤品功能前言 加油 必学场景词汇及用法 售货员接待 1.be of service to sb 服务某人 Hello, ma’am. Could I be of serv…...

毕业论文用什么流程图软件比较好?

在写作论文的时候使用流程图&#xff0c;会让我们的论文看起来更加有逻辑。并且流程图的图片都可以在PPT中随意插入以及使用。 基础流程图作为最为基本和简单的的流程图方式&#xff0c;一般不区分用户角色和场景&#xff0c;适用于简单场景&#xff0c;梳理单一的流程情况&am…...

算法刷题|70.爬楼梯(进阶)、322.零钱兑换、279.完全平方数

爬楼梯&#xff08;进阶&#xff09; 题目&#xff1a;假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 思路&#xff1a;本题也可以抽象成完全背包的问题&#xff0c;背包就是总共多少阶台阶&am…...

【MCS-51】51单片机结构原理

至今为止&#xff0c;MCS-51系列单片机有许多种型号的产品&#xff1a;其中又分为普通型51&#xff08;8031、8051、89S51&#xff09;和增强型52&#xff08;8032、8052、89S52等&#xff09;。它们最大的区别在于存储器配置各有差异。下面我举例子的都是8051这一系列的单片机…...

软件测试技术之如何编写测试用例(3)

14、对于类似于手机版淘宝这种软件&#xff0c;它拥有客户端&#xff0c;服务器端还有一个后台管理系统类似于进销存管理系统&#xff0c;我如何设计测试用例才能保证功能的完全覆盖&#xff1f;他们之间的交互如何设计测试用例&#xff1f; 专家分析&#xff1a;对于复合型的…...

移远通信笔试题

限时60分钟 1.下列关于栈叙述正确的是 A A) 栈顶元素最先能被删除 B&#xff09;栈顶元素最后才能被删除 C&#xff09;栈底元素永远不能被删除 D&#xff09;以上三种都不对 在栈中&#xff0c;最后被压入的元素总是在栈顶上方&#xff0c;而栈顶元素总是最先被弹出的元…...

python算法中的机器学习算法之监督学习知识点(详解)

目录 学习目标: 学习内容: Ⅰ. 线性回归(Linear Regression) Ⅱ. 逻辑回归(Logistic Regression)...

Flink主要有两种基础类型的状态:keyed state

Flink主要有两种基础类型的状态&#xff1a;keyed state 和operator state。 Keyed State Keyed State总是和keys相关&#xff0c;并且只能用于KeyedStream上的函数和操作。 你可以将Keyed State视为是已经被分片或分区的Operator State&#xff0c;每个key都有且仅有一个状态分…...

js录音支持h5 pc ios android

最近在做h5录音的页面要求可暂停录音,继续录音&#xff0c;写好后发现不兼容ios,无奈只能找兼容方法&#xff0c;找了一天也没找到&#xff0c;后来看到一个网站在ios上可以暂停录音&#xff0c;后来引入他的js文件果然能用了 网站放下面了 Recorder H5: 用于html5网页中的前…...

mybatis04-mybatis缓存、分页插件、注解开发(一对一、多对一、多对多)

mybatis04 mybatis 缓存 一、mybatis 缓存概述 1、缓存 ​ 缓存 是存在于内存中的临时数据&#xff0c;使用缓存的目的是&#xff1a;减少和数据库的交互次数&#xff0c;提高执行效率。 2、mybatis 缓存 ​ mybatis 与 大多数的持久层框架一样&#xff0c;提供了缓存策略…...

软件平台接口常见问题汇总

接口常见问题汇总 一、接口技术层面 1、输入参数验证校验不全面。如&#xff1a; 1.1入参数据类型长度边界&#xff0c;范围边界。 1.2 入参数据内容、成员内容&#xff0c;有效无效&#xff0c;合法非法。 1.3 入参数据 特殊字符 敏感字符过滤。 1.4 入参可否必选。 2、接口…...

SparkStreaming学习之——无状态与有状态转化、遍历kafka的topic消息、WindowOperations

目录 一、状态转化 二、kafka topic A→SparkStreaming→kafka topic B (一)rdd.foreach与rdd.foreachPartition (二)案例实操1 1.需求&#xff1a; 2.代码实现&#xff1a; 3.运行结果 (三)案例实操2 1.需求&#xff1a; 2.代码实现&#xff1a; 3.运行结果 三、W…...

上市公司碳排放测算数据(1992-2022年)

根据《温室气体核算体系》&#xff0c;企业的碳排放可以分为三个范围。 范围一是直接温室气体排放&#xff0c;产生于企业拥有或控制的排放源&#xff0c;例如企业拥有或控制的锅炉、熔炉、车辆等产生的燃烧排放&#xff1b;拥有或控制的工艺设备进行化工生产所产生的排放。 范…...

Springboot 整合 JPA 及 Swagger2

首先是官方文档&#xff1a; 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 文件&#xff0c;可以直接进行复制粘贴&a…...

android aidl

本文只是记录个人学习aidl的实现&#xff0c;如需学习请参考下面两篇教程 官方文档介绍Android 接口定义语言 (AIDL) | Android 开发者 | Android Developers 本文参考文档Android进阶——AIDL详解_android aidl_Yawn__的博客-CSDN博客 AIDL定义&#xff1a;Android 接口…...

MYSQL---主从同步概述与配置

一、MYSQL主从同步概述 1、什么是MySQL主从同步&#xff1f; 实现数据自动同步的服务结构 主服务器(master): 接受客户端访问连接 从服务器(slave)&#xff1a;自动同步主服务器数据 2、主从同步原理 Maste&#xff1a;启用binlog 日志 Slave&#xff1a;Slave_IO: 复制master主…...

WebClient学习

1. 介绍 Java中传统的RestTemplate 的主要问题在于不支持响应式流规范&#xff0c;也就无法提供非阻塞式的流式操作。而WebClient是响应式、非阻塞的客户端&#xff0c;属于Spring5中的spring-webflux库 2. 依赖 maven依赖 <dependency><groupId>org.springfra…...

「计算机控制系统」6. 直接设计法

特殊类型系统的最小拍无差设计 一般系统的最小拍无差设计 最小拍控制器的工程化改进 Dahlin算法 文章目录 特殊类型系统的最小拍无差设计理论分析典型输入函数的最小拍无差系统 一般系统的最小拍无差设计有波纹最小拍无差设计无波纹最小拍无差设计 最小拍控制器的工程化改进针对…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...