Я столкнулся с нечетной проблемой при экспорте значений 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-битные поплавки