C语言_二进制文件

Ustinain
• 阅读 1816

二进制文件

其实所有文件最终都是二进制的

想想我们之前printf()一个整数的时候,实际上是把这个整数格式化了,变成了可以见的形式,就像1,2,3,4,5,6在计算机里不是以1,2,3,4,5,6的形式的,而是二进制存储的,是以四个字节表示这个些1,2,3,4,5,6,而不是六个字节

当我们输入这些数字1,2,3,4,5的时候,实际上输入的是个字符串,这个字符串里面有1,2,3,4,5这个五个字符,那scanf()做的是什么,为什么不叫read,因为它不是直接输入我们输入的值,而是扫描、识别这个字符串,从中识别整数,从而填入那个整数变量里去。
这些输入输出都是都是文本形式的,还有一种二进制的形式,其实也不神秘,从某种意义上说所有文件最终都是二进制的,文本文件也是二进制的,只不过文本文件表现为人可以读的形式而已,文本文件无非可以用简单的形式读写,可以用more、tail、cat等打开文本文件,编辑修改可以用vim等等

而二进制文件需要专门的程序来读写文件

像是.mp3 |.mp4|.jpg等等文件需要专门的工具,你用more打开一个mp3文件是得不到任何有用的东西

文本 VS 二进制

  • 最早的Unix系统喜欢用文本文件来做数据存储和程序配置

    只要有more,vi就可以打开我想要打开的文件

  • 交互式终端的出现(在linux之前)使得人们喜欢用文本和计算机“交谈”

    我输入命令ls 终端给我显示当前目录下所有文件,这是一种交谈,很显然这交谈是文本显示的,我输入的是文本,它显示给我的也是文本,

  • Unix的shell提供了一些读写文本的小程序

  • Windows喜欢用二进制文件

  • DOS是草根文化,不继承和熟悉Unix文化

Windows是一个完全不同的文化背景,在70年代末-80年代初,,个人计算机是个突破”围墙“的东西革命性的东西,那时候的人还不知道在“围墙”里的linux是怎么样工作的,只是凭借着对计算机硬件的理解,来决定这个计算机的软件该怎么做,pc刚开始的时候能力有限,DOS能力也有限,而用二进制更接近底层。

  • 文本的优、劣势

文本的优势是方便人类读写,可以跨平台,在另一个平台也能轻易识别文本
文本的缺点就是程序输入和输出的时候需要经过格式化,这样计算量会变大

  • 二进制的优、劣势

二进制的缺点是人类读写困难,刚好和文本相反,全是0和1,压根识别不了,最重要的是不跨平台,int等类型的大小不一样,存储数据方式:大小端的问题

二进制优点就是程序读写快,计算转换量小,(因为它看的懂呀)

程序为什么要文件

  • 配置

Unix喜欢把所有的配置文件全部存入文本文件里,然后使用vi可以更改配置。
Windows就不一样,它把所有配置数据写入注册表里,他是一个非常大的二进制文件,计算机上的所有程序数据都在这个里面,使用特定的软件来编辑

  • 媒体

这个只能是二进制的,而现实确实,程序通过第三方库来读写文件,很少直接读写二进制文件了

可移植性

  • 这样的二进制文件不具有可移植性

    在int为32位的机器上写成的数据文件,无法直接在int为64位的机器上正确读出,因为你本来是4个字节的一个数据,而int为64为机器直接,八个字节一砍,很显然就读错了。
    解决的防止一是放弃使用int,而是typedef,具有明确大小的类型

  • 更好的方案是使用文本

在互联网里传输数据 为了解决数据类型变化的不同,大小端存储的不同,放弃的运行速度而改用文本、文本就可以很好解决这个问题,人们已经很少利用C语言的底层的文件读取方式来操作数据了,要么使用数据库,要么使用第三方库。

由于作者的能力水平有限,仅表达个人见解,若有纰漏,望指正,一起进步!

本文转自我的个人博客 https://blog.csdn.net/Ustinian_116/article/details/114783972

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Stella981 Stella981
3年前
C# Aspose.Cells导出xlsx格式Excel,打开文件报“Excel 已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃”
报错信息:最近打开下载的Excel,会报如下错误。(xls格式不受影响)!(https://oscimg.oschina.net/oscnet/2b6f0c8d7f97368d095d9f0c96bcb36d410.png)!(https://oscimg.oschina.net/oscnet/fe1a8000d00cec3c
Stella981 Stella981
3年前
Linux查看GPU信息和使用情况
1、Linux查看显卡信息:lspci|grepivga2、使用nvidiaGPU可以:lspci|grepinvidia!(https://oscimg.oschina.net/oscnet/36e7c7382fa9fe49068e7e5f8825bc67a17.png)前边的序号"00:0f.0"是显卡的代
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Github标星5300+,专门为程序员开发文档开源管理系统,我粉了
!(https://oscimg.oschina.net/oscnet/a11909a041dac65b1a36b2ae8b9bcc5c432.jpg)码农那点事儿关注我们,一起学习进步!(https://oscimg.oschina.net/oscnet/f4cce1b7389cb00baaab228e455da78d0
Stella981 Stella981
3年前
Nginx反向代理upstream模块介绍
!(https://oscimg.oschina.net/oscnet/1e67c46e359a4d6c8f36b590a372961f.gif)!(https://oscimg.oschina.net/oscnet/819eda5e7de54c23b54b04cfc00d3206.jpg)1.Nginx反