用C语言了解文件那些下 ‘流‘ 事

  • 本篇会加入个人的所谓‘鱼式疯言’
  • ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言,而是理解过并总结出来通俗易懂的大白话,我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的,可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念
    在这里插入图片描述

前言

💕💕💕艾迪巴帝,友子们,今天我们将推开 文件操作 的大门
主要讲的有:

  1. ⽂件的引入?
  2. ⼆进制⽂件和⽂本⽂件?
  3. ⽂件的打开和关闭
  4. ⽂件的顺序读写
    💖💖💖

一.文件的引入

1.为什么要使用文件?

如果没有⽂件,我们写的程序的数据是存储在电脑的内存中
如果程序退出,内存回收,数据就丢失了,等再次运⾏程序,是看不到上次程序的数据的
如果要将数据进⾏持久化的保存,我们可以使⽤ ⽂件。

2. 什么是文件

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

2.1 程序文件

程序⽂件包括源程序⽂件(后缀为 .c
⽬标⽂件(windows环境后缀为 .obj
可执⾏程序(windows环境后缀为 .exe)。

2.2 数据⽂件

⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,
⽐如程序运⾏需要从中读取数据的⽂件,或 者输出内容的⽂件。

本章讨论的是数据⽂件。

在以前各章所处理数据的输⼊输出都是以终端为对象的,即从终端的键盘输⼊数据,运⾏结果显⽰到 显⽰器上。

其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使⽤,这⾥处理的就是磁盘上⽂件.

2.3 文件名

⼀个⽂件要有⼀个唯⼀的⽂件标识,以便⽤⼾识别和引⽤。
⽂件名包含3部分:⽂件路径+⽂件名主⼲+⽂件后缀
例如: c:\code\test.txt
为了⽅便起⻅,⽂件标识 常被称为 ⽂件名

鱼式疯言
就是说呢😊😊😊
我们文件时在磁盘上的,用来存储数据的,文件可以放程序也可以放数据,我们可以在终端(下面第一张的小黑框框),也可以在我们下面磁盘上处理(下面第二张文件路径图)
(1).
在这里插入图片描述
(2).
在这里插入图片描述

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

根据数据的组织形式,数据⽂件被称为⽂本⽂件 或者⼆进制⽂件
数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存,就是⼆进制⽂件。

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件。
⼀个数据在内存中是怎么存储的呢?
字符⼀律以ASCII形式存储,数值型数据既可以⽤ASCII形式存储,也可以使⽤⼆进制形式存储。
在这里插入图片描述

如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占⽤5个字节(每个字符⼀个字节),⽽⼆进制形式输出,则在磁盘上只占4个字节

 #include <stdio.h>
int main()
{int a = 10000;FILE * pf = fopen("test.txt", "wb");fwrite(&a, 4, 1, pf);//⼆进制的形式写到⽂件中 fclose(pf);pf = NULL;  return 0;
}

在这里插入图片描述
文本文件是不打开的哦❤️❤️❤️
那该怎么办呢?
请宝子们看下面分解
在这里插入图片描述

4.文件打开和关闭

4.1流和标准流

<1> 流

我们程序的数据需要输出到各种外部设备
也需要从外部设备获取数据
不同的外部设备的输⼊输出 操作各不相同
为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了 的概念,我们可以把流 想象成流淌着字符的河。
C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的。
⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开 ,然后操作。
在这里插入图片描述

<2> 标准流

那为什么我们从键盘输⼊数据,向屏幕上输出数据,并没有打开流呢? 那是因为C语⾔程序在启动的时候,默认打开了3个流:

• stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。

• stdout - 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出 流中。

• stderr - 标准错误流,⼤多数环境中输出到显⽰器界⾯。

<3> 标准流的栗子🌰

#include<stdio.h>
int main()
{char arr[10]="abcdefg\n";fprintf(stdout,arr);//用 fprintf 标准输出流输出printf(arr);//普通的 printf 输出
}

在这里插入图片描述

鱼式疯言

其实,在我们的运行程序时

我们的编译器就会在底层运行用到我们这三个标准流

输入输出错误

小伙伴了解一下即可,不需要深入研究

这是默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进⾏输⼊输出操作的。

stdin、stdout、stderr 三个流的类型是:
FILE* ,通常称为⽂件指针。
C语⾔中,就是通过 FILE* 的⽂件指针来维护流的各种操作的。

鱼式疯言

啥是 呢?

说白了,就是一个中介,一个中转站,一个快递员,一个转换器,一个中枢枢纽…

上面我们提及了一个陌生的概念,文件指针
这是什么呢?
不妨小伙伴都和我一起继续往下找找答案吧😊😊😊

4.2 文件指针

缓冲⽂件系统中,关键的概念是“⽂件类型指针”,简称“⽂件指针”。 每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名 字,⽂件状态及⽂件当前的位置等)。
这些信息是保存在⼀个结构体变量中的。该结构体类型是由系 统声明的,取名FILE
例如,VS2013编译环境提供的 stdio.h 头⽂件中有以下的⽂件类型申明:

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

不同的C编译器的FILE类型包含的内容不完全相同,但是⼤同⼩异。 每当打开⼀个⽂件的时候,系统会根据⽂件的情况⾃动创建⼀个FILE结构的变量,并填充其中的信 息,使⽤者不必关⼼细节。 ⼀般都是通过⼀个FILE的指针来维护这个FILE结构的变量,这样使⽤起来更加⽅便。 下⾯我们可以创建⼀个FILE*的指针变量:

FILE* pf;
//⽂件指针变量

这上面的概念友友们小小过过眼,知道这个概念就欧克啦
咱们主要的是知道并掌握文件指针的使用 ! ! !
定义pf是⼀个指向FILE类型数据的指针变量。
可以使pf指向某个⽂件的⽂件信息区(是⼀个结构体变 量)。
通过该⽂件信息区中的信息就能够访问该⽂件。
在这里插入图片描述

鱼式疯言

通过⽂件指针变量能够间接找到与它关联的⽂件.

在这里插入图片描述

接下来,该我们实操起来啦💕💕💕

4.3 文件的打开和关闭

⽂件在读写之前应该先打开⽂件,在使⽤结束之后应该关闭⽂件。
在编写程序的时候,在打开⽂件的同时,都会返回⼀个 FILE* 的指针变量指向该⽂件,也相当于建⽴了 指针和⽂件的关系。
ANSIC 规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件。

//打开⽂件
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件
int fclose ( FILE * stream );

在这里插入图片描述

mode 表⽰⽂件的打开模式,下⾯都是⽂件的打开模式:

在这里插入图片描述
友子们是不是都不想看了,我也是😭😭😭
太多了吧,不过我们只需要会前面的 **“r”**和 **“w”**就足够啦!

4.3.1 “w” 的栗子说明

在这里插入图片描述

/* fopen fclose example */
#include <stdio.h>
int main()
{FILE* pFile;//打开⽂件pFile = fopen("myfile.txt", "w");//⽂件操作if (pFile != NULL){fputs("fopen example", pFile);//关闭⽂件fclose(pFile);}return 0;
}

在这里插入图片描述
鱼式疯言:

有该文件我们可以用 “w” 自行打开,

如果没有该文件的话,我们就可以通过 “w” 自动创建

具体对文件的流程就是

打开文件——>文件操作——>关闭文件.

4.3.2 “r” 的栗子说明

在这里插入图片描述

就像上面这样要是没有该文件的情况,
如果我们用 “r” 来实践呢!!!

/* fopen fclose example */
#include <stdio.h>
int main()
{FILE* pFile;//打开⽂件pFile = fopen("myfile.txt", "r");//⽂件操作if (pFile == NULL){perror("fopen");return 1;}//关闭⽂件fclose(pFile);return 0;
}

在这里插入图片描述
小伙伴都看清楚区别了吧 “w” 和 “r”的区别吧😁😁😁

鱼式疯言

我是这样理解的
w—> write 是写的意思吧,如果我们要写,当我们该文件名时,是不是可以先创个文件再写呢 ! ! !
r——> read 是读的意思呢,如果我们要读,那如果也没有该文件名呢,连个文件都没有肯定会报错呢! ! !
如果都有该文件名,这样我们就可以用下面的顺序读写函数对文件进行操作了。💖💖💖

5.文件的顺序读写

5.1 顺序读写函数介绍

在这里插入图片描述
蛙趣,好多啊😣😣😣
没关系,下面由小编来带着大家一起学
咱们两两搭配起来用哦💖💖💖

5.2 fgetc 与 fputc

/*fputc与fgetc_test*/#include<stdio.h>
int main()
{FILE* putpile = fopen("gt.txt", "w");if (putpile == NULL){perror("fopen->putpile");return 1;} for (int i = 0; i < 26; i++){fputc('a' + i, putpile);}fclose(putpile);putpile = NULL;//这里一定要要指针置为空//否则就有可能出差错FILE* getpile = fopen("gt.txt", "r");if (getpile == NULL){perror("fopen->getpile");return 1;}int ch = fgetc(getpile);printf("%c\n", ch);ch = fgetc(getpile);printf("%c\n", ch);ch = fgetc(getpile);printf("%c\n", ch);ch = fgetc(getpile);printf("%c\n", ch);//for (int i = 0; i < 4; i++)//{//	printf("%c\n", fgetc(getpile));//}//也可用循环打印fclose(getpile);getpile = NULL;//最后要关闭文件指针哦return 0;
}

在这里插入图片描述
根据上面的代码,我们就可以对文本进行 啦 !!!

5.3 fgets 与 fputs

在这里插入图片描述

<1>.举个栗子

#include<stdio.h>
int main()
{FILE* putpile = fopen("gt.txt", "w");if (putpile==NULL){perror("fopen");return 1;}fputs("abcde", putpile);fclose(putpile);putpile = NULL;FILE* getpile = fopen("gt.txt", "r");if (getpile==NULL){perror(fopen);return 1;}char arr[5];fgets(arr,4, getpile); printf(arr);fclose(getpile);getpile = NULL;return 0;
}

在这里插入图片描述

鱼式疯言

唯一要注意一点是:

num : 这里是要指定输出字符串大小的

5.3. fprintf 与 fscanf

在这里插入图片描述

<1>.举个栗子

struct Stu
{char name[20];int age;float score;
};
#include<stdio.h>
//fprintf与fscanf_test
int main()
{struct Stu s1 = { "hehehhhh" ,112, 12.366 };struct Stu s2 = {0};FILE* pc = fopen("gt.txt", "w");if (pc==NULL){perror("fopen");return 1;}fprintf(pc, "%s %d %.1f", s1.name, s1.age, s1.score);//fprintf 可以用于写文件fclose(pc);pc = NULL;FILE* pf = fopen("gt.txt", "r");if (pf == NULL){perror("fopen");return 1;}//写读文件//fscanf(pf, "%s %d %f", s1.name, &(s1.age), &(s1.score));//写出该文件的内容拷贝在结构体 s 上fprintf(stdout, "%s %d %.1f\n", s1.name, s1.age, s1.score);//读取或输出该结构体printf("%s %d %.1f\n", s1.name, s1.age, s1.score);fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
在这里插入图片描述

w方式时,我们用 fprintf 可以写入
r方式时,我们可以通过 fscanf 从文本中传出数据到结构体
再通过标准输出流 stdout 打印我们的或者 printf 直接输出

5.4. fwrite 和 fread

在这里插入图片描述

<1>. fwrite 的栗子

  //fwrite
#include<stdio.h>
struct Stu
{char name[20];int age;float score;
};
int main()
{struct Stu s = {"zhangsan", 20, 90.5};FILE* pf = fopen("data.txt", "wb");if (pf == NULL){return 1;}//二进制的形式写文件fwrite(&s, sizeof(s), 1, pf);fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
在这里插入图片描述

前面我们看到fprintf写进去的文本,
下面小伙伴来看看这两者的区别
在这里插入图片描述

<2>. fread 的栗子

#include<stdio.h>
//fread_test
struct Stu
{char name[20];int age;float score;
};
int main()
{struct Stu s = { 0 };FILE* pf = fopen("data.txt", "rb");if (pf == NULL){return 1;}//二进制的形式读文件fread(&s, sizeof(s), 1, pf);printf("%s %d %.1f\n", s.name, s.age, s.score);fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
上面我们讲到了二进制文件在文本文件中是会变乱的
但我们的读取还是一样的读取

鱼式疯言

这点充分说明了,文件的种类虽然不同,形式发生了改变 ,但是文件的内容一般不会改变.

以上顺序读写函数的操作,啥叫 顺序读写 呢🤔🤔🤔
显而易见 顺序 顺序 就是当相当于我们C语言程序自上而下的顺序执行一样,后期我们会进一步讲解我们的文件随机读写,文件读取的判定和文件缓冲区的讲解…

友友们敬请期待哦 !!!

总结
🤞🤞🤞在本篇文章中,我们主要讲解有

  • ⽂件的引入的概念,类别!
  • ⼆进制⽂件和⽂本⽂件的认识
  • .文件指针的理解,以及利用函数对⽂件的打开和关闭
  • ⽂件的顺序读写,不同文件操作函数的理解以及实际操作文本文件和二进制文件。

💖💖💖本次博文就到这里了,感觉各位小伙伴的赏脸品读小编写的拙作哦,

如果觉得小编写的还不错的咱可支持三关下,不妥当的咱评论区指正

希望我的文章能给各位家人们带来哪怕一点点的收获就是小编创作的最大动力💖💖💖

在这里插入图片描述

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

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

相关文章

uniapp实战 —— 自定义顶部导航栏

效果预览 下图中的红框区域 范例代码 src\pages.json 配置隐藏默认顶部导航栏 "navigationStyle": "custom", // 隐藏默认顶部导航src\pages\index\components\CustomNavbar.vue 封装自定义顶部导航栏的组件&#xff08;要点在于&#xff1a;获取屏幕边界…

OpenAI在中国,申请GPT-6、GPT-7商标

根据最新商标信息显示&#xff0c;OpenAI已经在中国提交了GPT-6和GPT-7的商标注册信息&#xff0c;分类是科学仪器和网站服务两大类。申请日期是今年的11月2日&#xff0c;目前处于审核状态。 该申请由知识产权代理公司完成&#xff0c;但申请人的地址正是OpenAI在美国公司的地…

Echarts图表title使用富文本

rich中有配置的话&#xff08;如a&#xff09;使用该样式&#xff0c;没有配置样式的话&#xff08;如b&#xff09;使用外层textstyle的样式&#xff0c;textstyle没有样式的话使用默认样式 const option1 {tooltip: {trigger: "item",},title: {text: ["{a|1…

Java代码审计之SpEL表达式注入漏洞分析

文章目录 前言SpEL表达式基础基础用法安全风险案例演示 CVE-2022-22963漏洞简述环境搭建反弹shell CVE漏洞调试分析本地搭建调试分析补丁分析 总结 前言 表达式注入是 Java 安全中一类常见的能够注入命令并形成 RCE 的漏洞&#xff0c;而常见的表达式注入方式有 EL 表达式注入…

124.(leaflet篇)leaflet禁止地图移动,缩放,双击

地图之家总目录(订阅之前必须详细了解该博客) 完整代码工程包下载,运行如有问题,可“私信”博主。效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>

【Docker】使用docker-compose搭建django+vue工程文章

我们尝试使用docker-compose编排一个后端基于django,前端基于vue,数据库为postgresql并使用nginx进行反向代理的web工程。 工程准备 Docker 安装Docker 安装docker-compose django 在python3.7的环境下创建 修改settings.py文件 修改 将静态文件收集路径添加进 ,笔…

pip指定优先从豆瓣源下载包

对于 Unix/macOS 系统&#xff0c;使用以下命令&#xff1a; pip config set global.index-url https://pypi.douban.com/simple/ 对于 Windows 系统&#xff0c;打开命令提示符或PowerShell&#xff0c;并使用相同的命令&#xff1a; pip config set global.index-url http…

XUbuntu22.04之8款免费UML工具(一百九十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

供应链管理痛点大解析!内附解决方案

供应链是指涉及产品或服务生产、运输、分销和最终交付给客户的过程。 用一个汽车制造的例子来帮助大家理解&#xff1a; 原材料采购&#xff1a; 汽车制造商需要从供应商处采购制造汽车所需的原材料&#xff0c;例如金属、橡胶、塑料和玻璃。生产制造&#xff1a;获得原材料&…

UnoCSS 原子化开发初体验

UnoCSS 是一个即时的原子化 CSS 引擎&#xff0c;旨在灵活和可扩展。核心是不拘一格的&#xff0c;所有的 CSS 工具类都是通过预设提供的。再也不用为了取一个 classname 类名而烦恼了。 一、UnoCSS 特点 完全可定制&#xff1a;无核心工具&#xff0c;所有功能都通过预设提供…

如何公网访问内网的群晖NAS随时随地远程访问本地存储的学习资源

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

成都工业学院Web技术基础(WEB)实验六:ECMAScript基础语法

写在前面 1、基于2022级计算机大类实验指导书 2、代码仅提供参考&#xff0c;前端变化比较大&#xff0c;按照要求&#xff0c;只能做到像&#xff0c;不能做到一模一样 3、图片和文字仅为示例&#xff0c;需要自行替换 4、如果代码不满足你的要求&#xff0c;请寻求其他的…

TwinCAT3 Modbus-TCP Client/Server使用

目录 一、环境配置和准备 1、PLC中安装TF6250-Modbus-TCP库 2、勾选TF6250的license 3、PLC工程中添加Tc2_ModbusSrv库文件 4、分别创建测试ModbusTCP测试的Server和Client程序 二、PLC作为Client端 1、设置测试电脑IP地址 2、运行MobusTCP测试工具 3、PLC端程序编写 …

Hiera实战:使用Hiera实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

可学习超图拉普拉斯算子代码

python版本&#xff1a;3.6。sklearn版本&#xff1a;scikit-learn0.19 问题1&#xff1a;ERROR: Could not build wheels for ecos, scs, which is required to install pyproject.toml-based projects| 解决办法&#xff1a;cvxpy安装过程中遇到的坑_ecos 2.0.7.post1 cp37 …

大数据技术7:基于StarRocks统一OALP实时数仓

前言&#xff1a; 大家对StarRocks 的了解可能不及 ClickHouse或者是远不及 ClickHouse 。但是大家可能听说过 Doris &#xff0c;而 StarRocks 实际上原名叫做 Doris DB &#xff0c;他相当于是一个加强版的也就是一个 Doris ,也就是说 Doris 所有的功能 StarRocks 都是有的&a…

【设计模式--结构型--桥接模式】

设计模式--结构型--桥接模式 桥接&#xff08;Bridge&#xff09;模式定义结构案例好处使用场景 桥接&#xff08;Bridge&#xff09;模式 定义 将抽象与实现分离&#xff0c;使他们可以独立变化。它是用组合关系代替继承关系来实现&#xff0c;从而降低了抽象和实现这两个维…

达梦 DM 数据库

达梦数据库 varchar varchar2的区别, 推荐使用 varchar2 -- 日期格式化 SELECT DATE_FORMAT(GETDATE(), %Y-%m-%d %H:%i:%s);-- 2023-12-11 SELECT CURDATE();-- 2023-12-11 09:22:24 SELECT SYSDATE();-- 2023-12-11 11:09:53.136527 SELECT GETDATE();-- 当前日期1 -1天 SEL…

vite+vue3实现动态路由

在做这个动态路由的时候踩了很多坑&#xff0c;其中大部分是粗心了 动态菜单主要是导入的方式 import.meta.glob 参考&#xff1a;功能 | Vite 官方中文文档 1、多层路由渲染&#xff08;用3层路由做demo&#xff09; 拿到接口的数据是后台直接处理好的结构&#xff0c;但是…

VR转接线方案/VR Link串流数据线方案/VR眼镜PD快充方案

虚拟现实技术(英文名称&#xff1a;Virtual Reality&#xff0c;缩写为VR)&#xff0c;又称虚拟实境或灵境技术&#xff0c;是20世纪发展起来的一项全新的实用技术。虚拟现实技术囊括计算机、电子信息、仿真技术&#xff0c;其基本实现方式是以计算机技术为主&#xff0c;利用并…