基本上,我试图写一个二进制文件,以便在使用文本编辑器打开该文件时将显示所有ASCII字符。我注意到此功能适用于记事本,但不适用于记事本++或开放式办公室,并且给出奇怪的结果。为什么?
#include <fstream>
using namespace std;
int main () {
ofstream file ("file.bin", ios::binary);
for(int num = 0; num < 128; num++)
file.write (reinterpret_cast<const char *>(&num), sizeof(num));
file.close ();
return 0;
}
因此,我希望使用文本编辑器打开该文件时,可以大致再现this ASCII chart。当我用记事本打开它时,我得到了
当我用记事本++打开它时
当我使用OpenOffice.org Writer打开它时,我选择了默认选项以“西欧(Windows 1252 / WinLatin 1)”打开,并获得了许多
###
。这与字节顺序标记有关吗?我尝试将程序修改为使用
file.write (reinterpret_cast<const char *>(&num), sizeof(char));
,因为int
被类型转换为char
,但是程序崩溃。出于好奇,任何人都解释了为什么OpenOffice writer提供
#
和空格? 最佳答案
for(int num = 0; num < 128; num++)
file.write (reinterpret_cast<const char *>(&num), sizeof(num));
在这些行中,您将二进制形式的
num
写为4字节整数。 (sizeof(num)
,其中num
是int
)。由于您写入的所有值均小于128,因此num
的前三个字节始终为0x000000
。因此,对于您写入的每个值,您将获得三个null,然后获得您想要的ASCII字符。Microsoft记事本绝对是愚蠢的,当它到达不可打印的ASCII字符(例如NULL)时,它仅显示一个空格。注意您的ASCII值之间如何有“空格”。另外,我敢打赌,它看起来更像这样,在这里我用下划线替换了一些空格。请注意,第10个值(新行)会引起新行。
_________
__ ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~
Notepad ++更加智能,它不会将所有奇怪的东西转换为空格,而是显示它们的名称或数字。 Notepad ++本身似乎也与字符13(回车符)相混淆,因为13通常也是换行符的一部分。它(合理地)决定也改行。 Notepad ++对这个文件的处理可以说是更正确的。这可以通过查看前八个字符来验证:“
NUL NUL NUL NUL - SOH NUL NUL NUL
”首先是零,然后是“SOH”字符。如果我们查看您的ASCII图表,它会说第一个ASCII字符是“SOH-Heading of Heading”。关于c++ - 写入二进制文件并使用各种程序打开它后,为什么结果不符合预期?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17821883/