文件的处理(c语言)


首先了解下文件的作用

文件可以把数据直接放在电脑的硬盘上,实现了数据的持久化

什么是文件

文件就是磁盘上的文件。在程序设计中,文件通常有俩种,一种是程序文件,另一种是数据文件(这是从文件功能来分类的)

程序文件

包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)

数据文件

文件的内容不是是程序,而是程序运行时读写的数据,比如程序运行时需要从中读取数据的文件,或者输出内容的文件

文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用

文件名包含3个部分:文件路径+文件名主干+文件后缀

例如: c:\code\test.txt
文件标识通常被称为文件名


文件指针

缓存文件系统中,关键的概念时“文件类型指针”,简称“文件指针”

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

注意:

每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息。

通过FILE的指针来维护这个FILE结构的变量

创建一个FILE*指针变量

FILE* pf  //文件指针变量

解释:

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

文件缓冲区

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


文件的打开与关闭

文件在读写之前应该打开文件,在读写结束后,应该关闭文件。

那么文件是如何打开和关闭的

//打开文件
//第一个参数为文件名,第二个参数为打开方式
FILE* fopen(const char* filename,const char* mode);
//关闭文件
//这个下面的参数是文件指针
int fclose (FILE * stream);

打开方式如下

代码如下

int main()
{//打开文件,如果打开成功,则会在相应的工程目录下,创建这个文件FILE* pf = fopen("wozuishuai.txt", "w");//判断文件是否打开成功if (pf == NULL){perror("fopen");return 1;}//关闭文件fclose(pf);return 0;
}

成功创建了一个空白文档👇

注意:

当用以w方式打开文件时,如果有文件,那么这个文件中的内容将会销毁,会创建出了一个新的文件


c语言中的3种流

写文件的时候:文件流

终端设备-屏幕 : 标准输出流stdout

键盘:                 标准输入流stdin

屏幕:                  标准错误流 stderr


文件中的相关函数

接下来将会对这些函数进行学习👇


fgetc和fputc函数

fputc是把字符写到文件中

fgetc就是在程序中输出这个字符

1.fgetc

2.fputc


注意:

这里的流就是文件指针

fputc的使用

这下面代码会在你的硬盘中的项目文件中创建一个文档,并把w字符输入其中

int main()
{//文件打开方式为wFILE* pf = fopen("text.txt", "w");//打开文件if (pf == NULL){perror("fopen");return 1;}//把w写入文件中fputc('w', pf);//关闭文件fclose(pf);//把文件指针置成空指针,防止之后变成野指针pf = NULL;return 0;
}
fgetc的使用

这下面的代码就是从文档中读取内容,并输出出来


fgets和fputs函数

1.fputs

2.fgets

fputs的用法

fgets的用法


fprintf和fscanf函数

fprintf

用于向指定的文件流中写入格式化的数据。它的操作方向是从程序内存中的数据到文件。

fscanf

用于从指定的文件流中读取格式化的数据。它的操作方向是从文件到程序内存。

1.fprintf

fprintf的使用
struct S
{int n;float f;char arr[20];
};int main()
{struct S s = { 100,3.14f,"lisi" };//打开文件FILE* pf = fopen("text.txt", "w");//判断文件是否打开成功if (pf == NULL){perror("fopen");return 1;}//在文件中存放数据fprintf(pf, "%d %f %s\n", s.n, s.f, s.arr);//关闭文件fclose(pf);pf = NULL;return 0;
}

2.fscanf

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 1;}//读文件,把文件读取到程序fscanf(pf, "%d %f %s\n",&(s.n),&(s.f),s.arr);printf("%d %f %s\n", s.n, s.f, s.arr);//关闭文件fclose(pf);pf = NULL;return 0;
}


对比一组函数

scanf/fscanf/sscanf

printf/fprintf/sprintf

首先说明一下sscanf和sprintf函数的用法

1.sprintf函数

把一个格式化的数据转换成字符串

sprintf函数的用法
struct S
{int n;float f;char arr[20];
};
int main()
{struct S s = { 200,3.5f,"lisi" };char arr[200] = { 0 };//将一个格式化数据转换成一个字符串sprintf(arr, "%d %f %s\n", s.n, s.f, s.arr);printf("%s\n", arr);return 0;
}
sscanf函数的用法

