Я печатаю переменную, скажем, 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);
}
У меня три вопроса:
Являются ли двоичные файлы действительно более компактными, чем текстовые файлы ?;
Если да, я хотел бы знать, как изменить приведенный выше код, чтобы я мог распечатать значения массива z1 в двоичный файл. Я читал, что fprintf должен быть заменен на fwrite. Мой выходной файл говорит, что dodo.dat должен содержать значения массива z1 с одним плавающим числом на строку.
У меня есть% .16Le в моем коде, но я думаю, что% .15Le прав, поскольку у меня есть 15 прецизионных цифр с длинным двойным. Я поставил точку (.) В положение ширины, так как считаю, что это позволяет расширить произвольное поле для хранения нужного числа. Я прав? Как пример с% .16Le, у меня может быть вывод как 1.0047914240730432e-002, который дает мне 16 прецизионных цифр, а ширина поля имеет правильную ширину для правильного отображения числа. Является ли целесообразным размещение точки (.) В позиции ширины вместо значения ширины?
Большое спасибо ...
ОБНОВЛЕНИЕ Меняется на:
for(i = 0; i < z_size; i++)
fwrite(&z1, sizeof(long double), 1, out);
хорошо, кроме изменения на "wb +"? Я не могу прочитать двоичный файл в Matlab.