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

文件操作相关的精讲

目录:
思维导图
一. 文件定义
二. 文件的打开和关闭
三. 文件的顺序读写操作
四. 文件的随机读写操作
五. 文本文件和二进制文件
六. 文件读取结束的判断
七.文件缓冲区

 

思维导图:

一. 文件定义
1.文件定义

C语言中,文件是指一组相关数据的集合。

不知道大家是否注意到这样的问题:当我们执行一个程序的时候,数据并不会消失,但是当我们程序退出,那么数据就会消失,这是为啥???

当我们运行程序的时候,数据都是加载到内存上的,这样的运行效率会更高。一旦程序退出,内存上的数据就消失了。

当我们把数据存储在磁盘上,我们可以随时随地查看数据,不会存在数据的消失问题。

文件的作用:把数据进行永久化的保存,即使程序退出,数据也是不会消失。

2. 文件分类

2.1 程序文件

包括源程序文件(后缀:.c),目标文件(Windows后缀:.obj),可执行程序(后缀:.exe)

2.2数据文件

数据文件是程序运行时读,写的数据

3.对程序与文件之间关系的理解

二. 文件的打开和关闭
1. 文件指针

在C中:定义一个FILE* (文件指针) 类型的指针,就可以对文件进行各种读和写的操作。

每一个被指定使用的文件都会有一个对应的文件信息区,用来存放当前文件的相关信息(大小,文件位置,文件状态……),这些信息都是通过一个FILE* 类型指针进行维护的。

2文件的基本操作

fopen() 第一个参数:要操作文件的名字

fopen() 函数返回值

打开文件的方式:

 

 

三. 文件的顺序读写操作
1. 相关的函数使用介绍

2. 对文件的使用操作

1)fgetc()   fputc()

 fgetc() 一旦读取失败或者是遇到文件末尾会返回一个EOF

对于fputc()函数的使用和fgetc()函数使用以及函数操作失败返回值 是一样的。

这两个函数都是对字符进行一个一个操作

使用栗子:

 2)fgets() 和 fputs()

 

 注意:

fgets() 最多只能读取num-1个字符,遇到换行符结束读取,

fgets()  fputs()只能是针对性的一行字符串进行处理

每一次打开文件的时候FILE* pf  指针都会默认指向文件内容的起始位置

3)fscanf() fprintf()

 fscanf()功能:从流里面读取格式化的数据

fprintf()功能:把格式化的数据写入流里面

使用例子

 

4)sscanf()  sprintf()

sscanf() 函数功能:从字符串里面把数据转成指定的格式化

sprintf() 函数功能: 把指定格式化的数据转换成字符串

使用例子:

 

5)fread()  fwrite()

 

 fread() 函数功能:从流里面读取数据以二进制读的方式(“rb”)

参数介绍:

ptr:把读取之后的数据存放起来

 count: 要读取的数据个数

size:  读取每一个数据大小,单位字节

stream:数据流

 fread() fwrite()函数参数基本一样;

fwrite() 函数功能:把数据写进一个流里面以二进制写的方式(“wb”)

前者功能是读取一个二进制文件,后者是对一个二进制文件进行写入数据。只不过当我们打开写入之后的这个二进制文件咱是看不懂的

四. 文件的随机读写操作

不知道大家是否注意到这样一个问题:咱们每一次打开指定的文件的时候,文件指针都会默认指向文件内容的起始位置;如果想要每次打开文件的时候在任意一行的某个位置指定呢???

1. fseek()

 

 fseek() 函数功能:根据文件指针的位置和偏移量重新定义指针的指向位置

函数返回值:成功的话,返回数值0;否则返回非0的数值

参数介绍:

stream:文件指针

