c 语言 文件文本视图 二进制视图,C二进制文件与文本文件效率

我是C语言的新手,我需要一些帮助。

可以说我只需要在文件中存储6位数字。 (让我们假设int的大小等于4)

使用文本文件或二进制文件,在内存方面有什么效率更高? 我不确定如何解决这个问题,欢迎您的帮助

由于数据在磁盘上,因此内存与此无关。将其从磁盘上删除是另一回事。在撰写本文时,您的问题没有用例说明,因此,除了纯粹的猜测之外,您的问题似乎无法我可以理解为什么面对这个"问题"会很困难,因为实际上没有人公开。在两种情况下,存储形式的选择都有其优缺点。这些内容是否适用于您将需要更多信息。

磁盘比RAM慢上百万倍。

如果您的意思是"就文件大小而言",则4当然小于6,因此,如果使用二进制而不是文本,则文件将小33%。实际上要多一点,因为您需要数字之间的分隔符作为文本,而不是二进制数字之间的分隔符。

@unwind我认为他的意思是int的大小是4个字节。因此6位数字仍然是4个字节,无论是二进制还是文本。

@RedSerpent是的,这就是我的阅读方式,但是如果以文本形式存储,那么像" 123456"这样的六位数数字将不会是4个字节。我现在很困惑。

在标题中,您提到了效率。如果将数字写为64位整数,则它们将比相同数量的1字节(8位)字符占用更多空间。但是,如果您需要写大的复杂数据,如果出现问题,那么如果是文本文件,则修复起来要容易得多。否则,您将不得不编写一个特殊的程序来检查二进制文件,占用额外的时间等。

大多数人将文件分为两类:二进制文件和ASCII(文本)文件。您实际上已经同时使用了两者。您编写的任何程序(C / C ++ / Perl / HTML)几乎可以肯定是ASCII文件。

好的。

ASCII文件定义为由ASCII字符组成的文件。它通常是使用文本编辑器(如emacs,pico,vi,记事本等)创建的。那里有许多高级编辑器可用于编写代码,但它们可能并不总是将其保存为ASCII。 ASCII是国际标准。

好的。

计算机科学就是关于创建良好的抽象的。有时成功了,有时却没有成功。好的抽象是关于呈现用户可以使用的世界的视图。文本编辑器是最成功的抽象方法之一。

好的。

当您编写程序并输入注释时,很难想象此信息没有存储为字符。 ASCII /文本文件实际上存储为0和1。

好的。

文件存储在磁盘上,磁盘可以用某种方式表示1和0。我们仅称它们为1和0,因为这也是一种抽象。不管使用哪种方式将0和1存储在磁盘上,我们都不会在乎,只要我们能想到它们即可。

好的。

实际上,ASCII文件基本上是二进制文件,因为它们存储二进制数。即,ASCII文件存储0和1。

好的。

ASCII和二进制文件之间的区别?

好的。

ASCII文件是存储ASCII码的二进制文件。回想一下,ASCII码是存储在一个字节中的7位代码。更具体地说,有128个不同的ASCII码,这意味着只需要7位就可以表示一个ASCII字符。

好的。

但是,由于最小可用大小为1个字节,所以这7位是任何字节的低7位。最高有效位是0。这意味着,在任何ASCII文件中,您都在浪费1/8的位。特别是,未使用每个字节的最高有效位。

好的。

尽管ASCII文件是二进制文件,但有些人将它们视为不同类型的文件。我喜欢将ASCII文件视为特殊类型的二进制文件。它们是二进制文件,每个字节均以ASCII代码编写。

好的。

完整的常规二进制文件没有此类限制。 256位模式中的任何一种都可以在二进制文件的任何字节中使用。

好的。

我们一直在使用二进制文件。可执行文件,目标文件,图像文件,声音文件和许多文件格式都是二进制文件。使它们成为二进制的原因仅仅是二进制文件的每个字节可以是256位模式之一。它们不限于ASCII码。

ASCII文件示例

好的。

假设您正在使用文本编辑器编辑文本文件。因为使用的是文本编辑器,所以几乎可以编辑ASCII文件。在此全新文件中,键入" cat"。也就是说,字母" c",然后是" a",然后是" t"。然后,您保存文件并退出。

好的。

怎么了?暂时,我们不必担心打开文件,修改文件和关闭文件意味着什么的机制。相反,我们关心的是ASCII编码。

好的。

如果您查找ASCII表,则会发现0x63、0x61、0x74的ASCII代码(0x仅表示值以十六进制表示,而不是十进制/以10为基数)。

好的。

Here's how it looks:

ASCII   'c'        'a'          't'

Hex     63          61          74

Binary  0110 0011   0110 0001   0111 1000

每次键入ASCII字符并保存时,都会写入一个与该字符对应的整个字节。这包括标点符号,空格等。

好的。

因此,当您键入" c"时,它将被保存为0110 0011到文件中。

好的。

现在,有时文本编辑器会输入您可能不需要的字符。例如,某些编辑器"坚持"每行以换行符结尾。

好的。

文件的最后一行可能是缺少换行符的唯一位置。一些编辑器允许最后一行以换行符之外的其他结尾。一些编辑器在每个文件的末尾添加换行符。

好的。

