我使用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;
}
它包含值0x0D和0x0A,但我预计只有0x0A。
将hex
中的值设置为0x0A而不是10会产生相同的结果。
这是正确的。
这里到底发生了什么?这个0x0D来自哪里?
答案 0 :(得分:1)
抱歉,你没有指定你使用的操作系统/编译器,但我猜它是Windows(或不是unix / linux),因为它在printf(3)
输出转换{{ 1}} char(\n
)加入 CRLF seq 0x0a
(\r\n
)如果是这样,你不想要要完成的翻译,只需将修饰符0x0d 0x0a
添加到打开模式即可显示为b
,以便不进行翻译。
"wb"
如果您将程序移动到unix机器上,那么没有问题,因为这些修改器包含在POSIX中。
您的代码中存在错误,因为您使用fp = fopen("file.txt", "wb"); // Open (for writing in binary mode)
修饰符将无符号整数数组传递给printf,并且这是不正确的。 %s
格式序列允许您只传递指向空终止字符串的char的指针(您的指针很幸运,但是您的代码遇到了未定义的行为)有效应该是:
%s
或
char hex[] = { 10, 0 }; // decimal char literals.
或
char hex[] = "\012"; // octal char. No provision for decimal char literals.