【文件 part 1 - 文件的概念】

news2024/11/16 1:46:23

一、文件的概念

文件用来存放程序、文档、音频、视频数据、图片等数据的。
文件就是存放在磁盘上的,一些数据的集合。
在windows下可以通过写字板或记事本打开文本文件对文件进行编辑保存。写字板和记事本是微软程序员写的程序,对文件进行打开、显示、读写、关闭。
作为一个程序员,必须掌握编程实现创建、写入、读取文件等操作。
对文件的操作是经常要用到的知识,比如:传送文件等。

1.1 文件的定义

  1. 磁盘文件:(我们通常认识的文件)
    指一组相关数据的有序集合,通常存储在外部介质(如磁盘)上,使用时才调入内存。
  2. 设备文件:
    在操作系统中把每一个与主机相连的输入、输出设备看作是一个文件,把它们的输入、输出等同于对磁盘文件的读和写。
    - 键盘:标准输入文件
    - 屏幕:标准输出文件
    - 其它设备:打印机、触摸屏、摄像头、音箱等

在Linux操作系统中,每一个外部设备都在/dev目录下对应着一个设备文件,咱们在程序中要想操作设备,就必须对与其对应的/dev下的设备文件进行操作。

标准io库函数对磁盘文件的读取特点:
在这里插入图片描述
文件缓冲区是库函数申请的一段内存,由库函数对其进行操作,程序员没有必要知道存放在
哪里,只需要知道对文件操作的时候的一些缓冲特点即可。

行缓冲

标准io库函数,往标准输出(屏幕)输出东西的时候是行缓冲的。
所谓的行缓冲就是缓冲区碰到换行符的时候才刷新缓冲区。
如果不刷新缓冲区,无法对文件执行读写操作。
行缓冲的刷新条件:

#include <stdio.h>

int main(int argc, char const *argv[])
{
	//由于printf函数是一个标准io,所以只有刷新缓冲区才可以将数据输出到终端
	//printf("hello world");
	
	//刷新缓冲区方法1:使用\n
	//printf("hello world\n");

	//刷新缓冲区方法2:程序正常结束
	//printf("hello world");
	//return 0;

	//刷新缓冲区方法3:使用fflush函数刷新缓冲区
	//printf("hello world");
	//fflush:刷新函数。可以刷新指定的缓冲区
	//stdout:标准输出,就是对终端进行写操作
	//fflush(stdout);

	//刷新缓冲区方法4:当缓冲区满的时候自动刷新
	//默认行缓冲的大小为1024个字节
	int i;
	for(i = 1; i < 300; i++)
	{
		printf("%03d ", i);
	}
	while(1)
	{
	}
	return 0;
}

全缓冲

标准io库函数 ,往普通文件读写数据的,是全缓冲的,碰到换行符也不刷新缓冲区,即缓冲区满了,才刷新缓冲区。
刷新缓冲区的情况:

  1. 缓冲区满了,刷新缓冲区
  2. 人为刷新缓冲区 fflush(文件指针)
  3. 程序正常结束 会刷新缓冲区

无缓冲

在读写文件的时候通过系统调用io (read write),对文件进行读写数据时,是无缓冲的,即写数据会立马进入文件,读数据会立马进入内存。

写文件的流程

应用程序空间 - 内核空间 - 驱动程序 - 硬盘上。
应用程序和内核程序运行在不同的空间里,目的是为了保护内核。

设置缓冲区的目的

通过缓冲可以减少进出内核的次数,以提高效率。

1.2 磁盘文件的分类

一个文件通常是磁盘上一段命名的存储区。
计算机的存储在物理上是二进制的,所以物理上所有的磁盘文件本质上都是一样的:以字节为单位进行顺序存储。
从用户或者操作系统使用的角度(逻辑上)把文件分为:
4. 文本文件:基于字符编码的文件
5. 二进制文件:基于值编码的文件

文本文件

基于字符编码,常见编码有ASCII、UNICODE等。一般可以使用文本编辑器直接打开。
例如:
数5678的以ASCII存储形式为:
ASCII码:00110101 00110110 00110111 00111000
歌词文件(lrc):文本文件

二进制码文件

基于值编码,自己根据具体应用,指定某个值是什么意思。把内存中的数据按其在内存中的存储形式原样输出到磁盘上,一般需要自己判断或使用特定软件分析数据格式。
例如:
数5678的存储形式为:
二进制码:00010110 00101110
音频文件(mp3):二进制文件
图片文件(bmp)文件,一个像素点由两个字节来描述*****######&&&&&
*代表红色的值,#代表绿色的值,&代表蓝色的值,二进制文件以位来表示一个意思。

