2010-04-05 64 views
0

我打印一個變量說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. 您可能會感到困惑補間doublelong double - 一個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 2010-04-06 12:19:55

+0

@yCalleecharan:不完全 - 你錯過了z1的索引,你可能想寫一個'double'而不是'long double'的文件 - 參見上面的編輯。 – 2010-04-06 15:53:22

+0

非常感謝。現在工作正常。我在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