Печать двоичных файлов и желаемая точность - PullRequest
0 голосов
/ 06 апреля 2010

Я печатаю переменную, скажем, z1, которая представляет собой одномерный массив, содержащий числа с плавающей запятой, в текстовый файл, чтобы я мог импортировать их в Matlab или GNUPlot для построения графиков. Я слышал, что двоичные файлы (.dat) меньше, чем файлы .txt. Определение, которое я сейчас использую для печати в файл .txt:

void create_out_file(const char *file_name, const long double *z1, size_t z_size){
FILE *out;
size_t i;
 if((out = _fsopen(file_name, "w+", _SH_DENYWR)) == NULL){
 fprintf(stderr, "***> Open error on output file %s", file_name);
 exit(-1);
 }
for(i = 0; i < z_size; i++)
fprintf(out, "%.16Le\n", z1[i]);
fclose(out);
}   

У меня три вопроса:

  1. Являются ли двоичные файлы действительно более компактными, чем текстовые файлы ?;

  2. Если да, я хотел бы знать, как изменить приведенный выше код, чтобы я мог распечатать значения массива z1 в двоичный файл. Я читал, что fprintf должен быть заменен на fwrite. Мой выходной файл говорит, что dodo.dat должен содержать значения массива z1 с одним плавающим числом на строку.

  3. У меня есть% .16Le в моем коде, но я думаю, что% .15Le прав, поскольку у меня есть 15 прецизионных цифр с длинным двойным. Я поставил точку (.) В положение ширины, так как считаю, что это позволяет расширить произвольное поле для хранения нужного числа. Я прав? Как пример с% .16Le, у меня может быть вывод как 1.0047914240730432e-002, который дает мне 16 прецизионных цифр, а ширина поля имеет правильную ширину для правильного отображения числа. Является ли целесообразным размещение точки (.) В позиции ширины вместо значения ширины?

Большое спасибо ...

ОБНОВЛЕНИЕ Меняется на:

for(i = 0; i < z_size; i++)
fwrite(&z1, sizeof(long double), 1, out);

хорошо, кроме изменения на "wb +"? Я не могу прочитать двоичный файл в Matlab.

1 Ответ

0 голосов
/ 06 апреля 2010
  1. да, бинарные файлы более компактны, но вы теряете переносимость и есть и другие потенциальные проблемы, поэтому, если ваши файлы данных не слишком большие или не слишком медленны для экспорта / импорта, лучше придерживаться текст, если вы можете (вы всегда можете сжать их для хранения, например, с zip)

  2. откройте ваш файл с помощью "wb" вместо "w" и используйте fwrite() - у вас больше не будет "строк" в вашем файле - это будет просто поток (двоичных) значений с плавающей запятой

  3. вы можете запутаться между double и long double - размер long double может быть до 16 байт и иметь точность до 32 цифр (однако это зависит от реализации - long double обычно может быть 10, 12 или 16 байтов). double обычно составляет 8 байтов и имеет точность около 16 цифр.

MATLAB может не справиться с long double (так как он не очень хорошо стандартизирован), поэтому вы, вероятно, просто хотите записать в файл данных удвоения, например,

for (i = 0; i < z_size; i++)
{
    double z = (double)z1[i];
    fwrite(&z, sizeof(double), 1, out);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...