文本文件和2进制文件,有什么区别?
这个事情源于上周一个同事突然问了个问题:把“125ABS!!”按照文本和2进制分别存到两个文件中去1.txt,2.txt,那么这两个文件的大小一样吗?他们里的内容是一样的吗?
我当时只知道文本和2进制在处理回车的时候,采用不同的策略,其他的有什么区别还真不知道,请教了?
其实,也是我一直以来比较困惑的一个问题,我就是弄不清楚,
1. 文本文件,就是后最名为txt,在打开的时候为什么可以选择方式是文本还是2进制?按照文本和2进制打开读出的内容不一样吗?困惑!!!!
2. 同一个内容比如:213,按照不同的模式写入的文件,可不可以起同一个后最名,比如213,按照文本写入1.bin,按照2进制写入2.bin,这两个文件使用ultraedit打开会一样吗?那么后罪名和文件存入模式有什么关系?
3. 文件的相关处理函数,如fputc,fread等,没有限制只能在文本或者2进制使用,那么他门应用到不同模式打开或者写入的文件时候,会有不同吗?
请教了!!!!
[解决办法]
本质上所有的文件都是二进制文件,只不过习惯上我们把那些仅包含可显示字符的文件“称为”文本文件而已。(当然,“可显示”也跟采用的编码方式有关,比如以ASICC编码解析UNICODE文件也同样会是一团糟的乱码,但那又是另外一个话题了。)
然后,楼主了有点混淆编码方式跟打开(保存)方式这两个概念的区别。你可以用二进制方式打开文本文件,观察其中的字符编码,比如跳格,回车的编码都能看出来;你也可以用文本方式(比如用记事本)打开二进制文件,效果当然很可能是一堆乱码,有时甚至还伴随着杨声器的尖叫。
至于那些读写文件的API,如果以文本方式打开文件时,对于回车的不同处理,那个基本上是DOS/WINDOWS系统中搞出来的东西。UNIX/LINUX中原本没有这些事情的。
[解决办法]
lz的理解是对的
文本和二进制方式就是在回车上的处理有点不一样
提醒一下楼主在分析这个问题的时候不要被文本编辑器蒙蔽了一些数据,也就是说文本编辑器会处理掉一些回车换行的符号(表现成换了一行来显示的效果,而它们的具体值你看不到),你既然用ultraedit的话就使用一下它的二进制方式查看吧。
另外,回alps_008() ,不是“二进制回车要\r\n,文本只需要\n”,这个问题是要区分操作系统对待的。对于Windows环境,Notepad会认为连续的\r\n才表现出换到另外一行。而linux的文本编辑器一般认为\n就已经是可以表现成换一行显示了。而Windows的API做得很职能(你也可以说它有BUG),如果打开方式是文本方式的话,那么API自动将\n转换成\r\n(如果你写了\r\n会怎么样呢?没错就是变成了\r\r\n),以便它的Notepad可以正确处理文本的换行。
二进制方式是什么意思呢?一句话说白了就是忠实的将你想要写入文件的内容一个字节不多不少的写入文件。
后缀名是什么?对文件本身而言什么都不是!你改个文本文件的名字叫xxx.exe,你用Notepad的打开功能,选中它打开,照样显示。文件内容该是什么就是什么,和后缀无关。
后缀名的作用不在于对文件本身怎么的而在于管理文件的工具可以恰当的对他们进行分类而已。
[解决办法]
同意LS的观点
二进制回车要\r\n,文本只需要\n”,这个问题是要区分操作系统对待的。对于Windows环境,Notepad会认为连续的\r\n才表现出换到另外一行。而linux的文本编辑器一般认为\n就已经是可以表现成换一行显示了。而Windows的API做得很职能(你也可以说它有BUG),如果打开方式是文本方式的话,那么API自动将\n转换成\r\n(如果你写了\r\n会怎么样呢?没错就是变成了\r\r\n),以便它的Notepad可以正确处理文本的换行。
二进制方式是什么意思呢?一句话说白了就是忠实的将你想要写入文件的内容一个字节不多不少的写入文件。
后缀名是什么?对文件本身而言什么都不是!你改个文本文件的名字叫xxx.exe,你用Notepad的打开功能,选中它打开,照样显示。文件内容该是什么就是什么,和后缀无关。
后缀名的作用不在于对文件本身怎么的而在于管理文件的工具可以恰当的对他们进行分类而已。
另外,如果你的内容是二进制的,比如在结构体里,写入时不指明二进制fopen( "ad ", "w ")和fopen( "ad ", "wb "),没什么区别,当然读的时候也要按写的模式读fopen( "ad ", "r ")和fopen( "ad ", "rb ")
后缀名只是个标志而已,和文件内容没有一点关系,只不过windows以文件后缀名做了文件关联!!
[解决办法]
125ABS!!”按照文本和2进制分别存到两个文件中去1.txt,2.txt,那么这两个文件的大小一样吗?他们里的内容是一样的吗?
////////////////////////////////
他们应该是一样的吧
但是如果你把下面数据用二进制和文本方式读出来就不一样了
///////
hello !
how are you!
/////
文本方式只读取可见字符
二进制方式则把空格和回车都读出来了
可以这么理解,文本方式读取就是 用二进制方式读取一个字符,判断是否为可见字符,再读取下一个
这就是为什么不建议使用fscanf,效率比fread低很多
读和写原理是一样的,不过写不容易看出差别,所以我用读来举例子,希望对你有帮助
[解决办法]
ascii
bit