2009-12-07 88 views
1

我有一個非常大的雙精度數字數組...我試圖用fprintf()將它寫入文件中...我需要在每行中寫入這些數字所以我做了這樣的事情。把數組寫入文件的問題

if((fp2 = fopen("temp", "w")) == NULL) { perror("File cannot be opened"); exit(1); } 

for(int k = 0; k < j; k++) 
{ 
fprintf(fp2, "%0.3lf\n", diff[k]); 
} 

但是,有一個問題,它寫入的數據達到一定數量的行後,我給所有的零。例如

3.040 
0.700 
-2.740 
0.000 
0.000 
0.000 
0.000 
0.000 
0.000 

我真的不明白可能是什麼問題。爲什麼當數組中有值時,它將所有值寫爲0.000。

這裏是差異如何實現,如果它有幫助。

  diff = (double *)malloc(fileSize); 

     diff[0] = data[0]; 


     for(j = 1; j < n; j++) 
     { 
      diff[j] = data[j] - data[j-1]; 
     } 

來自文件的值存儲在data []中。然後我計算了data []中的相鄰值的差異,並將其寫回到另一個文件中。 fileSize是原始文件的大小。並且我確信diff []中的所有值都正確填充。

+0

你怎麼知道有一些值?你是否在'fprintf()'上使用了一個斷點並且實際檢查了這個數組的內容? – viraptor 2009-12-07 16:39:01

+0

你確定tehre裏面至少有j個元素嗎? – 2009-12-07 16:39:10

+0

在格式說明符中將小寫'l'更改爲大寫'L'。 – 2009-12-07 16:40:35

回答

3

添加的意見後作出正式答覆:

你有下面這行:


diff = (double *)malloc(fileSize); 

注意,當你malloc(fileSize)你在內存分配檔案大小字節。每個double需要8個字節(或多或少取決於平臺),因此您的陣列中將包含fileSize/8個元素。你是否確定n永遠不會超出陣列中元素的數量?

您的程序可能printf正常工作而不是fprintf的原因是內存錯誤非常微妙。如果你開始使用你沒有分配的內存,那麼事情可能會很短時間,但當程序的另一部分完全合理地決定開始使用你已經無意使用的那塊內存時,可能會失靈。

0

這可能是因爲您已將陣列初始化爲零,即0.0通過memset或類似的。並且在迭代數組時,它會將偏移量中的值拉到零(可能是您超量分配/超過了數組的估計大小)。

 
if((fp2 = fopen("temp", "wt")) == NULL) { 
    perror("File cannot be opened"); 
    exit(1); 
} 

for(int k = 0; k < j; k++) 
{ 
if (diff[k] > 0.0) fprintf(fp2, "%0.3lf\n", diff[k]);  
} 

我已經添加了一個額外的邏輯來檢查指定的數組中的偏移值是否大於零,以將其放入文件。

另一件事,當您在fopen(...)函數中指定訪問模式的類型時,它默認爲二進制。真的應該是t指定文本模式,如上所示。

希望這會有所幫助, 最好的問候, 湯姆。

+0

fopen()默認爲文本模式。模式參數中的't'是一個(冗餘)編譯器擴展 - 它不被C標準識別。 – pmg 2009-12-07 17:13:29

+0

@pmg:我的不好!感謝您的領導!我是老派...:P – t0mm13b 2009-12-07 18:32:01

4

打印double值的正確轉換說明符是%f,而不是%lf

C99未指定%lf接受的內容。您的實施可能會提供%lf作爲long doubles或其他的擴展,但您需要將變量的類型與轉換說明符進行匹配。檢查你的編譯器的文檔。

如果您有long doubles,則正確的C99轉換說明符是%Lf


編輯,之後問題被編輯

  for(j = 1; j < n; j++) 
      { 
        diff[i] = data[i] - data[i-1]; 
      } 

循環變量是j,爲DIFF索引和數據是i。這是一個複製/粘貼錯誤,還是它是你真正的問題?:)


第二編輯

嗯...那malloc(fileSize)看起來非常,非常,腥。
基於data陣列中元素的數量,您不知道需要多少元素嗎?改爲使用它。

diff = malloc(number_of_elements_in_array_data * sizeof *diff); 
+0

是的,這是一個複製粘貼的東西,我糾正了這一點。 – sfactor 2009-12-07 17:10:37

0

如果你只是想打印第一個值,以及連續值之間的差異,爲什麼要打擾差數組?爲什麼不這麼簡單呢?

fprintf(fp2, "%Lf\n", data[0]); 
for(j = 1; j < n; j++) 
{ 
    fprintf(fp2, "%Lf\n", data[j] - data[j-1]); 
} 

正如其他人指出的,你的malloc()可能是假的,這就是你的感覺。