offset: 偏移量(非正数即负数

origin:指定文件指针的位置

 

2. ftell()

ftell() 函数功能:返回当前指针与起始位置的偏移量。

此函数返回值:也是返回当前指针所在位置距离起始位置的偏移量 

3.rewiind()

rewind() 函数功能:让FILE*  类型的指针重新回到文件的起始位置 

 关于以上3个函数综合应用:

int main()
{int arr[10] = { 0 };FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}int ch = fgetc(pf);printf("%c\n", ch);//afseek(pf, 5, SEEK_CUR);//注意是从b这个位置偏移5个位置,指向gch = fgetc(pf);printf("%c\n", ch);//gprintf("当前指针距离起始位置的偏移量:%d\n", ftell(pf));//pf每次使用完会自动指向下一个数据的位置,此时指向hrewind(pf);//此时指针从当前位置重新回到文件的起始位置char ret[100] = "xxxxxxx";fgets(ret, 10, pf); //从pf所在位置开始最多读取9个字符放到ret这个数组printf("%s\n",ret);fclose(pf);pf = NULL;return 0;
}

运行结果:

 

五. 文本文件和二进制文件

根据数据输出的组织形式,数据文件分为文本文件和二进制文件。

数据在内存里面以二进制形式存储,当数据输出的时候不加以任何形式的转换,此时文件称之为二进制文件

但是当数据 输出的时候要求以ASCII码的形式输出到外存(硬盘),此时的文件称之为文本文件

  数据是如何存储在内存里的???

 

字符一律以ASCII形式存储
数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。

 举个例子:数据100000 以字符形式存储和以数值形式存储所占大小是不一样的

 数值类型存储占4个字节:

int main()
{int a = 100000;FILE* pf = fopen("test.txt", "wb");if (pf == NULL){perror("fopen()");return -1;}fwrite(&a, sizeof(int), 1, pf);//以数值型存储100000fclose(pf);pf = NULL;return 0;
}

 此文件是以二进制编辑方式打开的

关于如何以二进制编辑打方式开指定文件见下:

 

分析:

 100000以ASCII 形式存储占6个字节:

 

 注意:

关于数据大小(单位字节)并不是由数据是以什么形式存储在内存里决定的。

六. 文件读取结束的判断
1. feof()

对于此函数相信有很多老铁会被误导吧!

feof()函数返回值是不能用来判断文件是否读取结束滴!

feof()函数功能:

当用户自己明确知道文件已经读取结束了,调用此函数判读文件是因为读取失败而结束还是遇到文件末尾正常结束的。

1.1

对于文本文件是否读取结束滴返回值的判断应该调用函数fgetc() :对应返回值EOF

fgets()返回值:NULL

1.2

二进制文件的读取结束判断返回值是否小于实际读取的个数即可

比如:fread() 函数

2. 使用
#include <stdlib.h>int main(){int c; FILE* fp = fopen("test.txt", "r"); //读的方式打开此文件if (fp == NULL) {perror("fopen()");return -1;}while ((c = fgetc(fp)) != EOF) // 标准C I/O读取文件循环{putchar(c);}//判断是读取结束原因//fgetc() 当读取失败的时候或者遇到文件结束的时候,都会返回EOFif (ferror(fp)) // ferror() 判断是否异常结束读取的puts("I/O error when reading");else if (feof(fp))// feof() 明确知道读取结束,判断是否遇到文件末尾结束读取puts("End of file reached successfully");fclose(fp);fp = NULL;return 0;}
七.文件缓冲区

不知道各位是否想过这样一个问题:当我们从文件读取数据的时候,这些数据是瞬间就被成功读取了还是说系统有一定的处理机制呢???

对于这个问题,涉及到文件缓冲区的知识点:

ANSIC 标准采用 缓冲文件系统 处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中
为程序 中每一个正在使用的文件开辟一块 文件缓冲区

当我们从文件读取数据的时候,这些数据并不是瞬间就被读取了,而是先进入一个内存缓冲区,等到这个缓冲区达到一定条件(比如说:缓冲区满了;又或者是数据读取已经结束了等等),这些数据就会被送到程序数据区;

对于写入数据是一样的道理

相关文章:

