2012-07-18 23 views
0

我真的很想幫助解決以下問題。C語言中的二進制文件:使用fread函數和nlogn排序問題

我需要在兩個兩個二進制文件閱讀ñ整數(二進制格式),和(二進制格式再)來寫另一個輸出文件中的所有常見的整數O(nlogn)時間。

這裏是我想要做的草圖:

1 - 我知道,我不能%d使用fscanf,因爲這些都不是文本文件,但因爲我知道,在每個N個數文件,我想在運行一個「for」循環N次和

for (i=0; i<N; i++) { 
    fread(&int1, 4, 1, file1); 
    fread(&int2, 4, 1, file2); 
    arr1[i]=int1; 
    arr2[i]=int2; 
} 

arr1arr2各自爲N大小的INT數組,這是正確的嗎?如果我知道有N個整數,每個整數用4位表示,那麼我會在文件末尾完成,是嗎?

2-我想使用qsort排序每個數組與nlogn步驟,但那麼我應該如何比較兩個仍然nlogn步驟?我沒有得到任何聰明的方式。

+0

我可以幫你第二部分。 單獨對2個數組進行排序,然後使用合併排序中的合併過程將它們合併到O(n)時間內的一個排序數組中。 qsort(arr1), qsort(arr2), merge(arr1,arr2)。 ping我,如果你需要一些幫助的代碼。 – axiom 2012-07-18 19:17:36

回答

1

你的代碼基本上是正確的,除非它到達文件結束時不會正確運行。 fread沒有檢測到EOF,直到你嘗試讀取過去的結束,所以你應該測試的情況下,它到達EOF的返回值或出現錯誤,如:

if(fread(..., file1) < 1 || 
    fread(..., file2) < 1) 
{ 
    // Error or EOF occurred 
    break; 
} 

你也可以只發出聲音在整個陣列單fread呼叫,而不是循環,因爲數據是二進制的:

int arr1[20], arr2[20]; 
if(fread(arr1, sizeof(arr1[0]), 20, file1) < 20 || 
    fread(arr2, sizeof(arr2[0]), 20, file2) < 20) 
{ 
    // Error or early EOF occurred 
} 

關於第二個問題,只需將所有的整數到一個單一的平面數組。您可以通過將它們直接讀取到單個數組中,或者在讀入所有數據後將它們複製到一個數組中來完成此操作。然後qsort組合陣列。

+0

非常感謝你的回答。我沒有得到答案的第二部分。我有兩個N大小的int值數組(某些值可能在某個數組中出現兩次)。假設A1,A2。我想向另一個文件寫入兩個數組中出現的所有數字,即兩個文件。我可以在nlogn中對合並的數組進行排序,然後我應該怎麼做? – Numerator 2012-07-18 19:38:48

+0

然後使用['fwrite'](http://linux.die.net/man/3/fwrite)將數據寫入新文件。 – 2012-07-18 20:08:45

+0

但是,我怎麼知道哪些整數是兩個數組共同的? – Numerator 2012-07-18 20:54:01

相關問題