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

语言文件操作

🌱博客主页:大寄一场.

🌱系列专栏:C语言学习笔记

😘博客制作不易欢迎各位👍点赞+⭐收藏+➕关注 

 

目录

前言

C语言中的文件打开和关闭

文件指针

文件的打开和关闭

fclose

文件的顺序读写

fseek

ftell

rewind

文本文件和二进制文件

文件读取结束的判定

被错误使用的feof

文件缓冲

总结


 

 

前言


我们或许都有这样的苦恼,在我们使用C语言进行编程的时候,当我们程序写好跑起来之后,我们输入的数据总是在关闭之后就丢失,有些东西比如我们的通讯录实现,想要将这些数据保存,下次打开还在,我们应该怎么做?这里就让我带领大家进入文件这个奇妙的空间。

文件是什么?

磁盘上的文件是文件。
但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)

程序文件

我们在编译器里面创建的文件,比如后缀为.c的源程序文件,在我们windows环境当中后缀为.obj的目标文件,还有我们后缀为.exe的可执行程序,这些文件一般是在我们程序设计时候所产生。

数据文件

对于文件来说,里面的东西不是必须要为程序的,我们在程序的设计过程中,会读写数据,这些数据的来源,就是这些数据文件。

文件名
文件和我们一样,都有一个独一味二的名字,它们的名字构成不和我们一样,姓+名,它是由我们的文件路径+文件名主干+文件后缀,那我们知道文件后缀是什么,也知道当时文件命名时候命名的主干是什么,那这个文件路径是什么呢?文件路径,顾名思义,是文件走过的路径,这样想就大漏特漏,文件路径指的是,我们去找这个文件所途经的文件,比如我现在要在我的电脑中,找到我昨天写的代码,我知道我的代码放在d盘一个集中的文件当中,那我就可以去找一下d:\code\test-c
 

 

C语言中的文件打开和关闭

文件指针

在我们探讨在C语言中怎么打开和关闭文件之前,我们要了解一个概念,叫文件指针,

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名
字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统
声明的,取名FILE

struct _iobuf {char *_ptr;int   _cnt;char *_base;int   _flag;int   _file;int   _charbuf;int   _bufsiz;char *_tmpfname;};
typedef struct _iobuf FILE;

不同编译器下的结构体内部可能存在差异,但是是不影响我们使用的,每要打开一个文件,FILE内部会自己判断应该是什么类型,不需要使用者去担心这些细节,我们在使用FILE的时候,通常情况下是用一个指针去维护的,我们这里可以试着去创建一个FILE*的变量。

FILE* pf; //文件指针类型

定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变
量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。

比如:

 

文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。
在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指
针和文件的关系

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


fopen

fopen,是我们用来打开文件的函数,它的第一个参数就是我们的文件名,第二个参数是打开方式,打开方式有很多。如下:

文件使用方式含义如果文件不存在
“r”(只读)为了输入数据,打开一个已经存在的文本文件报错
“w”(只写)为了输出数据,打开一个文本文件建立一个新的文件
“a”(追加)向文本文件尾添加数据建立一个新的文件
“rb”(只读)为了输入数据,打开一个二进制文件出错
“wb”(只写)为了输出数据,打开一个二进制文件建立一个新的文件
“ab”(追加)向一个二进制文件尾添加数据出错
“r+”(读写)为了读和写,打开一个文本文件出错
“w+”(读写)为了读和写,建议一个新的文件建立一个新的文件
“a+”(读写)打开一个文件,在文件尾进行读写建立一个新的文件
“rb+”(读写)为了读和写打开一个二进制文件出错
“wb+”(读写)为了读和写,新建一个新的二进制文件建立一个新的文件
“ab+”(读写)打开一个二进制文件,在文件尾进行读和写建立一个新的文件


我们知道这些打开方式之后,就可以试着打开文件了,这里我们试一下用只读的方式打开文件。

#include<stdio.h>int main()
{FILE* pf;pf = fopen("test.txt", "r");if (pf == NULL){perror(pf);return 1;}//操作文件//return 0;
}


fclose


我们的文件和动态内存一样,我们打开用完之后,是需要关闭的,那用于关闭文件的函数就是我们的fclose,它的使用和我们动态内存的free基本一样,那我们优化一下上面的代码。

#include<stdio.h>int main()
{//打开文件FILE* pf;pf = fopen("test.txt", "r");//判断文件打开是否成功if (pf == NULL){perror(pf);return 1;}//操作文件////关闭文件fclose(pf);pf = NULL;return 0;
}


文件的顺序读写


我们文件打开之后,要对文件进行操作,这里就要用到我们的文件读写了,在C语言中提供了很多用于读写的函数,这里给大家列出一个表格。

功能函数名适用于
字符输入函数fgetc所有输入流
字符输出函数fputc所有输出流
文本行输入函数fgets所有输入流
文本行输出函数fputs所有输出流
格式化输入函数fscanf所有输入流
格式化输出函数fprintf所有输出流
二进制输入fread文件
二进制输出fwrite文件