struct S
{int n;float f;char arr[20];
};
int main()
{struct S s = { 200,3.5f,"lisi" };char arr[200] = { 0 };//把格式化数据转换成字符串//把数据储存在arr数组中sprintf(arr, "%d %f %s\n", s.n, s.f, s.arr);printf("%s\n", arr);//把字符串转换成格式化数据struct S tmp = { 0 };sscanf(arr, "%d %f %s\n", &(tmp.n), &(tmp.f), &(tmp.arr));printf("%d %f %s\n", tmp.n, tmp.f, tmp.arr);return 0;
}

这些函数的区别

scnaf针对标准输入流(stdin)的格式化的输入函数

printf针对标准输出流(stdout)的格式化的输出函数

fscanf针对所有输入流(文件流/stdin)的格式化输入函数

fprintf针对所有输出流(文件流/stdout)的格式化输出函数

sscanf  把字符串转换成格式化的数据

sprintf  把格式化的数据转换成字符串


fread函数

读取文件的内容

fread函数的用法

fseek函数

可以自己设置文件指针的位置



fseek函数的用法

rewind函数

让文件指针回到起始位置

ftell函数

具有返回偏移量的功能


文本文件和二进制文件

数据文件被称为文本文件或者二进制文件

数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。

数据在内存中的存储的方式

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


文件读取结束的判定

feof函数

注意:

在文件读取过程中,不能用feof函数的返回值来判断文件是否结束

而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束

1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者NULL ( fgets )

例如:

fgetc 判断是否为 EOF .

fgets 判断返回值是否为 NULL .

2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。

例如:

fread判断返回值是否小于实际要读的个数。

结语:

限于水平,本篇文章不足之处在所难免,多多包涵,如有什么错误,大家可以指出来


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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shell编程之awk

awk 是 Linux 以及 UNIX 环境中现有的功能最强大的数据处理工具。简单地讲, awk 是一种处理文本数据的编程语言。awk 的设计使得它非常适合于处理由行和列组成的文本数据。而在 Linux 或者 UNIX 环境中,这种类型的数据是非常普遍的。 除此之外&#xff…

数据库-基础理论

文章目录 前言一、ORM框架二、ACID原则三、事务Transaction四、N1问题五、Normalization三范式六、FMEA方法论(Failure Mode and Effects Analysis)七、Profiling和PerformanceSchema查询分析 前言 基础理论 ORM框架、ACID原则、事务Transaction、N1问…

用 Python 从零开始创建神经网络(九):反向传播(Backpropagation)

反向传播(Backpropagation) 引言1. 分类交叉熵损失导数(Categorical Cross-Entropy loss derivative)2. 分类交叉熵损失导数 - 代码实现3. Softmax激活函数导数(Softmax activation derivative)4. Softmax激…

Transformer详解及衍生模型GPT|T5|LLaMa

简介 Transformer 是一种革命性的神经网络架构,首次出现在2017年的论文《Attention Is All You Need》中,由Google的研究团队提出。与传统的RNN和LSTM模型不同,Transformer完全依赖于自注意力(Self-Attention)机制来捕…

C0034.在Ubuntu中安装的Qt路径

Qt安装路径查询 在终端输入qmake -v如上中/usr/lib/x86_64-linux-gnu就是Qt的安装目录;

Swift 实现查找链表入环点:快慢指针法

文章目录 前言摘要描述题解答案题解代码题解代码分析示例测试及结果时间复杂度空间复杂度总结 前言 本题由于没有合适答案为以往遗留问题,最近有时间将以往遗留问题一一完善。 142. 环形链表 II 不积跬步,无以至千里;不积小流,无…

stable-diffusion-webui在conda pycharm中运行

目录 简介下载conda环境配置环境变量修改launch_utils.py文件运行stable-diffusion-webui下载模型文本生成图片参考 简介 stable-diffusion-webui是AI绘画 Stable Diffusion浏览器UI界面,为用户提供了一个简单、直观的方式来利用 Stable Diffusion 技术创建视觉内容…

小柴冲刺软考中级嵌入式系统设计师系列二、嵌入式系统硬件基础知识(7)嵌入式Soc

越努力,越幸运! 分享一个晚霞,真的好美啊💖! 添加图片注释,不超过 140 字(可选) 不得不说,我还是喜欢在人少的地方生活啊。 flechazohttps://www.zhihu.com/people/ji…

【云计算网络安全】解析 Amazon 安全服务:构建纵深防御设计最佳实践

