我打印一個變量說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個精度數字,並且字段的寬度具有正確的寬度以正確顯示數字。在寬度位置放置點(。)而不是寬度值是一種好的做法?
非常感謝......
UPDATE正在改變:
for(i = 0; i < z_size; i++)
fwrite(&z1, sizeof(long double), 1, out);
確定,除了變更爲 「WB +」?我無法在Matlab中讀取二進制文件。
謝謝。我的新實施是否正常? – yCalleecharan 2010-04-06 12:19:55
@yCalleecharan:不完全 - 你錯過了z1的索引,你可能想寫一個'double'而不是'long double'的文件 - 參見上面的編輯。 – 2010-04-06 15:53:22
非常感謝。現在工作正常。我在Matlab中測試過使用: format long; fid = fopen('vz3.dat','r'); mydata = fread(fid,'double')並且看起來很好。我將z1定義爲long double,但是當你將它轉換爲double時,你在投射它?在我的機器上,double和long double都有15個精度數字。 – yCalleecharan 2010-04-06 16:18:38