繁体   English   中英

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

[英]Strange text-mode file output behavior

考虑以下代码

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是一个错字。

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

在C语言中,新行由单个字符表示:0x0A。

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

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

在文本模式下,每当编写LineFeed(0x0A)char时,两个字节(0x0D和0x0A)都会附加到文件中。

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

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

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

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模式打开了您的文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM