为什么输出文件损坏/充满垃圾?(期待数字)

Joh*_*ohn 1 c io printf

以下代码行将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)

pax*_*blo 5

如果你没有得到你期望的文本值,那可能是因为你使用了不正确的格式说明符(我假设你已经填充了你想在这里打印的变量,尽管你可能想要确认这一点).

%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)

看看终端上出现了什么.