Почему выходной файл поврежден / заполнен мусором? (Ожидая номера) - PullRequest
1 голос
/ 02 января 2012

Следующая строка кода записывает значения 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 ]

5 голосов
/ 02 января 2012

Если вы не получаете ожидаемые текстовые значения, это возможно из-за того, что вы используете неправильные спецификаторы формата (я предполагаю, что вы заполнили переменные, которые вы пытаетесь напечатать здесь, хотя вы можете это подтвердить).

%llu явно для unsigned long long int, который не обязательно равен ширине uint64_t.

В C99 inttypes.h содержит макросы для спецификаторов формата, которые будут использоваться для типов данных с точной шириной и по меньшей мере как ширина.

Например:

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

В этом случае PRIu64 означает спецификатор формата printf, десятичный вывод без знака, для 64-битной переменной точной ширины. Существует множество других типов для различных типов вывода, а также эквиваленты для семейства scanf (начиная с SCN).

Раздел 7.8.1 Macros for format specifiers из C99 перечисляет их подробно.


На основании вашего обновления, когда вы не получаете неправильные номера, а получаете то, что можно было бы назвать только мусором, я бы сказал, что ваши проблемы лежат в другом месте. Даже с поврежденными указателями или данными я бы не ожидал, что fprintf будет генерировать нечисловые данные для строк числового формата. Это, конечно, возможно , поскольку это неопределенное поведение, но очень маловероятно.

Вы могли бы получить такой вывод для строк, но здесь это не так.

Другими словами, я думаю, вы должны искать в другом месте своего кода (в качестве примера) проблемы повреждения памяти.

Единственное, что вы можете сделать, чтобы проверить, лежит ли проблема в той строке, которую, по вашему мнению, имеет место, - это изменить ее на:

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

и посмотрите, что выходит на терминал.

1 голос
/ 02 января 2012

Вам, возможно, придется поделиться своими частями кода для чтения и записи, чтобы мы могли вам помочь.Но если посмотреть на содержимое, записанное в выходной файл, то это похоже на проблему со спецификаторами формата в 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;
}

Обратите внимание, что format (2-й аргумент) в fscanf() и fprintf() должны совпадать, когда reading и writing строки соответственно.

0 голосов
/ 02 января 2012

Пожалуйста, проверьте содержимое файла в шестнадцатеричном редакторе и сравните с фактическими значениями структуры poly.

Вы увидите, в чем проблема.

...