我正在使用fprintf以便将值打印到文件中。这是一个简化的代码片段。在这里,我希望文件包含单个值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;
}


该文件如下所示(在十六进制编辑器中查看):
c - fprintf打印两个值而不是一个-LMLPHP

它包含值0x0D和0x0A,但我希望只有0x0A。
hex中的值设置为0x0A而不是10会得到相同的结果。

作为参考,以下是将hex中的值分别设置为11和12的结果:
c - fprintf打印两个值而不是一个-LMLPHP
c - fprintf打印两个值而不是一个-LMLPHP

正确的。

这到底是怎么回事? 0x0D来自哪里?

最佳答案

抱歉,您未指定要使用的操作系统/编译器,但我想它是Windows(或不是unix / linux),因为它在printf(3)输出上转换为\n char(0x0a)序列进入CRLF seq \r\n0x0d 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.

关于c - fprintf打印两个值而不是一个,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49587817/

10-11 16:43