c语言必备知识-->文件操作(内存与磁盘交互)

news2024/10/19 1:36:28

        引言:本篇文章主要的内容是关于c语言文件相关的知识点,包括相应的代码实操,及文件操作时常用的接口讲解。

        本篇文章用来解决如何将内存中的数据永久保存到磁盘当中,并且如何从磁盘读取内容放到我们内存当中。

      我将讲解如下知识点:

        1:文件(是什么,为什么要用,)

        2:常用接口的介绍(顺序读写)

        3:文本文件与二进制文件的介绍

        4:文件的缓冲区


        本文正式开始

        1:文件

        什么是文件:我们可以简单理解为磁盘上的文件就是文件,但是在我们程序设计当中文件按其功能可以分为:程序文件,数据文件

        程序文件:程序在编译与链接过程中所生成的文件(.c,.obj,.exe)。

        数据文件:文件的内容不一定时程序,是用来与我们程序运行时读写的文件。        

文件名:每一个文件的唯一标识符,通常包含三个部分:文件路径+文件名主干+文件后缀。

为什么要用文件:

        我们知道数据在内存中存储的时候,是暂时存储的当我们的程序结束后数据就会被释放,而当我们每次启动程序的时候这些数据才会被加载到内存中,所以为了永久的保存数据我们需要将程序需要保存的内容写入到磁盘当中,并用相应的文件来保存这些数据,这样我们就既可以从文件中读取上次保存的数据,又可以给文件中写入我们需要保存的数据。所以我们需要使用文件。


2:常用的接口介绍:

        首先我们先来提前了解一个默认知识:每一个文件被打开的时候,都会在内存中申请一块空间,这块空间的名字叫做文件信息区,我们可以简单的理解这个文件信息区会保存当前文件的内容,大小等等关于这个文件的。

        

对文件操作时固定的步骤:1:打开文件  2:读写文件  3:关闭文件

打开文件接口:  fopen

