-5

当我以“wb”模式将“asklfj123”写入文件时,然后在vim中打开它,为什么我仍然可以看到asklfj?但我在vim中看不到123。我的意思是,当我以“wb”模式编写时,程序不会将其转换为ASCII码,但编辑器会以ASCII码打开它,那么在文本编辑器中应该是垃圾值,不是吗?那为什么我还能看到它们?

4

1 回答 1

1

二进制模式的意思是“不翻译任何东西”。

在“文本”模式(即“非二进制模式”)中,在某些系统上,例如换行符的表示在操作系统的文件表示和'\n'C 用于换行表示的标准之间是不同的。

在某些系统中,还有特殊字符来表示文件的结尾。在文本模式下,这些字符被翻译和理解为分别表示换行符和文件结尾。

现在,以“二进制”模式编写文本就可以了,我怀疑你的问题是别的——没有代码,就不可能回答什么。的提及vim也让我认为您正在使用 Linux 或其他基于 Unix 的系统,其中换行符确实与 相同'\n',因此在这些系统中没有进行任何翻译。

编辑:

给定代码,这是典型的“未定义行为”,因为:

char test[30] = "adadsf123";
...
fwrite(test, sizeof(double), 6, fp);

的参数fwrite是要写入的数据、每个成员的大小、项目数,最后是要写入的文件对象。

在这种情况下,输入一个 30 字节的字符串,然后 sizeof(double) 作为每个项目的大小,以及 6 个项目。由于sizeof(double)超过了 30,因此正在输出一些随机垃圾。随机垃圾是什么,取决于test变量之后存储在内存中的内容。在发布的代码中,这似乎是fp变量。很难确切地说fp' 的值是多少。但fwrite正在做它被告知的事情,将二进制数据写入二进制文件。ASCII 字符,在“二进制”中仍然会显示相同,“A”的二进制代码是 01000001,如果解释为 ASCII,则会显示为“A” - 而 VIMputc会将其解释为 ASCII。

于 2013-08-10T09:56:32.983 回答