Подтвердить что ты не робот

Длина поплавка изменяется от 32 до 40 бит

Я столкнулся с нечетной проблемой при экспорте значений float в файл. Я ожидал бы, что каждый float будет иметь одинаковую длину (очевидно), но моя программа иногда экспортирует 32-битное число, а иногда и 40-битное число. Минимальным рабочим примером программы, которая все еще показывает это поведение, является:

#include <stdio.h>

const char* fileName = "C:/Users/Path/To/TestFile.txt";
float array [5];

int main(int argc, char* argv [])
{
    float temp1 = 1.63006e-33f;
    float temp2 = 1.55949e-32f;

    array[0] = temp1;
    array[1] = temp2;
    array[2] = temp1;
    array[3] = temp2;
    array[4] = temp2;

    FILE* outputFile;
    if (!fopen_s(&outputFile, fileName, "w")) 
    {
        fwrite(array, 5 * sizeof(float), 1, outputFile);
        fclose(outputFile);
    }

     return true;
}

Я ожидаю, что выходной файл будет содержать ровно 20 (5 раз 4) байтов, каждый из которых представляет собой float. Однако я получаю следующее:

 8b 6b 07 09      // this is indeed 1.63006e-33f 
 5b f2 a1 0d 0a   // I don't know what this is but it a byte too long
 8b 6b 07 09      
 5b f2 a1 0d 0a   
 5b f2 a1 0d 0a 

Итак, float temp2 занимает 5 байт вместо четырех, а общая длина файла - 23. Как это возможно?! Число не так мало, что они являются субнормальными числами, и я не могу думать ни о какой другой причине, почему разница в размере.

Я использую компилятор MSVC 2010 в 64-разрядной системе Windows 7.

Примечание: Я уже задал очень похожий вопрос здесь, но когда я понял, что проблема была более общей, я решил переписать ее более кратким образом. QDataStream иногда использует 32-битные, а иногда и 40-битные поплавки

4b9b3361

Ответ 1

Проблема в том, что в Windows вы должны различать текстовые и двоичные файлы. У вас есть файл, открытый как текст, что означает, что 0d (возврат каретки) вставлен перед каждым 0a (строкой). Откройте файл следующим образом:

if (!fopen_s(&outputFile, fileName, "wb"))

Остальное как и раньше, и оно должно работать.

Ответ 2

Вы не пишете текст; вы пишете двоичные данные... Однако ваш файл открыт для ввода текста ("w") вместо написания двоичного кода ("wb"). Следовательно, fwrite() переводит '\n' в "\r\n".

Измените это:

if (!fopen_s(&outputFile, fileName, "w")) 

Для этого:

if (!fopen_s(&outputFile, fileName, "wb")) 

В "wb", b обозначает двоичный режим.