Linux系统程序设计:从入门到高级Day02

这一篇 我带大家复习一下,C语言中的文件 那一部分

大家注意 这里的图并非原创 是当时我老师的图片 

本片作用主要是 后续会有文件相关操作,这篇帮大家复习C语言文件中的内容 有助于大家后面的理解。

文章中代码大多是图片格式,是因为这是我当时学的时候记得笔记,当时为了方便阅读,都以截图的方式记录,找不到源码的,我截取了老师当时的源码,并不是没有理解的搬运过程,谢谢理解!!希望对你有所帮助
 

知识点1【文件的概述】

1、文件的分类(存储介质)

磁盘文件:文件的数据存在磁盘上(音视频,图片文件,文档文件)

设备文件:通过系统将外部设备具体成文件

2、文件分类(存储方式)

任何磁盘文件 在物理上的都是二进制存储(计算机只能识别01)

逻辑上:硬盘文件分为二进制文件、文本文件

文本文件:基于字符编码的文件

二进制文件:基于值编码的文件

文本文件:

基于字符编码,常见编码ASCII,Unicode等

一般可以用文本编辑器直接打开

例如:数 5678 的以 ASCII 存储形式为:

ASCII 码:00110101 00110110 00110111 00111000

歌词文件(lrc):文本文件

二进制文件:

基于值编码,把内存中的数据原样输出到磁盘上

一般需要自己判断或使用特定软件分析数据格式

例如:数 5678 的存储形式为: 二进制码:0001 0110 0010 1110

文本文件和二进制文件的区别

文本文件

优点:

一个字节一个意思,便于查看 :可以直接使用char *p 指向首元素位置,%c打印

缺点:

空间大:一个码一个字节

效率低:将内存数据 进行ASCII码转换后,再存储到磁盘

二进制文件

二进制文件

优点:

空间小:原样存储(内存怎么写,硬盘怎么存),按照数据大小分配空间

效率高:不需要来回转换

缺点:

数据不定长,不方便查看

还有以下区别

注意:

写代码 是操作内存;

也可以直接编辑硬盘中的文件

当要用文件区分是哪个系统时:

现在各系统的磁盘文件的分别输入换行操作,在内存rb(二进制文件读取)打开文件,字符查找\r即可

利用知识点

在windows下换行是\r\n,Linux下是\n

文本文件 有一个转换的过程

二进制文件 数据原样存储与提取

知识点2【文件缓冲区】

缓冲区的目的

1、文件缓冲区的刷新方式

1、行刷新(遇到换行符 刷新)

2、满刷新(缓冲区数据放满 刷新)

这个的现象时我们可以每隔一段时间就会看到 终端上刷新数据

3、强制刷新(使用ffulsh函数 刷新)

4、结束刷新 (关闭文件的时候 将缓冲区的数据 全部刷新)

2、模拟时钟

\r 回到行首

知识点3【文件指针】

文件的指针类型 FILE *

用户定义一个指针变量

指针变量指明文件信息的起始地址 通过库函数去操作文件即可

此时的文件指针指向的地址并不是文件的真实地址,真实地址在磁盘中,这时指向的是用fopen后,产生的文件信息的首地址

库函数借助流指针操作磁盘文件

还有 fflush 中 使用的fflush(stdout) 强制刷新到当前输出终端(屏幕)

使用fgets时 使用fgets(buf,sizeof(buf),stdin)

知识点4【文件的API】

文件的操作步骤 打开 读写 关闭

1、打开文件fopen

返回值

成功:成功打开的文件的地址

失败:NULL

path

是 文件的路径,包含文件名

指针类型可以做字符串的首地址 而路径保存在字符串中

char* p= “/home/work/c/day07/a.txt”;

/home/work/c/day07/a.txt 为文件的路径

fopen(p,mode)

mode为打开文件的方式 以读 写 可读可写 追加的方式打开

文件的打开方式mode:

r:只读

w:只写

a:追加方式打开

+:可读可写的方式打开

t:以文本文件方式打开(默认省略 即r默认打开文本文件)

b:以二进制文件方式打开(必须显式说明 读的时候必须是rb)

模式间可以组合

文件信息的空间在fopen调用后自动生成,无需用户创建,只需要用文件指针变量取接地址即可

2、关闭文件fclose

两个动作

1、刷新缓冲区,把缓冲区剩下的数据刷新到文件中

2、每个文件都申请了一个堆区空间,即调用fopen时,生成的FILE* fp 指向的区域(文件信息),将其释放

以上两个动作在库函数fclose 中进行

若上式没有return;

会出现段错误,因为若无return; 函数会继续执行到fclose 会访问fp的地址(NULL),出现段错误

3、一次读写一个字符

fputc fgetc

fputc(写操作)

EOF(end of file)是stdio.h中的一个宏定义,值为-1

注意:EOF只在文本文件中有效,文本文件中存的是字符(0~128),可用-1表示文件结束;然而二进制文件中存的是数值,数据原样输出,-1被当作数值处理无特殊含义

案例

fgetc(读操作)

案例

补充

fgets 内部流指针控制,读完一个自动都下一个,不用手动++

