C语言_二进制文件

Ustinain 等级 970 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”,但是
统计字符串中字符出现的次数(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,
C 如何判断编译器是否支持C90 C99?
参考:《C Primer Plus》,Stephen Prata著,姜佑译。 ANSI/ISO C标准 美国ANSI成立委员会X3J11,于89/90年,99年,11年,发布C标准:C89/C90,C99,C11。 **ANSI/ISO 各版本C标准** **C标准** **描述** 经典C 也称K&R C,87年K&R著作《C语言程序设计》,
C++11新特性学习
1、什么是C+11 ========= C++11标准为C++编程语言的第三个官方标准,正式名叫ISO/IEC 14882:2011 - Information technology -- Programming languages -- C++。在正式标准发布前,原名C++0x。它将取代C++标准第二版ISO/IEC 14882:2003 - Progr
C++学习_从C到C++
### 一、引用的概念和应用 * * * ####  1.引用的概念 下面写法定义了一个引用,并将其初始化为引用某个变量。 类型名 & 引用名 = 某变量名; int n = 4; int & r = n; // r引用了n,r的类型是 int & 某个变量的引用,等价于这个变量,相当于该变量的一个别
C++学习建议
// 转载 C++学习建议 C++缺点之一,是相对许多语言复杂,而且难学难精。许多人说学习C语言只需一本K&R《C程序设计语言》即可,但C++书籍却是多不胜数。我是从C进入C++,皆是靠阅读自学。在此分享一点学习心得。个人认为,学习C++可分为4个层次: 第一层次:C++基础:挑选一本入门书籍,如《C++ Primer》、《C++大学教程》、或Stro
C语言编译器为什么能够用C语言编写?
不知道大家有没有想过一个问题:C语言编译器为什么能够用C语言编写? 所谓C语言编译器,就是把编程得到的文件,比如.c,.h的文件,进行读取,并对内容进行分析,按照C语言的规则,将其转换成cpu可以执行的二进制文件。 在学习C/C++或者想要学习C/C++可以加入我们的学习交流QQ群: 954607083 ,领取学习资料 其本质在于对文件的读入,分析,及
4.python
#一 > **编写一个函数判断输入的三个数是否能构成三角形** **我写的函数** def is_triangle(a, b, c): if (a+b>c and abs(a-b)<c) or (a+c>b and abs(a-c)<b) or (b+c>a and abs(b-c)<a): return
ANSI C、ISO C、Standard C联系与区别
做C语言开发的人,经常会遇到“ANSI C”、“ISO C”与“Standard C”三种术语,经常会让人傻傻分不清楚。博主之前按也是搞不清三者的关系,于是某天下定决心,一定要搞清楚三者的关系,先百度上搜下。下面是在百度百科上搜索关键字“ANSI C”得到的结果: \================================分割线==
C++ Modern C++
        现代的C++,比较笼统。最近10多年的东西是否是现代的呢?我认为“时髦”这个词更准确一些。每个年代,时髦总是标新立异的,总是被年龄大一些的人看不惯的(虽然这些人也曾经“赶过时髦”)。Modern C++就是用最时髦的东西去装饰您的代码。但是本质的东西还是没有变。改革初期,最时髦的服饰是喇叭裤,霹雳舞手套。那时没有智能手机,时髦的人扛着一台卡带
Emacs 学习笔记
1.  C-v  向下翻页 2.  M-v 向上翻页 3.  C-l   将光标位居中 4.  C-n  下一行 next 5.  C-p  上一行 previous 6.  C-b   光标backward 7.  C-f    光标forward 8.  M-f
GNU C library 2.17 released(支持64位ARM)
The GNU C Library ================= The GNU C Library version 2.17 is now available. The GNU C Library is used as *the* C library in the GNU systems a
Modern C++ 书籍推荐
> 本文介绍了一些 Modern C++ 的相关书籍 整理了一份 Modern C++(现代 C++,意指使用 C++11 及之后标准特性的 C++),有兴趣的朋友可以参考一下~ #### 基础 * The C++ Programming Language ![cover_1](https://oscimg.oschina.net/oscnet/
StickEngine
整体概述是 [https://my.oschina.net/kkkkkkkkkkkkk/blog/3190865](https://my.oschina.net/kkkkkkkkkkkkk/blog/3190865) 引入C#是为了降低开发难度,特别是战斗服部分,相比使用lua具有高性能,双端开发等优势。 引擎主体还是C/C++实现。这一点和Unity就
C/C++基础知识
//main程序入口 argc命令行变量的数量 argv命令行变量的数组int main(int argc, char argv 在上述例子中,main的返回类型是int,而返回值0的确是一个int类型的值。标准输入:istream——cin标准输出:ostream——cout、cerr、clog 通常使用cerr来输出警