文件操作相关的精讲

目录&#xff1a; 思维导图 一. 文件定义 二. 文件的打开和关闭 三. 文件的顺序读写操作 四. 文件的随机读写操作 五. 文本文件和二进制文件 六. 文件读取结束的判断 七.文件缓冲区 思维导图&#xff1a; 一. 文件定义 1.文件定义 C语言中&#xff0c;文件是指一组相…...

05 循环神经网络

目录 1. 基本概念 2. 简单循环网络 2.1 简单循环网络 2.2 长程依赖问题 3. 循环神经网络的模式与参数学习 3.1 循环神经网络的模式 3.2 参数学习 4. 基于门控的循环神经网络 4.1 长短期记忆网络 4.2 LSTM网络的变体网络 4.3 门控循环单元网络 5. 深层循环神经网络…...

C#初级——条件判断语句、循环语句和运算符

条件判断语句 简单的条件判断语句&#xff0c;if()里面进行条件判断&#xff0c;如果条件判断正确就执行语句块1&#xff0c;如果不符合就执行语句块2。 if (条件判断) { 语句块1 } else { 语句块2 } int age 18;if (age < 18){Console.WriteLine("未…...

Laravel路由模型绑定:简化依赖注入的艺术

Laravel路由模型绑定&#xff1a;简化依赖注入的艺术 引言 在现代Web应用开发中&#xff0c;Laravel框架以其优雅和简洁的代码而闻名。Laravel的路由模型绑定&#xff08;Route Model Binding&#xff09;是框架提供的一项强大功能&#xff0c;它允许开发者在路由处理中自动注…...

【vue前端项目实战案例】之Vue仿饿了么App

本文将介绍一款仿“饿了么”商家页面的App。该案例是基于 Vue2.0 Vue Router webpack ES6 等技术栈实现的一款外卖类App&#xff0c;适合初学者进行学习。 项目源码下载链接在文章末尾 1 项目概述 该项目是一款仿“饿了么”商家页面的外卖类App&#xff0c;主要有以下功能…...

冷热分离——Java全栈知识(36)

之前在面试的时候有老师问&#xff1a; 我看你使用了水平分表&#xff0c;但是如果有些 1%的数据占了访问量的 90%&#xff0c;而剩下 99%的数据只占了访问量的 10%。这种情况怎么处理。 1 、冷热分离 1.1、什么是冷热分离 冷热分离指的是在处理数据时将数据库分为冷库和热库…...

了解Selenium中的WebElement

Selenium中到处都使用WebElement来执行各种操作。什么是WebElement&#xff1f;这篇文章将详细讨论WebElement。 Selenium中的WebElement是一个表示网站HTML元素的Java接口。HTML元素包含一个开始标记和一个结束标记&#xff0c;内容位于这两个标记之间。 HTML元素的重命名 …...

OpenCV facedetect 人脸检测官方示例项目配置

运行程序。该程序会自动打开摄像头&#xff0c;识别并定位摄像头前的人脸以及眼睛部位。 输入q或者Q&#xff0c;退出程序。 或进行文本中所包含的图片路径 或 单个图片进行检测&#xff0c;自行修改代码即可 配置环境项目&#xff0c;debug 解决error C4996: ‘fopen’: This…...

自定义Laravel Artisan风格:打造个性化命令行体验

自定义Laravel Artisan风格&#xff1a;打造个性化命令行体验 引言 Laravel的Artisan命令行工具是开发过程中不可或缺的一部分&#xff0c;它提供了一个强大的接口来执行各种开发、维护、测试等任务。除了执行命令&#xff0c;Artisan还允许开发者自定义命令行输出的风格&…...

CTF之网站被黑

简单看一下网页和源码没发现什么明显漏洞 那就扫描一下目录 发现了/shell.php文件&#xff0c;访问一下&#xff0c;发现是一个后台管理登录页面 别无他法只能爆破喽&#xff0c;爆破后发现密码是hack flag{25891d9e9d377f006eda3ca7d4c34c4d}...