注:文件内部是没有EOF的,是系统判断指针已经指向文件末尾,系统会给一个EOF

流 的概念:在编程中都是以字节为单位出的

EOF 打印出来

我们从磁盘中打开文件 会发现是乱码

4、一次读写一个字符串

fputs fgets

fputs(写操作)

返回值:该函数返回一个非负值,如果发生错误则返回 EOF(-1)

把字符串写进文件时,‘\0’并不算文件大小,因为文件的空间大,初始化为0('\0' = 0),可见'\0'在文件中并没有特殊含义,并不能算一个字节

fgets(读操作)

与到换行符或者文件末尾结束读取

一次只能读取个字节

或者在读取 size-1 个字节停止(size-1:最后一个字节存放'\0'结束字符串)

会获取回车与空格

需要将buf[strlen[buf] - 1] = 0;

案例

实现 将一个文件 中的内容转移到另一个文件

5、一次读写n块字符串

fwrite fread

fwrite(写操作)

将内存数据原样写入 硬盘文件中

返回值是实际写入的块数即nmemb

不做转换不方便阅读

案例

fread(读操作)

将磁盘数据 原样输入到 内存

返回值:实际读到的块数,若每块100,nmenb为5,文件中有250给字节,则返回值为2

案例

使用:大文件拷贝,只要不需要在终端上查看就可以用write

优点:快

缺点:不方便查看

6、格式化读写

有一个转换的过程 方便查看

fprintf fscanf

慢 但是阅读性高

fprintf (写操作)

想一下sprintf

是将数据先转化为字符后,存入数组中,而fprintf是先转化字符后存入文件中

可知过程 内存数据变为数组,在存入文件

案例

fscanf (读操作)

知识点5 随机读写

文件默认是顺序读写:读写才能移动流指针,用户不能修改

随机读写:用户可以更改文件流指针的位置(使用函数实现)

1、引入案例

如果没有红色框内的部分,直接读取,是得不到内容的,因为流指针的位置没有在起始位置

2、随机读写的API

fseek rewind ftell

1、rewind 复位文件流指针

2、ftell 返回文件流指针 距离文件首部的字节数

再次强调:‘\0’在文件中无特殊含义,不算文件大小

3、fseek 文件流指针定位

参数3

参数2

案例(重点)

一次性读取文件数据

回顾

windows下即在VS code 中编辑文本时输入回车,大小为2个字节

当在linux下vim编辑文本,输入回车,大小为1个字节

结束

代码需要手敲,才能更好的理解。希望今天的内容对你能够有所帮助,如果你喜欢我的分享,请点赞收藏加关注,谢谢大家!!

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

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

相关文章

N元语言模型的时间和空间复杂度计算

对于N元语言模型,时间复杂度是O(V ^ {N-1}),空间复杂度是O(V ^ {N}),N是词汇表的大小。 空间复杂度:存储所有可能的N-1元组及其对应的词的频次需要大量的存储空间。例如,对于一个三元模型(N3)&…

Tmux 核心操作速查指南

Tmux 最常用操作笔记 1. 基本概念 会话(Session):一个tmux会话可以包含多个窗口,适合长期任务管理。窗口(Window):每个窗口是一个独立的终端界面,可包含多个面板。面板&#xff08…

哈希表系列一>两数之和