不幸的是,即使换行符也不是那么普遍。在UNIX文件中通常使用换行符,但是在Windows中,通常在每个行的末尾使用两个字符(回车符,换行符,我相信是\ r和\ n)。为什么只需要两个字符就两个字符?

好的。

这可以追溯到打印机。在过去,打印机返回到行首所花费的时间等于键入两个字符所花费的时间。因此,在文件中放置了两个字符,以使打印机有时间将打印机球移回行首。

好的。

这个事实并不那么重要。主要是琐事。我提出它的原因只是为了以防万一,您可能想知道为什么从Windows向UNIX传输文件有时会产生有趣的字符。

编辑二进制文件

既然您知道在ASCII文件中键入的每个字符都对应于文件中的一个字节,那么您可能会理解为什么很难编辑二进制文件。

好的。

如果要编辑二进制文件,则确实要编辑单个位。例如,假设您要编写二进制模式11000011。您将如何执行此操作?

好的。

您可能很天真,请在文件中输入以下内容:

好的。

11000011

但是,您现在应该知道,这并不是在编辑文件的各个位。如果您输入" 1"和" 0",则实际上是在输入0x49和0x48。也就是说,您要在文件中输入0100 1001和0100 1000。您实际上(间接地)一次输入8位。

好的。

有些程序允许您键入49,并将其转换为单个字节0100 1001,而不是ASCII码" 4"和" 9"。您可以将这些程序称为十六进制编辑器。不幸的是,这些可能不是那么容易获得。编写一个程序来读取一个看起来像十六进制对的ASCII文件,然后将其转换为具有相应位模式的真正的二进制文件并不难。

好的。

也就是说,它需要一个看起来像这样的文件:

好的。

63 a0 de

并将此ASCII文件转换为以0110 0011开始的二进制文件(二进制为63)。请注意,此文件是ASCII,这意味着真正存储的是ASCII码,分别为'6','3',''(空格),'a','0'等。程序可以读取此ASCII文件,然后生成适当的二进制代码并将其写入文件。

好的。

因此,ASCII文件可能包含8个字节(字符为6个字节,空格为2个字节),输出二进制文件将包含3个字节,每十六进制对一个字节。

好的。

写入二进制文件

好的。

人们为什么仍然使用二进制文件?原因之一是紧凑性。例如,假设您要写入数字100000。如果以ASCII键入,则将使用6个字符(即6个字节)。但是,如果将其表示为无符号二进制,则可以使用4个字节将其写出。

好的。

ASCII很方便,因为它易于阅读,但是会占用很多空间。您可以使用二进制文件来更紧凑地表示信息。

好的。

例如,您可以做的一件事是将对象保存到文件中。这是一种序列化。要将其转储到文件中,请使用write()方法。通常,您将指针指向对象,并将表示对象的字节数(使用sizeof运算符确定)传递给write()方法。然后,该方法将出现在内存中的字节转储到文件中。

好的。

然后,您可以使用相应的read()方法从文件中恢复信息并将其放入对象中,该方法通常采用指向对象的指针(并且该指针应指向已分配内存的对象,无论是静态还是动态已分配)和对象的字节数,然后将字节从文件复制到对象中。

好的。

当然,您必须小心。如果您使用两种不同的编译器,或将文件从一种机器转移到另一种机器,则此过程可能无法正常工作。特别地,对象可以被不同地布置。这可以像字节顺序一样简单,或者可能存在填充问题。

好的。

这种将对象保存到文件的方法既简单又好用,但是可能不那么容易移植。此外,它等效于浅表副本。如果您的对象包含指针,它将把地址写出到文件中。这些地址可能完全没有意义。在程序运行时,地址可能很有意义,但是如果退出并重新启动,则这些地址可能会更改。

好的。

这就是为什么有些人发明自己的对象存储格式的原因:增加可移植性。

好的。

但是,如果您知道不存储包含指针的对象,并且正在使用与编写该文件的计算机类型相同的计算机系统中读取文件,并且使用的是相同的编译器,那么它应该可以工作。

好的。

这是人们有时更喜欢写整数,字符等而不是整个对象的原因之一。它们往往更易于携带。

好的。

ASCII文件是由ASCII字符组成的二进制文件。 ASCII字符是存储在一个字节中的7位编码。因此,ASCII文件的每个字节的最高有效位都设置为0。将ASCII文件视为一种特殊的二进制文件。

好的。

通用二进制文件使用所有8位。二进制文件的每个字节可以具有完整的256位字符串模式(与仅具有128位字符串模式的ASCII文件相反)。

好的。

有时候Unicode文本文件变得更加流行。但是目前,ASCII文件是文本文件的标准格式。

好的。

好。

很多话。 一些很有见地。 谢谢。

二进制文件基本上是不是"面向行"的任何文件。 任何文件中除实际书写的字符和换行符外,还有其他符号。

通常,当您以文本模式写入文件时,任何新行\都将转换为回车+换行符\

\。

使用与文本文件相对应的二进制文件无法实现任何内存效率,文件存储在磁盘上而不是内存中。 这完全取决于您要处理的文件以及格式化的方式。

由于您使用的是纯整数(无论int大小如何),因此使用文本或二进制文件将对性能产生相同的影响(这意味着您选择使用的类型不会产生任何区别)。

如果以后要在文本编辑器中修改或读取文件,则最好使用文本模式写入文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值