对于上述的这些函数而言,所有输入/输出流这些函数都是文本信息,我们写入到文本当中是可以看懂的,最后两个二进制输入函数,它输入到文本当中的是ASCII码,我们不能直观的知道我们存放在内存中的数据是什么。

文件的随机读写
我们学习了文件的顺序读写,那如果我们读写了文件内的第一个字符,我们还想读取第一个怎么办?如果是顺序读写时做不到的,那这里就有了我们的随机读写。

fseek

int fseek ( FILE * stream, long int offset, int origin );

根据文件指针的位置和偏移量来定位文件指针,它第一个参数放的是我们的文件指针,第二个是要便宜多少,第三个就是我们从哪里开始算偏移位置,第三个参数在我们C语言中是由提供的。

ftell

long int ftell ( FILE * stream );

ftell,它可以计算我们文件指针相比较起始位置的偏移量,然后返回这个值。

rewind

void rewind ( FILE * stream );

fewind,它可以将我们的文件指针直接回到文件的初始位置。

文本文件和二进制文件


根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。
一个数据在内存中是怎么存储的呢?
字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节(VS2013测试)
 

文件读取结束的判定

被错误使用的feof

牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。
而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。
1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
例如:
fgetc 判断是否为 EOF .
fgets 判断返回值是否为 NULL .
2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:
fread判断返回值是否小于实际要读的个数

文件缓冲

ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

总结


文件操作对于我们来说,可以让一些我们需要保存的数据放在文件当中,下次使用的时候可以直接写入到程序当中。


那么这篇博客就到此为止了,希望佬们多多支持!
 

相关文章:

语言文件操作

&#x1f331;博客主页&#xff1a;大寄一场. &#x1f331;系列专栏&#xff1a;C语言学习笔记 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 目录 前言 C语言中的文件打开和关闭 文件指针 文件的打开和关闭 fclose 文件的顺序读写 fseek ftell …...

Java面试题--熔断和降级的区别

熔断和降级都是系统自我保护的一种机制&#xff0c;但二者又有所不同&#xff0c;它们的区别主要体现在以下几点&#xff1a; 概念不同 触发条件不同 归属关系不同 1.概念不同 1.1熔断概念 “熔断”一词早期来自股票市场。熔断&#xff08;Circuit Breaker&#xff09;也…...

阅读笔记5——深度可分离卷积

一、标准卷积 标准卷积在卷积时&#xff0c;同时考虑了特征图的区域和通道信息。 标准卷积的过程如图1-1所示&#xff0c;假设输入特征图的channel3&#xff0c;则每个卷积核的channel都为3&#xff0c;每个卷积核的3个channel对应提取输入特征图的3个channel的特征&#xff08…...

Microsoft Dynamics 365:导入License到服务层,通过Business Central Administration Shell

本文主要是Microsoft Dynamics 365的License导入的图解干货&#xff0c;不多赘述&#xff0c;直接上图&#xff1a;第一步&#xff1a;准备好的License文件放在你喜欢的目录下第二步&#xff1a;到开始程序里找到并打开 Business Central Administration Shell3.第三步&#xf…...

centos6.10安装FastDfs出错的问题

在centos6.10虚拟机安装dfs文件服务器时&#xff0c;安装报错&#xff0c;报错为&#xff1a; gcc: error trying to exec cc1’: execvp: 没有那个文件或目录 1.ping www.baidu.con 排查网络是否通 2.yum update 排查yum源是否可用 3.yum源地址不可用时&#xff0c;修改yu…...

基础组件之内存池

内存池技术 操作系统在运行进程的过程中&#xff0c;会产生内存碎片&#xff0c;降低了内存的使用率。内存池技术就是为了解决/减少内存碎片的一种方法&#xff0c;内部底层的具体实现根据不同业务场景使用不要的方式&#xff0c;以下是一种好理解的方式&#xff0c;供大家一起…...

前端面试题--了解并简单介绍一下typescript

前端面试题–了解并简单介绍一下typescript TypeScript是JavaScript的超集&#xff0c;具有可选的类型并可以编译为纯JavaScript。 从技术上讲TypeScript就是具有静态类型的 JavaScript 。 向JavaScript添加静态类型的原因是什么&#xff1f;我想原因至少有三个&#xff1a; …...

【pytorch】ModuleList 与 ModuleDict

ModuleList 与 ModuleDict1、ModuleList2、ModuleDict3、总结1、ModuleList 1&#xff09;ModuleList 接收一个子模块的列表作为输入&#xff0c;然后也可以类似 List 那样进行 append 和 extend 操作: net nn.ModuleList([nn.Linear(784, 256), nn.ReLU()]) net.append(nn.…...

Hive窗口函数语法规则、窗口聚合函数、窗口表达式、窗口排序函数 - ROW NUMBER 、口排序函数 - NTILE、窗口分析函数

Hive窗口函数 文章目录Hive窗口函数语法规则窗口聚合函数窗口表达式窗口排序函数 - ROW NUMBER窗口排序函数 - NTILE窗口分析函数窗口函数也叫开窗函数、OLAP函数其最大特点&#xff1a;输入值是从SELECT语句的结果集中的一行或多行的“窗口”中获取的。如果函数具有OVER子句&a…...

