当前位置: 首页 > 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. 应用场景 倒排索引中有几个非常重要的概念…...

Android Studio Build窗口出现中文乱码问题

刚安装成功的android studio软件打开工程&#xff0c;编译时下方build窗口中中文是乱码。 解决&#xff1a; 可点击studio状态栏的Help—>Edit Custom VM Options &#xff0c;在打开的studio64.exe.vmoptions文件后面添加&#xff1a;(要注意不能有空格&#xff0c;否则st…...

java生成随机数

代码 startValue 开始值 endValue 结束值 per生成的位数也就是精度 /*** 随机数的生成* param startValue* param endValue* return*/private BigDecimal randomBigDecimal(String startValue, String endValue,int per) {BigDecimal min new BigDecimal(startValue);BigDeci…...

动态定制深度学习:Mojo模型与自定义训练算法的无缝切换

动态定制深度学习&#xff1a;Mojo模型与自定义训练算法的无缝切换 引言 在机器学习领域&#xff0c;算法的选择对模型的性能有着决定性的影响。随着研究的深入和技术的发展&#xff0c;开发者可能需要根据不同的数据特性和业务需求&#xff0c;动态地切换或自定义训练算法。…...

昇思25天学习打卡营第19天|DCGAN生成漫画头像

DCGAN生成漫画头像总结 实验概述 本实验旨在利用深度卷积生成对抗网络&#xff08;DCGAN&#xff09;生成动漫头像&#xff0c;通过设置网络、优化器以及损失函数&#xff0c;使用MindSpore进行实现。 实验目的 学习和掌握DCGAN的基本原理和应用。熟悉使用MindSpore进行图像…...

排序题目:按照频率将数组升序排序

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;按照频率将数组升序排序 出处&#xff1a;1636. 按照频率将数组升序排序 难度 3 级 题目描述 要求 给定一个整数数组 nums \texttt{nums} nums&a…...

实分析与测度论问题的分类

实分析主要研究实数、实数序列、实数极限以及实值函数的分析&#xff0c;而度量空间则是一个具有距离函数的集合&#xff0c;其分类可以从多个角度进行。 实分析 实分析主要关注实数、实数序列、实数极限以及实值函数的分析。它涉及到多个重要的概念和理论&#xff0c;包括但…...

动态代理更改Java方法的返回参数(可用于优化feign调用后R对象的统一处理)

动态代理更改Java方法的返回参数&#xff08;可用于优化feign调用后R对象的统一处理&#xff09; 需求原始解决方案优化后方案1.首先创建AfterInterface.java2.创建InvocationHandler处理代理方法3. 调用 实际运行场景拓展 需求 某些场景&#xff0c;调用别人的方法&#xff0…...

Redis缓存数据库进阶——Redis与分布式锁(6)

分布式锁简介 1. 什么是分布式锁 分布式锁是一种在分布式系统环境下&#xff0c;通过多个节点对共享资源进行访问控制的一种同步机制。它的主要目的是防止多个节点同时操作同一份数据&#xff0c;从而避免数据的不一致性。 线程锁&#xff1a; 也被称为互斥锁&#xff08;Mu…...

网络芯片(又称为PHY网络芯片)

Realtek RTL8152B是一种常见的主板集成网络芯片&#xff08;又称为PHY网络芯片&#xff09;。PHY芯片是指将网络控制芯片的运算部分交由处理器或南桥芯片处理&#xff0c;以简化线路设计&#xff0c;从而降低成本。 https://www.realtek.com/Download/List?cate_id585 Realt…...

01 Go Web基础_20240728 课程笔记

概述 如果您没有Golang的基础&#xff0c;应该学习如下前置课程。 基础不好的同学每节课的代码最好配合视频进行阅读和学习&#xff0c;如果基础比较扎实&#xff0c;则阅读本教程巩固一下相关知识点即可&#xff0c;遇到不会的知识点再看视频。 视频课程 最近发现越来越多…...