Electron学习笔记(一)基础环境

目录 前言 基础环境准备 安装 Node.js 配置项目文件 通过代理服务安装 通过国内仓库安装 一些常见问题&#xff1a; 前言 一个新手学习Electron的笔记&#xff0c;记录为主&#xff0c;仅供参考。 其他文章见专栏目录。 基础环境准备 开发之前先将基础环境搭建好。 …...

【C语言】栈的实现(数据结构)

前言&#xff1a; 还是举一个生活中的例子&#xff0c;大家都玩过积木&#xff0c;当我们把积木叠起来的时候&#xff0c;如果要拿到最底部的积木&#xff0c;我们必须从顶端一个一个打出&#xff0c;最后才能拿到底部的积木&#xff0c;也就是后进先出&#xff08;先进后出&a…...

前端三大主流框架对比

在现代前端开发中&#xff0c;React、Vue和Angular是三大流行的框架/库。它们各自有独特的优缺点&#xff0c;适用于不同的开发需求和项目规模。下面是对这三者的详细比较&#xff1a; 一、 React 简介&#xff1a; 由Facebook开发和维护&#xff0c;是一个用于构建用户界面…...

AOP~面向切面编程介绍

AOP基础 概述 AOP&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程、面向方面编程&#xff09;&#xff0c;面向特定方法的编程。 动态代理是面向切面编程最主流的实现。 SpringAOP是Spring框架的高级技术&#xff0c;旨在管理bean对象的过程中&#xff0c…...

Android SurfaceFlinger——GraphicBuffer的提交(三十三)

在 SurfaceFlinger 中,我们 dequeueBuffer 和 queueBuffer 是 Surface 控制接口中非常重要的两个函数,分别用于从 Surface 的 BufferQueue 中取出缓冲区和向 BufferQueue 提交(队列)缓冲区。这两个函数在生产者和消费者模型中扮演着核心角色,确保了图像数据的高效和有序传…...

创维汽车滁州永通体验中心开业仪式暨超充车型区域上市会圆满成功

2024年7月20日&#xff0c;创维汽车滁州永通体验中心盛大开业&#xff0c;当日&#xff0c;创维汽车市场部经理周世鹏、安徽大区总监王大明等领导参加本次开业盛典&#xff0c;共同见证创维汽车滁州永通体验中心成功落地。 2021年&#xff0c;新能源乘用车高速发展&#xff0c;…...

【PHP】系统的登录和注册

一、为什么要学习系统的登录和注册 系统的登录和注册可能存在多种漏洞&#xff0c;这些漏洞可能被恶意攻击者利用&#xff0c;从而对用户的安全和隐私构成威胁。通过学习系统的登录和注册理解整个登录和注册的逻辑方便后续更好站在开发的角度思考问题发现漏洞。以下是一些常见…...

2024.7.29 刷题总结

2024.7.29 **每日一题** 682.棒球比赛&#xff0c;这道题是一道简单的模拟题&#xff0c;用栈模拟题中的四个操作就可以了&#xff0c;操作一是将x加到列表末尾&#xff0c;操作二是将列表的后两项之和加到列表末尾&#xff0c;操作三是把列表最后一项的两倍加到列表末尾&#…...

WebSocket程序设计

协议说明 WebSocket 是一种在单个TCP连接上进行全双工通信的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。Websocket主要用在B/S架构的应用程序中&#xff0c;在 WebSocket API 中&#xff0c;浏览器和服务器只…...

ES(ElasticSearch)倒排索引

目录 正排与倒排索引 1.正排索引 作用&#xff1a; 优点&#xff1a; 缺点&#xff1a; 2.倒排索引 原理&#xff1a; 倒排索引的构建流程&#xff1a; 倒排索引的搜索流程&#xff1a; 优点&#xff1a; 缺点&#xff1a; 3. 应用场景 倒排索引中有几个非常重要的概念…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...