【问题标题】:fprintf is printing two values instead of onefprintf 正在打印两个值而不是一个
【发布时间】:2018-09-10 06:51:15
【问题描述】:

我使用fprintf 将值打印到文件中。这是一个简化的代码sn-p。在这里,我希望文件包含单个值 0x0A。

int main() {
    FILE *fp;
    unsigned int hex[] = { 10 }; // Value to be written (10 = 0x0A)

    fp = fopen("file.txt", "w"); // Open
    fprintf(fp, "%s", hex); // Write
    fclose(fp); // Close

    return 0;
}

文件如下所示(在十六进制编辑器中查看):

它包含值 0x0D 和 0x0A,但我预计只有 0x0A。 将hex 中的值设置为 0x0A 而不是 10 会产生相同的结果。

作为参考,将hex中的值分别设置为11和12的结果如下:

哪些是正确的。

这里到底发生了什么?这个 0x0D 是从哪里来的?

【问题讨论】:

  • 啊...我没有注意到 10 是用于换行的 ascii。可能就是这样。
  • 你试过 %c 而不是 %s 吗?
  • 是的,%c 也给出了错误的输出。
  • 您所说的 user3121023 是问题所在。如果您将其写为答案,我会接受。
  • 为什么不喜欢这个fwrite(hex, sizeof(*hex), 1, fp)

标签: c file hex printf


【解决方案1】:

抱歉,您没有指定您使用的是哪个操作系统/编译器,但我猜它是 Windows(或不是 unix/linux),因为它在 printf(3) 上转换,输出一系列 \n 字符(@ 987654323@) 到 CRLF seq \r\n (0x0d 0x0a) 如果是这种情况并且您不希望完成翻译,只需将修饰符 b 添加到打开模式以显示因为"wb"所以翻译没有完成。

fp = fopen("file.txt", "wb"); // Open (for writing in binary mode)

如果您将程序移至 unix 机器,则没有问题,因为这些修饰符包含在 POSIX 中。

注意

您的代码中有一个错误,因为您使用 %s 修饰符将一个无符号整数数组传递给 printf,这是不正确的。 %s 格式序列只允许您传递一个指向 char 的指针,该指针指向一个空终止的字符串(您的指针是幸运的,但是您的代码遇到了未定义的行为)有效应该是:

char hex[] = { 10, 0 }; // decimal char literals.

char hex[] = "\012"; // octal char.  No provision for decimal char literals.

char hex[] = "\x0a"; // hex char literal.

【讨论】:

    猜你喜欢
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 2019-12-23
    • 2020-07-12
    • 1970-01-01
    相关资源
    最近更新 更多