二进制文件比文本文件能够节省空间吗?

时间:2021-12-07 12:48:38
我有一个大概5m多txt的词典信息,请问如何才能做成一个只占很少空间的文件,大家都是怎么做的?保存成二进制的文件可以吗?

还有,二进制文件比文本文件到底有什么好处啊?

44 个解决方案

#1


二进制文件和文本文件只是打开文件的方式而已,跟保存到磁盘里的文件没关系。
磁盘里的文件都是二进制格式的。

#2


那二进制文件比文本文件到底有什么好处啊?

#3


同意楼上的,如果LZ要节省空间的话,可以试着用哈夫曼等算法压缩一下~~~

#4


肯定节省空间 
虽然磁盘里的文件都是二进制格式的
但是 要知道 数字格式以二进制保存的话 只需要保存实际值
文本格式却要无论如何占用一个字节当然 是unicode更麻烦

二进制文件的好处 自然是可以无差别对待输入数据流

#5


当然 对楼主的用途 用二进制 没有多少改观的 还是用个简单的压缩算法 压缩一下吧

text文件 压缩效果和明显的

#6


多谢楼上各位的解答。采用压缩算法的话,我怕解压也耗时间,就会慢了。我的文本文件是有很多行的词条构成的,除了哈夫曼压缩,还有别的压缩算法吗?哪种压缩方法相对来说压缩大小和解压时间比较合适?

#7


因为再用这个词典的时候会进行查找操作

#8


5M大小根本算不上什么,用不着压缩,除非你的程序在特殊的电脑环境下运行。
储存为非文本文件,按照一定格式储存,你存取时会比较方便;如果用文本文件,在没有索引的情况下速度也比较慢。
还有一点,文本文件很容易被人看到内容,也容易被人修改。

#9


同意楼上的第一句话 
o(∩_∩)o

#10


恩,确实需要压缩的啊^_^

储存为非文本文件,按照一定格式储存,你存取时会比较方便;
-------------------------------------------------
自己设计格式?可是大小还是不能压缩啊

#11


重复数据多就用行程
要么用霍夫曼
或者字典法 

#12


你要的是内存空间大小还是硬盘空间大小?

#13


楼主所谓的二进制文件有很多种定义
1. 文件打开方式来说,有二进制打开方式和文本打开方式,其区别是文本方式会在读的时候把\n转换为\r\n,存储时做反向转换,而二进制方式则不作任何转换。

2. 存储方式:其实很多人说二进制文件是以为二进制文件是一种特殊的存储格式。而实际上这种所谓的特殊存储格式是不存在的。很多人以为电子开关有两种状态,因此文件存储都是以二进制方式存储的。其实这是一种把软件和硬件混淆起来的误解。当然电子文件最终都会转化为某种二值开关的状态,但是不能说文件是二进制的。实际上,从逻辑上讲,所有文件都以字节为单位存储,我们逻辑上应该把它当作一个字节数组,而不是某个二进制码流。

实际上,如果一定有一种和普通文本不一样的存储方式的话,我们应该说结构化存储。结构化存储文件用某种特殊的数据结构管理文件内的数据。例如:doc文件就是一种结构化存储文件,zip文件也是一种。每个结构化存储文件都需要用它特有的软件来打开,对应软件必须理解这种文件结构。例如:mspaint可以打开bmp文件,doc文件可以用winword打开。

一般而言,由于数据结构需要额外字节,这样的文件比普通文本文件要大。当然,由于使用了压缩算法,压缩会使得文件更小,但是如果没有压缩,应该更大才对。

结构化存储的好处是:1. 可以确保文件按照某种固定的逻辑存储 2. 读取速度快 3.支持逻辑上的插入(文件物理上不可插入)

至于楼主想压缩空间,首先对5M文件不值得,压缩解压缩是以时间换空间,而现在的潮流是以空间换时间,除非空间占有率太大,而5M显然不大。

#14


从某种意义上可以这么说

#15


