我正在使用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会得到相同的结果。作为参考,以下是将
hex
中的值分别设置为11和12的结果:正确的。
这到底是怎么回事? 0x0D来自哪里?
最佳答案
抱歉,您未指定要使用的操作系统/编译器,但我想它是Windows(或不是unix / linux),因为它在printf(3)
输出上转换为\n
char(0x0a
)序列进入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.
关于c - fprintf打印两个值而不是一个,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49587817/