fopen(“打开的文件名”,“以什么方式打开")  注意:两个都是字符串指针类型(const char*)

返回值:FILE*指针,这个指针是指向我们打开这个文件在内存中的文件信息区。

打开文件的形式:

本章我们主要研究:  ”r“与”w“。

"r":读文件,可以使用相对或绝对路径来填写文件名,如果没有该文件,那么程序就会报错。

"w":  写文件,如果该文件不存在那么会自动生成该文件,可以建立一个新文件,相当于重写文件.


fclose:关闭文件:本质上就是将我们内存中的文件信息区给释放,使用后已将文件指针置空。

成功返回0,不成功返回EOF

下面我们就用程序来操作文件。

刚开始在该目录下没有任何其他文件

我们使用读文件的方式:假设读取文件名为”data.txt“

我们以写的方式打开:

程序正常运行并且没有文件也会为我们创建一个文件。

        现在我们已经会打开文件和关闭文件了,接下来我们就应该学习对文件进行读写了。

        顺序读写(fputc,fgetc,fputs,fgets,fscanf,fprintf)

       写:fputc,fputs,fprintf

       读:fgetc,fgets,fscanf

        fputc:向文件中写入一个字符

        fputs:向文件写入字符串

        fprintf:向文件写入格式化的形式   这几个函数适用于所有输出流。

        写:fgetc,fgets,fscanf        

        fputc:向文件中读取一个字符

        fputs:向文件读取字符串

        fprintf:向文件读取格式化的形式   这几个函数适用于所有输入流。

下面我们来演示上面的功能

       向文件中写入26个字符

        

接下来我们换做读取

或读取我们写的程序文件

fgets与fputs的内容只是以读写字符串的形式进行的。

同样的fgets读取文件并且存放到一个字符数组中去。

fgets读num-1个字符到str里面去,并且最后一个默认给'\0'字符串标识符号

下面我们来学另外两个接口函数(fprintf,fscanf);

        假设我们要向文件中写入10000个数我们就可以使用fprintf这个接口了,以格式化的方式写入。

可以自己选择以什么样的方式进行写入。

fscanf读取需要自己定义变量保存下来。

以二进制的方式写文件和读文件的两个接口:fwrite,fread顾名思义写和读,并且打开文件的方式分别为: “wb”  "rb"

fread:以二进制的形式读取文件

        以二进制写文件,那么我们读取的时候就要以二进制读的方式。

3:文本文件与二进制文件

        根据数据的组织形式,数据文件被称为文本文件或者二进制文件。

        二进制文件:数据在内存中以二进制进行存储的,如果我们不加转化的直接写入到我们的磁盘文件当中,这样的文件就叫做二进制文件。

        文本文件:将在内存中的二进制文件加以转化成ASCII码字符的形式在外存中进行存储的方式就叫做文本文件。

        数据存储的差异:比如说我们要存储一个整形a=10000那么如果我们使用二进制文件进行存储的话大小就只要占4个字节,而ASCII码会将这个数据a看作由5个字符构成的   '1' '0' '0' '0' '0'这5个字符。

我们可以在vs下看到这个文件的二进制内容,右键test.txt-->选择打开方式-->二进制编辑器

4:文件的缓冲区

        是什么:其实文件缓冲区的本质就是在内存中申请的空间,有输入缓冲区与输出缓冲区,方便我们的磁盘与内存相互交互。

        为什么:我们的内存写入或读取数据并不是直接向硬盘当中读或写,而是会先将我们的数据加载到输入缓冲区或输出缓冲区,这样能够保证内存与硬盘读写时的效率。

因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件(本质也会刷新我们的缓冲区)。 如果不做,可能导致读写文件数据丢失的问题。

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

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

相关文章

《Spring Cloud Config与Bus整合实现微服务配置自动刷新》

目录 Config与Bus整合自动刷新步骤1:安装RabbitMQ并启动RabbitMQ的安装 步骤2:创建项目创建Eureka Server创建config-server 步骤3: 添加依赖步骤4:Config Client步骤5:测试运行问题一问题二 总结 Config与Bus整合自动…

Java爬虫:从入门到精通实战指南

在信息技术飞速发展的今天,数据已成为最宝贵的资源之一。Java作为一种成熟且功能强大的编程语言,不仅在企业级应用开发中占据主导地位,也成为了编写爬虫程序的理想选择。Java爬虫能够自动化地从网页或API中提取数据,为数据分析、机…

一篇文章带你走进Java集合中的HashMap

文章目录 一、了解常见的数据结构二叉平衡树AVL树红黑树 二、HashMap的实现原理HashMap的jdk1.7和jdk1.8有什么区别? 三、HashMap put的具体流程四、HashMap的扩容机制五、HashMap的寻址算法**第一步:** 计算对象的hashCode第二步: 二次哈希第…

基于springboot的学习平台系统

springbootjava学习平台作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的,前后端分离。 开发语言:Java数据库&#xff1a…

2024第七届全国大学生数学竞赛暨数学精英挑战赛第二场,第一场获奖名单已公布

第七届全国大学生数学竞赛暨数学精英挑战赛(原网络挑战赛)由浙江应用数学研究会组织举办。自2018年起已经连续举办6届,吸引来自全国900余所高校选手参赛,近三年累计参赛人数1.5万人。2024年,第七届全国大学生数学竞赛暨…

力扣MySQL 1581

先把两张表连接,amount为null 的正是我们需要的,再按customer_id聚合 select Visits.visit_id,customer_id ,Transactions.visit_id ,transaction_id ,amount from Visits left join Transactions on Visits.visit_idTransactions.visit_id 正确代码&…

银河麒麟V10系统+Windows10双系统启动顺序正确修改方法

***正确可行方法***,测试OK且稳定; 银河麒麟桌面操作系统V10是一款适配国产软硬件平台并深入优化和创新的新一代图形化桌面操作系统,同源支持国内外主流处理器架构,并不断使能GPU、桥片、网卡等各种新硬件,提供更优的软…

Electron+Vue实现两种方式的截屏功能

本次介绍的截屏功能一共有两种分别是在electron环境中与非electron环境中 非electron环境 这个环境下会有一些限制: 1.只能截浏览器中的画面 2.如果里面有iframe或者base64的图片会加载不出来(这个会有解决办法) yarn add -D js-web-scree…

Vue详细入门(语法【三】)

今天滴的学习目标!!! Vue组件是什么?组件的特性和优势Vue3计算属性Vue3监听属性 在前面Vue详细入门(语法【一】——【二】)当中我们学习了Vue有哪些指令,它的核心语法有哪些?今天我们…

大模型学习方法之——大模型技术学习路线,小白也能学会大模型

技术学习无非涵盖三个方面,理论,实践和应用 大模型技术爆火至今已经有两年的时间了,而且大模型技术的发展潜力也不言而喻。因此,很多人打算学习大模型,但又不知道该怎么入手,因此今天就来了解一下大模型的…

java-uniapp小程序-引导关注公众号、判断用户是否关注公众号

目录 1、前期准备 公众号和小程序相互关联 准备公众号文章 注册公众号测试号 微信静默授权的独立html 文件 2: 小程序代码 webview页面代码 小程序首页代码 3:后端代码 1:增加公众号配置项 2:读取公众号配置项 3&…

【学习笔记】什么是MongoDB

文章目录 MongoDB 简介体系结构数据模型MongoDB 的特点 MongoDB 简介 学习一个东西就跟认识一个人一样,下面有情MongoDB来做个自我介绍 大家好,俺是MongoDB,是一个开源、高性能、无模式的文档型数据库,当初的设计俺就是用于简化开…

学习笔记(202410)

课程:Generative AI for Software Development 链接:吴恩达同步最新AI专业课,第54讲:用人工智能做软件开发--Generative AI for Software Development_哔哩哔哩_bilibili 时间:2024-10-12 至 概述:使用C…

强化学习与深度强化学习:深入解析与代码实现

个人主页:chian-ocean 文章专栏 强化学习与深度强化学习:深入解析与代码实现 强化学习(Reinforcement Learning, RL)是一种机器学习方法,通过智能体(agent)与环境(environment&am…

【Linux】Linux常见指令及权限理解

1.ls指令 语法 : ls [ 选项 ][ 目录或文件 ] 功能 :对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。 常用选项: -a 列出目录下的所有文件,包括以 . 开头的隐含文…

无人机视角下火灾检测数据集 共12736张 标注文件为YOLO适用的txt格式。已划分为训练集、验证集、测试集。类别:Fire yolov5-v10通用

无人机视角下火灾检测数据集 共12736张 标注文件为YOLO适用的txt格式。已划分为训练集、验证集、测试集。类别:Fire yolov5-v10通用 无人机视角下火灾检测数据集 共12736张 标注文件为YOLO适用的txt格式。已划分为训练集、验证集、测试集。类别:Fire yol…

【Vue】Vue3.0(十)toRefs()和toRef()的区别及使用示例

上篇文章:Vue】Vue(九)OptionsAPI与CompositionAPI的区别 🏡作者主页:点击! 🤖Vue专栏:点击! ⏰️创作时间:2024年10月15日11点13分 文章目录 toRefs()和toRe…

基于朴素贝叶斯的中文垃圾短信分类(含ui界面)

完整代码如下 基于朴素贝叶斯的中文垃圾短信分类、垃圾邮件分类。 可用于机器学习课程设计等。 import warnings warnings.filterwarnings(ignore) import os os.environ["HDF5_USE_FILE_LOCKING"] "FALSE" import pandas as pd import numpy as np fro…

LeetCode1004.最大连续1的个数

题目链接:1004. 最大连续1的个数 III - 力扣(LeetCode) 1.常规解法(会超时) 遍历数组,当元素是1时个数加一,当元素是0时且已有的0的个数不超过题目限制时,个数加一,若上…

重生之我爱上了k8s!

内容不全,待补充中...... 目录 一、k8s的部署 1.1.集群环境初始化 1.1.1.所有主机禁用swap 1.1.2.安装k8s部署工具 1.1.2.所有节点安装cri-docker 1.1.3.在master节点拉取K8S所需镜像 1.1.4.集群初始化 1.1.5.其他两台主机加入集群 1.1.6.安装flannel网络…