文本文件、二进制文件对比:

  1. 译码:
    文本文件编码基于字符定长,译码容易些;
    二进制文件编码是变长的,译码难一些(不同的二进制文件格式,有不同的译码方式)。
  2. 空间利用率:
    二进制文件用一个比特来代表一个意思(位操作);
    而文本文件任何一个意思至少是一个字符。
    二进制文件,空间利用率高。
  3. 可读性:
    文本文件用通用的记事本工具就几乎可以浏览所有文本文件。
    二进制文件需要一个具体的文件解码器,比如读BMP文件,必须用读图软件。

总结一下:
文件在硬盘上存储的时候,物理上都是用二进制来存储的。
咱们的标准io库函数,对文件操作的时候,不管文件的编码格式(字符编码、或二进制),而是按字节对文件进行读写,所以咱们管文件又叫流式文件,即把文件看成一个字节流。

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

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

相关文章

2023虎啸奖揭榜 | AI加码,数说故事再度荣膺两项大奖

近日&#xff0c;第十四届虎啸奖颁奖典礼圆满落幕&#xff01;本届获奖名单已正式公布。自2018年起&#xff0c;数说故事已连续6年获奖&#xff0c;今年再度斩获“年度AI&大数据服务公司”大奖&#xff0c;旗下数说雷达是本届虎啸奖唯一荣获“年度最佳营销效果监测评估系统…

新手如何组装一台电脑

新手如何组装一台电脑 首先&#xff0c;我们要先了解一台电脑的基本构成由哪些&#xff1f; CPU显卡主板散热器磁盘内存电源机箱显示器 通常我们需要根据自己对电脑的定位&#xff0c;根据需求和资金确定CPU和显卡 CPU CPU主要有AMD和Intel。 Intel芯片单核能力足够强&…

大数据模型交易行业类型及数据挖掘工具

大数据模型交易平台拥有大量大数据人工智能项目案例资源&#xff0c;涉及行业领域包括农业、电力、电信、地质、医疗、环保、政务等行业。各行业通过模型预测可以获知预测风险率&#xff0c;可以找到应对风险措施同时也可以及时解决相关问题。 政务大数据模型 教育大数…

AutoCV第十课:3D基础

3D基础 前言 手写 AI 推出的全新保姆级从零手写自动驾驶 CV 课程&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考。 本次课程我们来学习下 nuScenes 数据集的可视化。 课程大纲可看下面的思维导图。 1. nuScenes数据集 明确下我们本次学习的目的&#xff1a;将…

ThinkPHP3.2.3通过局域网手机访问项目

折腾一上午&#xff0c; 试了nginx&#xff0c; 试了修改Apache的httpd.conf 试了关闭代理 试了手动配置网络 试了关闭防火墙 试了添加防火墙入站出站规则 问了五个ChatGPT 都没解决。 记录一下 wampserver3.0.4 Apache2.4.18 PHP 5.6.19 MySQL 5.7.11 所有服务启…

交换机上云MACC方式

步骤1、尝试ping通114.114.114.114 步骤2、尝试ping cloud.ruije.com.cn 若不通&#xff0c;配置dns&#xff1a;ip name-server 223.5.5.5 步骤3、设备开启cwmp功能 Ruijie#conf t Ruijie(config)#cwmp Ruijie(config-cwmp)#acs url http://118.190.126.198/service/tr069s…

Jmeter对数据库批量增删改查

目录 前言&#xff1a; 一、主要配置元件介绍 二、共有元件数据配置如下 前言&#xff1a; JMeter可以通过JDBC请求实现对数据库的批量增删改查。JDBC请求模拟了一个JDBC请求&#xff0c;它是连接池中的一个虚拟用户。JDBC请求可以定义SQL语句和预编译参数&#xff0c;…

【100个高大尚求职简历】简历模板+修改教程+行业分类简历模板 (涵盖各种行业) (简历模板+编辑指导+修改教程)

文章目录 1 简历预览2 简历下载 很多人说自己明明投了很多公司的简历&#xff0c;但是都没有得到面试邀请的机会。自己工作履历挺好的&#xff0c;但是为什么投自己感兴趣公司的简历&#xff0c;都没有面试邀请的机会。反而是那些自己没有投递的公司&#xff0c;经常给自己打电…

一文详解!教你如何在Jmeter里添加Get请求

