Почему fwrite (со структурой) пишет неизвестные символы? - PullRequest
0 голосов
/ 05 декабря 2018

Я хочу записать структуру в текстовый файл с помощью функции fwrite.Когда я запускаю свою программу, я вижу много неопределенных символов в текстовом файле.Почему это происходит и как я могу это исправить?Мой код:

FILE *file = NULL;

file = fopen(TASK1_2_FILENAME, "wb");

if (!file) {
    printf("FATAL: File does not exist, exiting.");
    exit(EXIT_FAILURE);
}

Products product;
strcpy(product.date, "00:00:0000");
product.code = 12345;
product.quantity = 10;
product.price = 10.5;

fwrite(&product, sizeof(Products), 1, file);

fclose(file);

И структура в файле заголовков:

typedef struct Product {
    char date[11];
    int code;
    int quantity;
    float price;
} Products;

Результат:

enter image description here

1 Ответ

0 голосов
/ 05 декабря 2018

Вы не можете записывать двоичные данные и ожидать, что они будут текстовыми.Поведение, которое вы видите, нормальное, ожидаемое и правильное.

В качестве примера представим число 30000.Это легко поместится в двухбайтовом short int.Однако в текстовом формате у вас есть как минимум пять байтов.Если вы fwrite() два байта для внешнего хранилища, это будут два байта, содержащие числовое значение этих байтов, а не текстовое представление каждой цифры.

В примере 30000 двоичное представление равно 01110101 00110000.В машинах Intel это полностью изменено, потому что они little-endian .Это означает, что эти два байта в вашем файле, вероятно, являются десятичными 48 и 118. Если вы просматриваете их как символы на ПК, который изначально использовал ASCII, они должны отображаться как 0 и v, соответственно.

...