基本上,我试图写一个二进制文件,以便在使用文本编辑器打开该文件时将显示所有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),其中numint)。由于您写入的所有值均小于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/

10-11 21:24