目录 题目:方法:暴力代码:优化后代码: 题目: 链接: link 方法: 暴力代码: public int[] twoSum(int[] nums, int target) {解法一:暴力解法:int n nums.length;for(int…

端到端机器学习流水线(MLflow跟踪实验)

目录 端到端机器学习流水线(MLflow跟踪实验)1. 引言2. 项目背景与意义2.1 端到端机器学习流水线的重要性2.2 MLflow的作用2.3 工业级数据处理需求3. 数据集生成与介绍3.1 数据集构成3.2 数据生成方法4. 机器学习流水线与MLflow跟踪4.1 端到端机器学习流水线4.2 MLflow跟踪实验…

英语学习:读科技论文的难处

如果读起科技论文, 我们就知道自己到底欠缺什么知识了, 那是一个挨着一个的缺。 而且还没有维基百科可用。 怎么办?没办法!硬看! 而且还要面临语言的差异性困难。比如这一句怎么翻译比较合适?还是直接不翻译…

001 使用单片机实现的逻辑分析仪——吸收篇

本内容记录于韦东山老师的毕设级开源学习项目,含个人观点,请理性阅读。 个人笔记,没有套路,一步到位,欢迎交流! 00单片机的逻辑分析仪与商业版FPGA的逻辑分析仪异同 对比维度自制STM32逻辑分析仪商业版逻…

基数排序算法解析与TypeScript实现

基数排序(Radix Sort)是一种高效的非比较型整数排序算法,通过逐位分配与收集的方式实现排序。本文将深入解析其工作原理,并给出完整的TypeScript实现。 一、算法原理 1. 核心思想 多关键字排序:将整数按位数切割成不同…

最新全开源码支付系统,赠送3套模板

最新全开源码支付系统,赠送3套模板 码支付是专为个人站长打造的聚合免签系统,拥有卓越的性能和丰富的功能。它采用全新轻量化的界面UI 让您能更方便快捷地解决知识付费和运营赞助的难题,同时提供实时监控和管理功能,让您随时随地…

PHP基础二【变量/输出/数据类型/常量/字符串/运算符】

PHP基础二 1. PHP变量2. PHP输出3. 数据类型3.1 字符串3.2 整型3.3 浮点型3.4 布尔型3.5 数组3.6 对象3.7 NULL3.8 资源类型3.9 类型比较 4. 常量5. 运算符 1. PHP变量 1. 我们来看一个实例&#xff1a; <?php$x 5;$y 6;$z $x $y;echo $z; // echo 是输出&#xff0c;…

ue5 仿鬼泣5魂类游戏角色和敌人没有碰撞

UE5系列文章目录 文章目录 UE5系列文章目录前言一、问题原因二、设置碰撞2.读入数据 总结 前言 ue5 仿鬼泣5魂类游戏角色和敌人没有碰撞 一、问题原因 在UE5中&#xff0c;角色和敌人没有碰撞可能是由多种原因导致的&#xff0c;以下是一些可能的原因及解决方法&#xff1a…

《AdaBoost:从弱分类器到强模型的进化之路》

目录 1. AdaBoost 的核心思想 2. AdaBoost 的关键步骤 步骤 1&#xff1a;初始化样本权重 步骤 2&#xff1a;迭代训练弱分类器 步骤 3&#xff1a;组合弱分类器 3. 用例子详解 AdaBoost 数据集&#xff1a; 迭代过程&#xff1a; 第1轮&#xff08;t1&#xff09;&am…

Android Settings 有线网设置界面优化

Android Settings 有线网设置界面优化 文章目录 Android Settings 有线网设置界面优化一、前言二、简单修改1、修改的EthernetSettings代码&#xff1a;2、有线网ip获取代码&#xff1a;3、AndroidManifest.xml定义有线网的Activity4、修改后界面&#xff1a; 三、其他1、有线网…

基于web的生产过程执行管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 随着世界经济信息化、全球化的到来和电子商务的飞速发展&#xff0c;推动了很多行业的改革。若想达到安全&#xff0c;快捷的目的&#xff0c;就需要拥有信息化的组织和管理模式&#xff0c;建立一套合理、畅通、高效的线上管理系统。当前的生产过程执行管理存在管理效率…

XSS 攻击风险与防御实践

✅ 框架与 XSS 防护概况 框架是否默认转义高危场景建议防御措施React✅ 是使用 dangerouslySetInnerHTML避免使用&#xff0c;必要时做内容清洗Vue.js✅ 是使用 v-html避免使用&#xff0c;或使用 DOMPurify 清洗Angular✅ 是使用 innerHTML、bypassSecurityTrustHtml谨慎绕过…

Cesium 时间线 及 坐标转换

文章目录 Cesium 基础理解&#xff08;二&#xff09;TimeLine & Clock 应用场景核心代码实例及解释代码解释 Cesium 之 实体动画构建实体动画的技巧1. 利用时间属性2. 组合动画效果3. 使用动画曲线 优化点1. 减少属性更新频率2. 优化实体数量3. 合理使用材质和纹理 注意事…

ngx_regex_init

定义在 src\core\ngx_regex.c void ngx_regex_init(void) { #if !(NGX_PCRE2)pcre_malloc ngx_regex_malloc;pcre_free ngx_regex_free; #endif } NGX_PCRE21 #if !(NGX_PCRE2) 就为假 条件不成立 ngx_regex_init 函数就成了空实现 NGX_PCRE2 被定义&#xff0c;则表示 Ngin…

第二期:深入理解 Spring Web MVC [特殊字符](核心注解 + 进阶开发)

前言&#xff1a; 欢迎来到 Spring Web MVC 深入学习 的第二期&#xff01;在第一期中&#xff0c;我们介绍了 Spring Web MVC 的基础知识&#xff0c;学习了如何 搭建开发环境、配置 Spring MVC、编写第一个应用&#xff0c;并初步了解了 控制器、视图解析、请求处理流程 等核…

一文读懂数据仓库:从概念到技术落地

数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合&#xff0c;用于支持管理决策。以下是关于数据仓库的详细介绍&#xff1a; 一、特点 面向主题&#xff1a;数据仓库围绕特定主题组织数据&#xff0c;如客户、产品、销售等&#xff0c;而不是像传统数…

JavaScript学习18-css操作和事件处理程序(html/DOM0/DOM2)

一、css操作 第一种&#xff1a;容易出错 第二种&#xff1a;有效避免错误 第三种&#xff1a; 二、事件处理程序 1.HTML事件 2.DOM0级事件处理 3.DOM2级事件处理

npm设置代理和取消代理

设置代理 具体代理端口要根据自己的来 npm config set proxy http://127.0.0.1:7890 npm config set https-proxy http://127.0.0.1:7890取消代理 npm config delete proxy npm config delete https-proxy查看代理 npm config get proxy # 应返回 null npm config get…