以下代码行将unsigned int值写入文件,但文件内容不可读.
struct rabin_polynomial
{
uint64_t start;
uint16_t length;
struct rabin_polynomial *next_polynomial;
};
fprintf(out_file, "%llu,%u",poly->start,poly->length);
Run Code Online (Sandbox Code Playgroud)
如果我将代码的输出显示在命令行屏幕上,则它是可读的.
文件"out_file"未以二进制模式打开.
这里是输出文件的部分内容:
-ÍÍÍÍÍÍp\y";^æó r\ ÍÍÍÍ- ÍÍÍÍÍÍ
Øâˆ¿»Iðr\ ÍÍÍÍ- wÍÍÍÍÍÍ7OT-OØÚ‚\ ÍÍÍͤ* L ÍÍÍÍÍÍî›ùçÉç`‚\ ÍÍÍÍð3 ÍÍÍÍÍÍ
Øâˆ¿»I°‚\ ÍÍÍÍðC ÍÍÍÍÍÍíK¬è‹Ç{ ƒ\ ÍÍÍÍðS • ÍÍÍÍÍÍ-Ló3lJ–ÞPƒ\ ÍÍÍÍ…]
Run Code Online (Sandbox Code Playgroud)
这是预期的输出:
0,2861
2861,4096
6957,3959
10916,2380
13296,4096
17392,4096
Run Code Online (Sandbox Code Playgroud)
如果你没有得到你期望的文本值,那可能是因为你使用了不正确的格式说明符(我假设你已经填充了你想在这里打印的变量,尽管你可能想要确认这一点).
%llu是明确的,unsigned long long int其宽度不一定与uint64_t.
在C99中,inttypes.h格式说明符的宏用于精确宽度,而-at-least-as-wide-as数据类型.
例如:
uint64_t xyzzy = 42;
printf ("Number is: %" PRIu64 "\n", xyzzy);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,PRIu64表示printf64位精确宽度变量的格式说明符,无符号十进制输出.对于不同的输出类型,还有各种各样的其他类型,以及scanf家庭的等价物(从一开始SCN).
7.8.1 Macros for format specifiersC99 部分详细列出了它们.
根据您的更新,您没有得到错误的数字,而是得到的东西只能被描述为垃圾,我会说你的问题在其他地方.即使有损坏的指针或数据,我也不希望fprintf为数字格式字符串生成非数字数据.这肯定是可能的,因为它是未定义的行为,但不太可能.
你可以得到那种输出的字符串,但这里并非如此.
换句话说,我认为你必须在代码的其他地方寻找(例如)内存损坏问题.
你可以做的一件事就是测试问题是否在你认为的那条线上,将其改为:
printf("DEBUG: %llu,%u\n",poly->start,poly->length);
fprintf(out_file, "%llu,%u",poly->start,poly->length);
Run Code Online (Sandbox Code Playgroud)
看看终端上出现了什么.