目录 前言&#xff1a; 第一步&#xff0c;添加线程组 第二步&#xff0c;添加HTTP请求 第三步&#xff0c;添加监视器 前言&#xff1a; 前提条件&#xff1a;Jmeter已安装且已配置好&#xff1b;运行Jmeter&#xff0c;打开界面。 在JMeter中添加一个GET请求非常简…

使用uniapp的扩展组件,在微信小程序中出现报错如何解决

在 vue-cli 项目中可以使用 npm 安装 uni-ui 库 &#xff0c;或者直接在 HBuilderX 项目中使用 npm 。 注意 cli 项目默认是不编译 node_modules 下的组件的&#xff0c;导致条件编译等功能失效 &#xff0c;导致组件异常 需要在根目录创建 vue.config.js 文件 &#xff0c;增…

视频播放失败?

&#x1f4f1;1.手机端: 重新下载下客户端即可 &#x1f4bb;2.电脑端: 重新下载客户端->鼠标右键管理员方式打开

管理类联考入栏需看

逻辑 技巧篇 管理类联考•逻辑——解题技巧汇总 真题篇 按年份分类 2010 年一月联考逻辑真题 2011 年一月联考逻辑真题 2012 年一月联考逻辑真题 2013 年一月联考逻辑真题 2014 年一月联考逻辑真题 2015 年一月联考逻辑真题 2016 年一月联考逻辑真题 2017 年一月联考逻辑真…

服务日志性能调优,由log引出一系列的事故

只有被线上服务问题毒打过的人才明白日志有多重要&#xff01; 谁赞成&#xff0c;谁反对&#xff1f;如果你深有同感&#xff0c;那恭喜你是个社会人了&#xff1a;&#xff09; 日志对程序的重要性不言而喻&#xff0c;轻巧、简单、无需费脑&#xff0c;程序代码中随处可见…

分布式架构之EasyES---和 Mybatis用法相似,太方便了

一、EasyES是什么&#xff1f; Easy-Es&#xff08;简称EE&#xff09;是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的ORM开发框架&#xff0c;在 RestHighLevelClient 的基础上,只做增强不做改变&#xff0c;为简化开发、提高效率而生,您如果有用过Myb…

ETF薛斯通道抄底指标表

ETF薛斯通道抄底指标表(20230611) 小白也能懂的薛斯通道抄底指标以及公式(附源码) 名称规模(亿)上市日期delta医药创新ETF5606000.1882022-03-150.72医疗创新ETF51682011.8472021-07-010.75生物药ETF1598396.8282021-02-221.1生物医药ETF15985928.5592021-07-071.17疫苗ETF1596…

LVS+Keepalived 高可用群集

LVSKeepalived 高可用群集 一、LVSKeepalived 高可用群集1、LVS2、工作原理3、Keepalived的特性、特点&#xff1a;4、Keepalived实现原理剖析5、VRRP &#xff08;虚拟路由冗余协议&#xff09; 二、LVSKeepalived 高可用群集部署1、配置负载调度器&#xff08;192.168.184.10…

004:vue中安装使用Mock来模拟数据(详细教程)

第004个 查看专栏目录: 按照VUE知识点 ------ 按照element UI知识点 echarts&#xff0c;openlayers&#xff0c;cesium&#xff0c;leaflet&#xff0c;mapbox&#xff0c;d3&#xff0c;canvas 免费交流社区 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏…

Linux 高可用群集HA LVS+Keepalived高可用 NGINX高可用

Keepalived及其工作原理 Keepalived 是一个基于VRRP协议针对LVS负载均衡软件设计的&#xff0c;通过监控集群中各节点的状态以实现LVS服务高可用的软件&#xff0c;可以解决静态路由出现的单点故障问题。 Keepalived除了能够管理LVS软件&#xff0c;还可以对NGINX haproxy MyS…

HbuilderX--小程序运行配置

安装 HbuilderX 官网下载安装程序 【传送门】 微信小程序开发者工具官网下载 【传送门】 小程序配置 ① 点击顶部工具按钮跳出弹框&#xff0c;弹框第一个设置或者直接使用快捷键 ctrlalt, ② 在配置页面点击运行配置往下划&#xff0c;其余配置如下 微信小程序 将小程序的…

[迁移学习]域自适应

一、定义 1.源域和目标域 源域(Source)和目标域(Target)之间不同但存在联系(different but related)。迁移学习的人物是从源域学习到知识并使其在目标域中取得较好的成绩。 迁移学习可以分为正迁移(postive transfer)和负迁移(negtive transfer)&#xff0c;划分依据是迁移学习…