Go设计模式之函数选项模式

目录引入函数选项模式&#xff08;functional options pattern&#xff09;可选参数默认值接口类型版本引入 假设现在需要定义一个包含多个配置项的结构体&#xff0c;具体定义如下&#xff1a; // DoSomethingOption 定义配置项 type DoSomethingOption struct {// a 配置aa…...

ClickHouse 数据类型、函数大小写敏感性

这里写自定义目录标题SELECT *FROM system.data_type_families注意&#xff1a;case_insensitive0 表示大小写敏感。 ClickHouse 的 String 类型、Int 类型、Float 类型、Decimal类型等都是大小写敏感的&#xff08;case_sensitive0&#xff09;。关于ClickHouse大小写敏感&am…...

nodejs基于vue 网上商城购物系统

可定制框架:ssm/Springboot/vue/python/PHP/小程序/安卓均可开发 目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本文研究内容 2 2 系统开发环境 4 2. 3 系统分析 6 3.1系统可行性分析 6 3.1.1经济可行性 6 3.1.2技术可行性 6 3.1.3运行可行…...

掌握MySQL分库分表(一)数据库性能优化思路、分库分表优缺点

文章目录MySQL数据库性能优化思路【面试题】不分库分表软优化硬优化分库分表结论分库分表能解决的问题解决数据库本身瓶颈连接数解决系统本身IO、CPU瓶颈分库分表带来的问题问题⼀ 跨节点数据库Join关联查询问题二 分库操作带来的分布式事务问题问题三 执行的SQL排序、翻页、函…...

何为小亚细亚?

一、小亚细亚安纳托利亚&#xff08;Anatolia&#xff09;&#xff0c;又名小亚细亚或西亚美尼亚&#xff0c;是亚洲西南部的一个半岛&#xff0c;隶属于土耳其。安纳托利亚半岛&#xff0c;北临黑海&#xff0c;西临爱琴海&#xff0c;南濒地中海&#xff0c;东接亚美尼亚高原…...

【mircopython】ESP32配置与烧录版本

下载ESP32的Micropython固件 官方连接https://www.micropython.org/download/esp32/ 看了下描述&#xff0c;上面的是IDF4.x系列编译&#xff0c;下面是IDF3.x系列编译&#xff0c;我们默认选新的 下载安装CP2102驱动 CP210x USB to UART Bridge VCP Drivers - Silicon Labs…...

Yaml:通过extrac进行传参,关联---接口关联封装(基于一个独立YAML的文件)

一&#xff1a;在common包中&#xff0c;封装一个yaml_util的工具包 1. 将获取到的数据&#xff0c;写入到extrac.yaml文件中&#xff0c;通过data def write_extract_yaml(data): 2. 需要用到该参数时&#xff0c;读取extrac.yaml文件中&#xff0c;由于会有多个参数&#x…...

vue - vue中对Vant日历组件(calendar)的二次封装

vue中对vant日历选择器组件实现的的二次封装&#xff1b;主要实现功能如下: 主要功能&#xff1a; 日期区间选择&#xff08;基本&#xff09;&#xff1b;自定义选择器的底部按钮&#xff0c;添加清除时间操作&#xff08;slot插槽&#xff09;&#xff1b;指定默认选中的日期…...

详解C++的类型转换

文章目录前言一、C语言中的类型转换二、为什么C需要四种转换三、C强制类型转换3.1 static_cast3.2 reinterpret_cast3.3 const_cast3.4 dynamic_cast四、RTTI总结前言 在C语言的类型转换有一个非常大的坑,有好多悄悄地转换,有时候把我们转换的就蒙了,因为C要兼容C语言,所以C就…...

NLP文本自动生成介绍及Char-RNN中文文本自动生成训练demo

前言 文本自动生成是自然语言处理领域的一个重要研究方向&#xff0c;实现文本自动生成也是人工智能走向成熟的一个重要标志。文本自动生成技术极具应用前景。 例如&#xff0c;文本自动生成技术可以应用于智能问答与对话、机器翻译等系统&#xff0c;实现更加智能和自然的人机…...

Teradata 离场,企业数据分析平台如何应对变革?

近日大数据分析和数仓软件巨头 Teradata&#xff08;TD&#xff09;宣布基于中国商业环境的评估&#xff0c;退出在中国的直接运营。TD 是全球最大的专注于大数据分析、数仓和整合营销管理解决方案的供应商之一&#xff0c;其早在 1997 年就进入中国&#xff0c;巅峰期占据半数…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

机器学习的数学基础:线性模型

线性模型 线性模型的基本形式为&#xff1a; f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法&#xff0c;得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》

近日&#xff0c;嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》&#xff0c;海云安高敏捷信创白盒&#xff08;SCAP&#xff09;成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天&#xff0c;网络安全已成为企业生存与发展的核心基石&#xff0c;为了解…...