当我以“wb”模式写一个文件时,会发生什么?

时间:2013-08-10 09:45:20

标签: c++ c

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

1 个答案:

答案 0 :(得分:1)

二进制模式意味着“不翻译任何东西”。

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

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

现在,以“二进制”模式编写文本可以正常工作,我怀疑你的问题是别的 - 没有代码,就不可能回答什么。提及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”,则会出现,而VIM和putc将其解释为ASCII。