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

时间:2012-01-02 08:36:34

标签: 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);

如果我将代码的输出显示在命令行屏幕上,则它是可读的。

文件“out_file”未以二进制模式打开。

这是输出文件的部分内容:

 -ÍÍÍÍÍÍp\y";^æó r\ ÍÍÍÍ-       ÍÍÍÍÍÍ
Ø∿»Iðr\ ÍÍÍÍ-      wÍÍÍÍÍÍ7OT-OØÚ‚\ ÍÍÍͤ*      L ÍÍÍÍÍÍî›ùçÉç`‚\ ÍÍÍÍð3       ÍÍÍÍÍÍ
Ø∿»I°‚\ ÍÍÍÍðC       ÍÍÍÍÍÍíK¬è‹Ç{ ƒ\ ÍÍÍÍðS      •   ÍÍÍÍÍÍ-Ló3lJ–ÞPƒ\ ÍÍÍÍ…] 

这是预期的输出:

0,2861 
2861,4096 
6957,3959 
10916,2380 
13296,4096 
17392,4096 

3 个答案:

答案 0 :(得分:5)

如果你没有得到你期望的文本值,那么可能归结为你使用了错误的格式说明符(我假设你已经填充您尝试在此处打印的变量,但您可能需要确认这一点。

%llu明确用于unsigned long long int,其宽度不一定与uint64_t相同。

在C99中,inttypes.h具有用于格式说明符的宏,用于精确宽度和-at-least-wide-wide-as数据类型。

例如:

uint64_t xyzzy = 42;
printf ("Number is: %" PRIu64 "\n", xyzzy);

在这种情况下,对于64位精确宽度变量,PRIu64表示printf格式说明符,无符号十进制输出。对于不同的输出类型,还有很多其他类型,以及scanf系列的等价物(从SCN开始)。

C99的7.8.1 Macros for format specifiers部分详细列出了它们。


根据您的更新,您没有得到错误的数字,而是得到的东西只能被描述为垃圾,我会说您的问题在于其他地方。即使有损坏的指针或数据,我也不希望fprintf为数字格式字符串生成非数字数据。它肯定是可能的,因为它是未定义的行为,但非常不可能。

可以获得字符串的那种输出,但这不是这种情况。

换句话说,我认为你必须在代码的其他地方寻找(例如)内存损坏问题。

你可以做的一件事就是测试问题是否在你认为的行中,将其改为:

printf("DEBUG: %llu,%u\n",poly->start,poly->length);
fprintf(out_file, "%llu,%u",poly->start,poly->length);

看看终端上发生了什么。

答案 1 :(得分:1)

您可能需要分享您的代码的读写部分,以便我们为您提供帮助。但是查看写入out文件的内容,看起来像fprintf()fscanf()中的格式说明符一样。

以下程序可能会为您提供参考。

#include <stdio.h>
#include <stdlib.h>

#define LEN 6

int main(void)
{
    unsigned long long start[LEN] = {0, 2861, 6957, 10916, 13296, 17392};
    unsigned short int length[LEN] = {2861, 4096, 3959, 2380, 4096, 4096};
    int i;
    unsigned long long s;
    unsigned short int l;
    FILE *out_file, *in_file;

    if ((out_file = fopen("out_file", "w")) == NULL) {
        printf("ERROR: unable to open out_file\n");
        return -1;
    }

    for (i=0; i<LEN; i++)
        fprintf(out_file, "%llu,%hu \n",start[i], length[i]);

    fclose(out_file);


    if ((in_file = fopen("out_file", "r")) == NULL) {
        printf("ERROR: unable to open out_file\n");
        return -1;
    }

    for (i=0; i<LEN; i++) {
        fscanf(out_file, "%llu,%hu \n", &s, &l);
        printf("start = %llu - length = %hu \n", s, l);
    }

    fclose(in_file);

    return 0;
}

请注意,formatfscanf()中的fprintf()(第二个参数)必须分别与readingwriting行匹配。

答案 2 :(得分:0)

请使用十六进制编辑器检查文件内容,并与多边形结构的实际值进行比较。

你会看到什么是问题。