如果是字典,还是去研究一下数据结构,以结构化存储方式存储,因为这可以对你的字典进行index/hash,加快查字典速度。这不过不是简单的事情,三言两语说不清,不太适合在这样的网站问哦:)

#16


受益了 


#17


4 楼说的很有趣,怎么保存实际的值?文件永远是以字节为单位的

#18


楼上的说的太有趣了  呵呵
文件以字节为单位就不能保存实际值了么?
建议楼主好好学学基本功吧 呵呵  
别误导了楼主呢 

事实胜于雄辩 来看看这段测试程序吧

#include <stdio.h>
#include <stdlib.h>

int   main() 

      FILE *fp;
      long i = 9999999;
      fp = fopen("bin.txt","wb");
      fwrite(&i,sizeof(i),1,fp);
      fclose(fp);
      fp = fopen("asc.txt","wt");
      fprintf(fp,"%d",i);
      fclose(fp);
      system("pause");
}




比较下 asc文件大小 和bin文件大小就知道了 呵呵 

#19


在提醒下楼上的 别吧 以字节为最小计量单位跟以字节为存储方式混淆了

当然 我昵称是 Super N-o.O-B 呵呵 

超级菜鸟  初学语言 错误之处  还望海涵

#20


strangefay 

要说常见的二进制(或曰:结构化)存储,看看所谓的TLV格式、XDR格式和ASN.1吧。你的代码在复杂情况下没有任何实际的意义。结果甚至可以随着i值的不同而变化,不具有说明意义。

#21


对不起  楼上的星级用户 
没有学那么深  学c语言还没一个月  呵呵 

佩服您了  但是 我只讨论C语言的二进制存储   不见得 二进制存储都指的是结构化存储吧 呵呵 

我只想问一句  可以存储整形的实际值不?

菜鸟入门 让您见笑了  呵呵 

#22


TLV的意思就是:Type类型, Lenght长度,Value值;
Type和Length的长度固定,一般那是2、4个字节;
Value的长度有Length指定;
解析方法:
      1.读取type 转换为ntohl、ntohs转换为主机字节序得到类型;指针偏移+2或4
      2.读取lenght,转换为ntohl、ntohs转换为主机字节序得到长度;指针偏移+2或4
      3.根据得到的长度读取value,指针偏移+Length;
      。。。。
      继续处理后面的tlv;
--------------------------------------------------------
抽象语法标记(Abstract Syntax Notation One)是描述抽象类型和值的标记,缩写为ASN.1。

    在ASN.1中,一个类型就是值的一个集合。有些类型有有限个值,有些则有无限多个。一个给定的ASN.1类型的值是该类型集合里的一个元素。ASN.1有四种类型:简单类型,它相当于原子,没有下层组件;结构类型,有组成部分;标签类型,由其它类型生成;其它类型,包括CHOICE和ANY类型。可以使用ASN.1的分配符(::=)给类型和值指定名字,这些名字可以用于定义其它类型或值。
---------------------------------------------------------
XDR(eXternal Data Representation) 提供一种方法把数据从一种格式转换成另一种标准数据格式表示法,确保在不同的电脑,操作系统及电脑语言中,所有数据代表的意义都是相同的。

#23


18 楼说的和我说的根本不时一回事情哦:)数和其格式化后的字符串根本不是同一个东西,因此你比较它们俩没有意义的:)

#24


不好意思 理解错误  呵呵 
楼上大侠见笑了   

#25


TLV XDR ASN.1
.............. 20楼的做网络的? 这是什么地方学的啊。。

老师没教这个。。。。



受教受教。。。。。。。。。

#26


5m的txt文件,如果不用压缩算法,没法变小存下。而且上面很多人已经说了,5M其实不算大。
二进制文件和文本文件是不同的文件类型,一个是用来表示二进制数据的,比如视频,程序文件。一个是用来表示文本的,
你的本来就是文本文件,转存成二进制还需要做转换,又不能节省空间,没什么必要吧?

#27


还是找个数据库用吧,连字典的搜索算法都不用写了。

#28


