写入二进制文件并用各种程序打开后,为什么结果不符合预期?

Cel*_*tas 2 c++ notepad openoffice.org binaryfiles notepad++

基本上我正在尝试写入二进制文件,以便在使用文本编辑器打开它时将显示所有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;
}
Run Code Online (Sandbox Code Playgroud)

所以我希望用文本编辑器打开文件时大致重现这个ASCII图表.当我用记事本打开它时,我得到了这个

   !   "   #   $   %   &   '   (   )   *   +   ,   -   .   /   0 
Run Code Online (Sandbox Code Playgroud)

1 2 3 4 5 6 7 8 9 :; <=>?@ ABCDEFGHIJKLMNOPQRSTU VWXYZ [\] ^ _` abcdefghijklmnopqrstu vwxyz {| }〜

当我用记事本++打开它时,我得到了这个 屏幕截图的记事本++

当我用OpenOffice.org Writer打开它时,我选择默认选项打开"西欧(Windows 1252/WinLatin 1)"并获得一堆###.这与字节顺序标记有关吗?

我尝试修改程序以使用,file.write (reinterpret_cast<const char *>(&num), sizeof(char));因为int正在将类型转换为a char但程序崩溃.

出于好奇,任何人都得到了解释为什么OpenOffice作家提出#和空间?

Moo*_*uck 5

for(int num = 0; num < 128; num++)
    file.write (reinterpret_cast<const char *>(&num), sizeof(num));
Run Code Online (Sandbox Code Playgroud)

在这些行中,您num将以二进制形式写入数字,为4字节整数.(sizeof(num)其中num是一个int).由于您编写的所有值都小于128,因此前三个字节num始终为0x000000.因此,对于您编写的每个值,您将得到三个空值,然后是您想要的ASCII字符.

Microsoft Notepad绝对是愚蠢的,当它到达不可打印的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   {   |   }   ~   
Run Code Online (Sandbox Code Playgroud)

Notepad ++更加智能,而不是将所有奇怪的东西转换为空格,而是显示它们的名称或编号.Notepad ++似乎也被字符13(回车)本身搞糊涂了,因为13通常也是新行的一部分.它(合理地)决定使这一新线路.Notepad ++对这个文件的处理可以说是更正确的.这可以通过查看前八个字符来验证:" NUL NUL NUL NUL - SOH NUL NUL NUL"首先是零,然后是"SOH"字符.如果我们查看您的ASCII图表,它会说第一个ASCII字符是"SOH - 标题开始".