C语言_二进制文件

Ustinain 等级 417 0 0

二进制文件

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

想想我们之前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

收藏
评论区

相关推荐

C++概述
概述 C 是静态,可编译,通用,大小写敏感,格式自由的编程语言,它支持程序化,面向对象的,和泛型编程方式。 C 被看作是中间层语言,因为它同时包含了低级语言和高级语言的特性。 C 是于 1979 年在新泽西的茉莉山丘的贝尔实验室由 Bjarne Stroustrup 开发的,它是 C 语言的加强版,最开始它被称作 “C with Classes”,但是
C++ 基本语法
C 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。 对象 对象具有状态和行为。例如:一只狗的状态 颜色、名称、品种,行为 摇动、叫唤、吃。对象是类的实例。 类 类可以定义为描述对象行为/状态的模板/蓝图。 方法 从基本上说,一个方法表示一种行为。一个类可以包含多个
带你掌握不一样的监控进程技术
文章目录 1.技术应用背景(about:blank1_6) 2.效果展示(about:blank2_11) 3.功能代码实现(about:blank3_18) 4.知识背景清单(about:blank4_43) 5.WMI相关概念(about:blank5WMI_70) 6.WMI相关函数(abo
统计字符串中字符出现的次数(Python版)
字符串转list python s 'aabbccd' list1 list(s) 方法一: python list1 'a', 'a', 'b', 'c', 'c', 'c', 'c' dict_cnt {} for value in list1: dict_cntvalue dict_cnt.get(value,
算法笔记:B树
B树广泛应用于各种文件系统,文件系统中,数据都是按照数据块来进行读取操作。结合二叉树的优点和文件系统的特点,于是就有了B树: btree(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/ae3caa193bc4c55f0519114b15313721.png) B树当中每个节点存储
c++11 实现单例模式
C11出来后,里面新增加了好多好用的功能 下面的单例就是使用了C11中的标准库中的mutex和unique_prt 进行内存管理的. 此单例模式不用担心内存的释放问题 pragma once include <memory include <mutex template <class T class Singleton { public: ty
C语言_练习题(一)
前言: 看懂理解代码很容易,难的是把所理解的融会贯通,融合到实例中,你会发现事实和理论会有些许差别,编写实例能更好的帮你积累经验。 0x1 编写一个程序,要求提示输入一个ASCII码值(如,66),然后打印输入的字符。 代码: include <stdio.h int main(){ char i; printf("请输入一个ASCI
我的C语言基础
C语言32个关键字auto 声明自动变量short 声明短整型变量或函数int 声明整型变量或函数long 声明长整型变量或函数float 声明浮点型变量或函数double 声明双精度变量或函数char 声明字符型变量或函数struct 声明结构体变量或函数union 声明共用数据类型enum 声明枚举类型typedef 用以给数据类型取别名co
C语言基础习题50例(一)1-5
虎为百兽尊,罔敢触其怒。惟有父子情,一步一回顾。 习题1 有 1 、 2 、 3 、 4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?实现思路:显然,这个题目需要用到循环,并且是循环嵌套,先列出所有可能的组合,再去掉重复的组合即可。代码如下:cinclude <stdio.hint main(){ int i, j, k,
C语言基础习题50例(二)6-10
给大家推荐一门大数据Spark入门课程,希望大家喜欢。 习题6 用 号输出字母C的图案。实现思路:单行打印即可。代码如下:cinclude <stdio.h int main (void){ printf("\n"); printf("\n"); printf("\n"); printf("
C语言基础习题50例(三)11-15
你们看出神马了吗(\\^_\^\) 习题11 有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少实现思路:从第1个月起,兔子对数分别为1、1、2、3、5、8、13、21...,显然是斐波拉契数列。代码如下:cinclude<stdio.hint mai
C语言基础习题50例(四)16-20
给大家介绍一堂Python入门课,感觉还不错,适合初学者入门。 习题16 输入两个正整数 m 和 n ,求其最大公约数和最小公倍数。实现思路:求两个数的最大公约数分别采用辗转相除法、辗转相减法、枚举法得到,最小公倍数用两个数之积除以最大公约数即可获得。方式一——辗转相除法:思路:(1)将两整数求余 a%b x;(2)如果x 0;则b为最大公
C语言基础习题50例(七)31-35
喜提头条号黄V,有兴趣的朋友可以关注一波,主写IT领域。 习题31 请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。实现思路:使用switch语句,如果第1个字母一样,则判断用情况语句或if语句判断第2个字母。也可以使用条件判断语句,实现相近。代码如下:cinclude<stdio.hint ma
C语言基础习题50例(十)46-50
知足常足,终身不辱。月圆缺,水满溢,事情到了极致一定会遭受祸患,只有懂得知足,才是富足。 习题46 宏define命令练习。实现思路:宏通过define命令定义,分为无参宏和带参宏,可以分别进行测试。这只是一种简单的字符串代换。代码如下:cinclude <stdio.hdefine TRUE 1define FALSE 0
游戏安全实践的一些思考
移动的游戏能够稳定健康的上线。主要需要依赖以下在四个方面:1.前端展示,或者说客户端正常运行。性能稳定不崩溃,不过热能够稳定运行。2.后端,或者游戏后台服务端的。不但要稳定。还有能在有限的服务器资源下,能承受大量的同时在线用户。而且要让游戏中的每个模块都能够承受承受大量的同时在线用户。3.安全也是重点之中。这既包括客户端,又包括服务端。客户端的安全,包括要防