2010-04-05 1 views
0

Я печатаю переменную say 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 цифр точности, а ширина поля имеет правильную ширину для правильного отображения номера. Помещает ли точка (.) В позиции ширины вместо значения ширины хорошей практикой?

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

UPDATE Меняется на:

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

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

ответ

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

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

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

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

for (i = 0; i < z_size; i++) 
{ 
    double z = (double)z1[i]; 
    fwrite(&z, sizeof(double), 1, out); 
} 
+0

Спасибо. Является ли моя новая реализация одобренной? – yCalleecharan

+0

@yCalleecharan: не совсем - вы пропустили индекс z1, и вы, вероятно, захотите написать файл 'double', а не' long double' - см. Править выше. –

+0

Большое спасибо. Теперь он работает нормально.Я тестировал в Matlab, используя: формат long; fid = fopen ('vz3.dat', 'r'); mydata = fread (fid, 'double'), и это кажется прекрасным. Я определил, что z1 длинный двойной, но здесь, когда вы конвертируете его в double, вы его бросаете? Двойной и длинный двойной имеют 15 цифр точности на моей машине. – yCalleecharan

Смежные вопросы