文章目录 一、前言二、什么是“纵深安全防御”?三、为什么有必要采用纵深安全防御策略?四、以亚马逊云科技为案例了解纵深安全防御策略设计4.1 原始设计缺少安全策略4.2 外界围栏构建安全边界4.3 访问层安全设计4.4 实例层安全设计4.5 数据层安全设计4.6…

产业用机器人中的旋转花键若损伤有何影响?

旋转花键在产业用机器人中是关键的组件之一,如果机器人中的旋转花键损坏,会对机器人的运行和性能产生一定影响。以下是可能的影响: 1、功能受限:旋转花键用于连接两个旋转部件(例如电机轴和传动轴)&#xf…

基于STM32的火灾报警装置的Proteus仿真

文章目录 一、火灾报警1.题目要求2.思路2.1 主控2.2 传感器2.3 设定阈值--按键2.4 报警和通风2.5 OLED显示2.6 电源部分2.7 远程终端 3.仿真3.1 未仿真时3.2 仿真开始,界面13.3 切换界面23.4 切换界面3 4.仿真程序4.1 程序说明4.2 主函数4.3 OLED显示函数 二、总结 …

人脸检测开源项目介绍【持续更新】

DeepFace 介绍:DeepFace是一个轻量级的人脸识别和面部属性分析框架,专为Python设计。它集成了多种前沿的深度学习模型,包括VGG-Face、FaceNet、OpenFace、DeepFace、DeepID、ArcFace、Dlib、SFace和GhostFaceNet等,能够进行年龄、…

RabbitMQ 之 死信队列

一、死信的概念 先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理 解,一般来说,producer 将消息投递到 broker 或者直接到 queue 里了,consumer 从 queue 取出消息进行…

使用 LSTM(长短期记忆网络) 模型对时间序列数据(航空旅客人数数据集)进行预测

代码功能 数据准备 加载数据:从公开的航空旅客人数数据集(Airline Passengers Dataset)中读取时间序列数据。 对数变换和平稳化:对数据应用 log1p 函数减少趋势和波动,使模型更容易学习规律。 归一化处理:…

《操作系统 - 清华大学》5 -2:覆盖技术

文章目录 1. 目标2. 覆盖的基本原理3. 覆盖技术的不足 1. 目标 覆盖技术产生于上世纪80年代和90年代初的时候,在那时候操作系统能力是很弱的,所以说当初目标是要在能够比较小的可用内存中运行比较大的程序,这个比较小,比较大的相对…

使用 Nginx 在 Ubuntu 22.04 上安装 LibreNMS 开源网络监控系统

#LibreNMS 是一个功能强大的开源网络监控系统,它能够为你的网络性能和设备提供全面的监控。本文将引导你通过一系列步骤,在 Ubuntu 22.04 服务器上安装和配置 LibreNMS,使用 Nginx 作为 Web 服务器。 简介 LibreNMS 提供了对网络设备和性能…

Spring注入Map学习

Spring注入Map学习 在Spring中 在策略模式中, 会经常用到 根据Bean名称获取Bean的实例 有2个方法很好用 1. 使用Autowired注入 2. 使用构造方法注入 但是奇怪的一点是: 日志打印并没有看到结果, 第一行的 Autowired的结果 是个null 那是因为 注入时机 的问题 注入时机&…

【Redis_Day5】String类型

【Redis_Day5】String类型 String操作String的命令set和get:设置、获取键值对mset和mget:批量设置、获取键值对setnx/setex/psetexincr和incrby:对字符串进行加操作decr/decrby:对字符串进行减操作incrbyfloat:浮点数加…

谷歌云无法ssh登录(修改sshd_config也不行)

sudo -i vi /etc/ssh/sshd_config passwd root /etc/init.d/ssh restart service sshd restart 这是网站大部分教程讲的,但是我实际试了还是连不上 参考https://linux.do/t/topic/260732/15 原来/etc/ssh/sshd_config.d/下面有个60开头的文件,也需…

【FPGA-MicroBlaze】串口收发以及相关函数讲解

前言 工具:Vivado2018.3及其所对应的SDK版本 目前网上有许多MicroBlaze 的入门教程,比如下面的这个参考文章,用串口打印一个hello world。 【FPGA】Xilinx MicroBlaze软核使用第一节:Hello World!_fpga软核microblaze-CSDN博客 个…