奇怪的文本模式文件输出行为

时间:2014-05-01 12:26:10

标签: c++ c file-io printf newline

考虑以下代码

FILE * pOutFile;

unsigned char uid;

pOutFile = fopen("OutFile.bin","w") ;  // open a file to write

uid = 0x0A;

fprintf (pOutFile,"%c",uid);          // Trying to print 0x0A in to the file

但我在文件中输入的内容是

0x0D 0x0A

这个0x0D来自哪里?我错过了什么吗?我必须考虑什么来防止这种情况。

更正:uidl是一个错字。

3 个答案:

答案 0 :(得分:3)

Windows文本文件希望新行由两个连续的字符表示:0x0D和0x0A。

在C中,新行由单个char表示:0x0A。

因此,在Windows上,在C中,您有两种打开文件的方式:文本模式或二进制模式。

在二进制模式下,当您编写LineFeed(0x0A)字符时,会将单个字节(0x0A)附加到文件中。

在文本模式下,无论何时编写LineFeed(0x0A)字符,都会将两个字节(0x0D和0x0A)附加到文件中。

解决方案是使用"wb"以二进制模式打开文件。

答案 1 :(得分:0)

因为您已在“w”模式下打开文件,所以它处于TEXT模式,这意味着\ n(即0x0a)被转换为\ r \ n(回车和换行)。 如果您只想将0x0a写入文件,请以二进制模式(“wb”)打开它。

答案 2 :(得分:0)

实际上,这些都不是问题......

FILE * pOutFile;
unsigned char uid;
pOutFile = fopen("OutFile.bin","wb") ;  // open a file to write (in binary, <b>not</b> text mode)
uid = 0x0A; //changed from uidl = 0x0A (which didnt set uid)
fprintf (pOutFile, "%c", uid);          // Trying to print 0x0A in to the file

我改变了,是你设置了你打印的uidl和 NOT uid。

您可以随时执行以下操作:

fprintf(pOutFile, "%c", 0x0A); or
fprintf(pOutFile, "%c", '\n'); or
fprintf(pOutFile, "\n");

如果你想(最后一个选项可能是你最好的。

我还以wb模式打开了你的文件。