Почему fwrite записывает 9 байтов для некоторых двойников? - PullRequest
1 голос
/ 27 марта 2019

Мне нужно написать код на C, который записывает удваивается в файл.

Для некоторых значений fwrite записывает правильный 8-байтовый двоичный файл в файл. Для других значений, кажется, предшествует дополнительный 9-й байт. Например, этот код записывает 9 байтов, содержащих x0d, за которыми следуют правильные 8 байтов:

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

#define PI 3.14159265358979323846

int main()
{
    // Generate a number
    double x = -3.0 * cos(PI * 5.0 / 8.0);
    printf("%.*e\n", DECIMAL_DIG, x);

    // Uncomment this to get an 8-byte file instead of 9
    // x = (float) x;

    // Write number to file
    FILE* fw = fopen("out.bin", "w");
    if (fw != NULL)
    {
        size_t Nw = fwrite(&x, sizeof(double), 1, fw);
        printf("Wrote %i values to file.\n", Nw);

        if (fclose(fw) != 0)
            return (EXIT_FAILURE);
    }
    else
        return (EXIT_FAILURE);

    return (EXIT_SUCCESS);
}

Однако, если я изменю значение, например на double x = -3.0 * cos(PI * 3.0 / 8.0);, или даже если я просто приведу число к float и обратно (см. «Раскомментируйте это ...» в вышеприведенном коде), тогда правильное значение 8 записано байтов.

Я компилирую с MinGW GCC-6.3.0-1. Что я делаю не так?

1 Ответ

4 голосов
/ 27 марта 2019

Вы открыли файл в текстовом режиме и записываете в него двоичные данные.Windows изменяет LF 0x0a на CR LF 0x0d 0x0a.Вам нужно использовать "wb" в качестве второго аргумента при открытии файла.

...