c++ - 写入二进制文件后,用各种程序打开后,为什么结果不尽如人意?

标签 c++ notepad++ binaryfiles openoffice.org notepad

基本上我正在尝试写入一个二进制文件,以便在使用文本编辑器打开它时它会显示所有 ASCII 字符。我注意到这适用于记事本,但不适用于 Notepad++ 或开放式办公室,并给出奇怪的结果。为什么?

#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 .当我用记事本打开它时,我得到了这个

   !   "   #   $   %   &   '   (   )   *   +   ,   -   .   /   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++ 打开它时,我得到了这个 screen shot of notepad++

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

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

出于好奇,任何人都可以解释为什么 OpenOffice 作者提出 #和空格?

最佳答案

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。因此,对于您写入的每个值,您都会得到三个空值,然后是您想要的 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   {   |   }   ~   

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

关于c++ - 写入二进制文件后,用各种程序打开后,为什么结果不尽如人意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17821883/

相关文章:

c++ - 在 MPI-IO 上交织来自不同处理器的二进制数据

c++ - 大小为 5 的 vector <std::array<float,10>> 是否会产生 50 个连续的 float ?

c++ - DirectShow:转储流

replace - 在 Notepad++ 中指定多个目录在文件中查找

java - 使用 BufferedReader 写入文本文件

c - 从二进制文件中读取简单结构并在c中将特定数据显示在屏幕上

c++ - 在 C++ 中使用 Boost-Python 访问 Python 中定义的函数数组

c++ - 使用 omp 生成矩阵会导致麻烦,不同的 columsizes

regex - 在数字前后添加字符的正则表达式

python - 如何从 notepad++ 中运行 python 脚本?