当前位置:  开发笔记 > 编程语言 > 正文

以二进制和文本模式写入的文件之间的差异

如何解决《以二进制和文本模式写入的文件之间的差异》经验,为你挑选了3个好方法。

写入以文本模式打开但在二进制模式下不会发生的文件时会发生什么转换?特别是在MS Visual C.

unsigned char buffer[256];
for (int i = 0; i < 256; i++) buffer[i]=i;
int size  = 1;
int count = 256;

二进制模式:

FILE *fp_binary = fopen(filename, "wb");
fwrite(buffer, size, count, fp_binary);

与文字模式:

FILE *fp_text = fopen(filename, "wt");
fwrite(buffer, size, count, fp_text);

Jon Trauntve.. 49

我相信大多数平台在处理流时都会忽略"t"选项或"text-mode"选项.然而,在Windows上,情况并非如此.如果您在MSDN上查看fopen()函数的描述,您将看到指定"t"选项将产生以下效果:

换行符('\n')将在输出中转换为'\ r \n"序列

回车/换行序列将在输入时转换为换行符.

如果在追加模式下打开文件,将检查文件的末尾是否有ctrl-z字符(字符26)并删除该字符(如果可能).它还会将该字符的存在解释为文件的结尾.从CPM时代开始,这是一个令人遗憾的延续(关于他们的孩子一直到第3代或第4代的父母的罪行).与先前声明的观点相反,不会追加ctrl-z字符.

回车实际上是'\ r','\n'是换行符. (12认同)


MrZebra.. 28

在文本模式下,换行符"\n"可以转换为回车+换行符"\ r \n"

通常你想要以二进制模式打开.尝试在文本模式下读取任何二进制数据将无法正常工作,它将被破坏.您可以在二进制模式下读取文本正常 - 它不会自动将"\n"翻译为"\ r \n".

见fopen



1> Jon Trauntve..:

我相信大多数平台在处理流时都会忽略"t"选项或"text-mode"选项.然而,在Windows上,情况并非如此.如果您在MSDN上查看fopen()函数的描述,您将看到指定"t"选项将产生以下效果:

换行符('\n')将在输出中转换为'\ r \n"序列

回车/换行序列将在输入时转换为换行符.

如果在追加模式下打开文件,将检查文件的末尾是否有ctrl-z字符(字符26)并删除该字符(如果可能).它还会将该字符的存在解释为文件的结尾.从CPM时代开始,这是一个令人遗憾的延续(关于他们的孩子一直到第3代或第4代的父母的罪行).与先前声明的观点相反,不会追加ctrl-z字符.


回车实际上是'\ r','\n'是换行符.

2> MrZebra..:

在文本模式下,换行符"\n"可以转换为回车+换行符"\ r \n"

通常你想要以二进制模式打开.尝试在文本模式下读取任何二进制数据将无法正常工作,它将被破坏.您可以在二进制模式下读取文本正常 - 它不会自动将"\n"翻译为"\ r \n".

见fopen


对于阅读,翻译的工作方式与您描述的相反 - 将"\ r \n"转换为"\n".
它仅限Windows?

3> SmacL..:

此外,当您使用"rt"打开文件时,输入将在Crtl-Z字符上终止.


是的 - 我使用"my-file-type ^ Z"之类的东西开始自己的文件格式,然后如果你从命令行"键入"/"cat"它,它只是给你文件的"魔术数字"并停止而不是向您的终端喷出二进制文件.
推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有