说压缩算法就想起 DNS Message 中用的压缩算法。。如果有大量重复的词条,可以借鉴。

#29


学习,留名

#30


没有一个前提条件,没有可比性

#31


这个问题真够基础的。。

#32


lz抛砖引玉啊 学习 

#33


1.存储字符时,二进制和文本占用的空间应该是一样的.
在存储数据时,二进制占用存储空间小,比如double型数据,按照IEEE754占8个字节,若用文本模式,同等精度,占用字节数会增加.

2.文本文件一般以流的模式存储,地址的概念不明确,由于其可读性强(易于修改),也不适用于用地址来标明位置,在存储方面不易于利于设计良好的数据结构.
二进制文件,地址概念非常明确,在良好的数据结构的基础上较文本文件不但可以节省空间,还更适合于应用数据结构的思想来进行查询操作等.数据库便是一个最好的例子.

对于字典来说,第一方面不容易体现,第二方面需要一个良好的设计为基础.
总体来说,良好的二进制文件较文本文件更容易存储更多的数据.

#34


同意LS

#35


不知道LZ怎么定义的文件存储格式,可以用压缩工具试一下,看看有没有效果

#36


oo

#37


暈。

#38


晕,5M还想压缩
这种工作没意义啊

#39


建议用MDB数据库,
如果文本文件用在网络上,找一个你使用对应程序的ZIP压缩算法,网上很多。

#40


在32位机器上,int数据类型的长度是4个字节,那么要存储100001,100002,100003,100004,100005,100006这6个数,当使用二进制时只要用4*6=24个字节就够了,但是用文本方式(用记事本打开可读的),则每个数要占6个字节,并且,要想人们看上到舒服一点的话,还可以排一下格式,比如用逗号分格,或者每个数占一行.当然了,如果是存1,2,3,4,5,6这6个数,那么文本方式每个数只要一个字节就够了.
    怎么越说越乱呀.....看看18楼的程序的结果就知道了.

#41


可以用gzip 压缩一下,像stardict这种软件的词典就是用gzip压缩的纯文本做辞典。效果很明显,算法也简单。

#42


打文字转换成十进制再存取会不会占空间少点?

#43


学习下~~

#44


学习了~

#1


二进制文件和文本文件只是打开文件的方式而已,跟保存到磁盘里的文件没关系。
磁盘里的文件都是二进制格式的。

#2


那二进制文件比文本文件到底有什么好处啊?

#3


同意楼上的,如果LZ要节省空间的话,可以试着用哈夫曼等算法压缩一下~~~

#4


肯定节省空间 
虽然磁盘里的文件都是二进制格式的
但是 要知道 数字格式以二进制保存的话 只需要保存实际值
文本格式却要无论如何占用一个字节当然 是unicode更麻烦

二进制文件的好处 自然是可以无差别对待输入数据流

#5


当然 对楼主的用途 用二进制 没有多少改观的 还是用个简单的压缩算法 压缩一下吧

text文件 压缩效果和明显的

#6


多谢楼上各位的解答。采用压缩算法的话,我怕解压也耗时间,就会慢了。我的文本文件是有很多行的词条构成的,除了哈夫曼压缩,还有别的压缩算法吗?哪种压缩方法相对来说压缩大小和解压时间比较合适?

#7


因为再用这个词典的时候会进行查找操作

#8


5M大小根本算不上什么,用不着压缩,除非你的程序在特殊的电脑环境下运行。
储存为非文本文件,按照一定格式储存,你存取时会比较方便;如果用文本文件,在没有索引的情况下速度也比较慢。
还有一点,文本文件很容易被人看到内容,也容易被人修改。

#9


同意楼上的第一句话 
o(∩_∩)o

#10


恩,确实需要压缩的啊^_^

储存为非文本文件,按照一定格式储存,你存取时会比较方便;
-------------------------------------------------
自己设计格式?可是大小还是不能压缩啊

#11


重复数据多就用行程
要么用霍夫曼
或者字典法 

#12


你要的是内存空间大小还是硬盘空间大小?

#13


