【问题标题】:Strange text-mode file output behavior奇怪的文本模式文件输出行为
【发布时间】:2014-06-17 22:16:42
【问题描述】:

考虑下面的代码

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

【问题讨论】:

  • 回车,换行。请参阅 ASCII 表。 theasciicode.com.ar/ascii-control-characters/…
  • "wb"模式打开文件。
  • 是的,我明白了,但是如何防止打印 0D。我只对单个字符感兴趣,那就是 0x0A。
  • @KerrekSB 谢谢。以“wb”模式打开文件可解决此问题。
  • 请推广Kerrek SB评论来回答。谢谢

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


【解决方案1】:

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

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

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

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

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

解决办法是用二进制模式打开文件,使用"wb"

【讨论】:

  • 您在其他系统中也有这两种模式。尽管在 unixoid 中,它们是相同的。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    其实这些都不是问题……

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

    【讨论】:

    • 谢谢,uidl 是一个错字。已更正
    猜你喜欢
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多