楼主所谓的二进制文件有很多种定义
1. 文件打开方式来说,有二进制打开方式和文本打开方式,其区别是文本方式会在读的时候把\n转换为\r\n,存储时做反向转换,而二进制方式则不作任何转换。

2. 存储方式:其实很多人说二进制文件是以为二进制文件是一种特殊的存储格式。而实际上这种所谓的特殊存储格式是不存在的。很多人以为电子开关有两种状态,因此文件存储都是以二进制方式存储的。其实这是一种把软件和硬件混淆起来的误解。当然电子文件最终都会转化为某种二值开关的状态,但是不能说文件是二进制的。实际上,从逻辑上讲,所有文件都以字节为单位存储,我们逻辑上应该把它当作一个字节数组,而不是某个二进制码流。

实际上,如果一定有一种和普通文本不一样的存储方式的话,我们应该说结构化存储。结构化存储文件用某种特殊的数据结构管理文件内的数据。例如:doc文件就是一种结构化存储文件,zip文件也是一种。每个结构化存储文件都需要用它特有的软件来打开,对应软件必须理解这种文件结构。例如:mspaint可以打开bmp文件,doc文件可以用winword打开。

一般而言,由于数据结构需要额外字节,这样的文件比普通文本文件要大。当然,由于使用了压缩算法,压缩会使得文件更小,但是如果没有压缩,应该更大才对。

结构化存储的好处是:1. 可以确保文件按照某种固定的逻辑存储 2. 读取速度快 3.支持逻辑上的插入(文件物理上不可插入)

至于楼主想压缩空间,首先对5M文件不值得,压缩解压缩是以时间换空间,而现在的潮流是以空间换时间,除非空间占有率太大,而5M显然不大。

#14


从某种意义上可以这么说

#15


如果是字典,还是去研究一下数据结构,以结构化存储方式存储,因为这可以对你的字典进行index/hash,加快查字典速度。这不过不是简单的事情,三言两语说不清,不太适合在这样的网站问哦:)

#16


受益了 


#17


4 楼说的很有趣,怎么保存实际的值?文件永远是以字节为单位的

#18


楼上的说的太有趣了  呵呵
文件以字节为单位就不能保存实际值了么?
建议楼主好好学学基本功吧 呵呵  
别误导了楼主呢 

事实胜于雄辩 来看看这段测试程序吧

#include <stdio.h>
#include <stdlib.h>

int   main() 

      FILE *fp;
      long i = 9999999;
      fp = fopen("bin.txt","wb");
      fwrite(&i,sizeof(i),1,fp);
      fclose(fp);
      fp = fopen("asc.txt","wt");
      fprintf(fp,"%d",i);
      fclose(fp);
      system("pause");
}




比较下 asc文件大小 和bin文件大小就知道了 呵呵 

#19


在提醒下楼上的 别吧 以字节为最小计量单位跟以字节为存储方式混淆了

当然 我昵称是 Super N-o.O-B 呵呵 

超级菜鸟  初学语言 错误之处  还望海涵

#20


strangefay 

要说常见的二进制(或曰:结构化)存储,看看所谓的TLV格式、XDR格式和ASN.1吧。你的代码在复杂情况下没有任何实际的意义。结果甚至可以随着i值的不同而变化,不具有说明意义。

#21


对不起  楼上的星级用户 
没有学那么深  学c语言还没一个月  呵呵 

佩服您了  但是 我只讨论C语言的二进制存储   不见得 二进制存储都指的是结构化存储吧 呵呵 

我只想问一句  可以存储整形的实际值不?

菜鸟入门 让您见笑了  呵呵 

#22


TLV的意思就是:Type类型, Lenght长度,Value值;
Type和Length的长度固定,一般那是2、4个字节;
Value的长度有Length指定;
解析方法:
      1.读取type 转换为ntohl、ntohs转换为主机字节序得到类型;指针偏移+2或4
      2.读取lenght,转换为ntohl、ntohs转换为主机字节序得到长度;指针偏移+2或4
      3.根据得到的长度读取value,指针偏移+Length;
      。。。。
      继续处理后面的tlv;
--------------------------------------------------------
抽象语法标记(Abstract Syntax Notation One)是描述抽象类型和值的标记,缩写为ASN.1。

    在ASN.1中,一个类型就是值的一个集合。有些类型有有限个值,有些则有无限多个。一个给定的ASN.1类型的值是该类型集合里的一个元素。ASN.1有四种类型:简单类型,它相当于原子,没有下层组件;结构类型,有组成部分;标签类型,由其它类型生成;其它类型,包括CHOICE和ANY类型。可以使用ASN.1的分配符(::=)给类型和值指定名字,这些名字可以用于定义其它类型或值。
---------------------------------------------------------
XDR(eXternal Data Representation) 提供一种方法把数据从一种格式转换成另一种标准数据格式表示法,确保在不同的电脑,操作系统及电脑语言中,所有数据代表的意义都是相同的。

#23


18 楼说的和我说的根本不时一回事情哦:)数和其格式化后的字符串根本不是同一个东西,因此你比较它们俩没有意义的:)

#24


不好意思 理解错误  呵呵 
楼上大侠见笑了   

#25


TLV XDR ASN.1
.............. 20楼的做网络的? 这是什么地方学的啊。。

老师没教这个。。。。



受教受教。。。。。。。。。

#26


5m的txt文件,如果不用压缩算法,没法变小存下。而且上面很多人已经说了,5M其实不算大。
二进制文件和文本文件是不同的文件类型,一个是用来表示二进制数据的,比如视频,程序文件。一个是用来表示文本的,
你的本来就是文本文件,转存成二进制还需要做转换,又不能节省空间,没什么必要吧?

#27


还是找个数据库用吧,连字典的搜索算法都不用写了。

#28


说压缩算法就想起 DNS Message 中用的压缩算法。。如果有大量重复的词条,可以借鉴。

#29


学习,留名

#30


没有一个前提条件,没有可比性

#31


这个问题真够基础的。。

#32


lz抛砖引玉啊 学习 

#33


1.存储字符时,二进制和文本占用的空间应该是一样的.
在存储数据时,二进制占用存储空间小,比如double型数据,按照IEEE754占8个字节,若用文本模式,同等精度,占用字节数会增加.

2.文本文件一般以流的模式存储,地址的概念不明确,由于其可读性强(易于修改),也不适用于用地址来标明位置,在存储方面不易于利于设计良好的数据结构.
二进制文件,地址概念非常明确,在良好的数据结构的基础上较文本文件不但可以节省空间,还更适合于应用数据结构的思想来进行查询操作等.数据库便是一个最好的例子.

对于字典来说,第一方面不容易体现,第二方面需要一个良好的设计为基础.
总体来说,良好的二进制文件较文本文件更容易存储更多的数据.

#34


同意LS

#35


不知道LZ怎么定义的文件存储格式,可以用压缩工具试一下,看看有没有效果

#36


oo

#37


暈。

#38


晕,5M还想压缩
这种工作没意义啊

#39


建议用MDB数据库,
如果文本文件用在网络上,找一个你使用对应程序的ZIP压缩算法,网上很多。

#40


在32位机器上,int数据类型的长度是4个字节,那么要存储100001,100002,100003,100004,100005,100006这6个数,当使用二进制时只要用4*6=24个字节就够了,但是用文本方式(用记事本打开可读的),则每个数要占6个字节,并且,要想人们看上到舒服一点的话,还可以排一下格式,比如用逗号分格,或者每个数占一行.当然了,如果是存1,2,3,4,5,6这6个数,那么文本方式每个数只要一个字节就够了.
    怎么越说越乱呀.....看看18楼的程序的结果就知道了.

#41


可以用gzip 压缩一下,像stardict这种软件的词典就是用gzip压缩的纯文本做辞典。效果很明显,算法也简单。

#42


打文字转换成十进制再存取会不会占空间少点?

#43


学习下~~

#44


学习了~