2009-10-20 28 views
1

我正在將舊C程序(當前在UNIX上運行)轉換爲C#系統。由舊C代碼寫入的文件,移至C#

該方案建立一些數據分成幾個結構,然後將寫入使用一系列fwrites的像這樣的文件:

fwrite (&loc, sizeof (struct loc_items), 1, hdata.fp); 

隨着祿是數據,結構loc_items是這是一個類型的結構。

我的問題是,如果我能匹配這個文件輸出與C#?假設我可以匹配浮點數,整數等的字節格式和大小。因爲它在fwrite中寫入整個結構,所以我不知道它寫入結構的不同變量的順序。在fwrite可能放的結構體周圍還有什麼問題?

有什麼建議嗎?

+1

你必須知道字節寫入文件的方式,如果你正在寫一個結構體,那麼這些變量的寫入順序與它們在結構體中聲明的順序相同。 – marcosbeirigo 2009-10-20 16:22:01

+1

優秀,幫助很多,謝謝。 – Luke 2009-10-20 16:27:49

回答

5

您有多種選擇。

  • 使用BinaryWriter並單獨寫入結構的每個字段。
  • 使用編組獲取結構的字節數組並將其寫入您的流。
  • 使用像Miguel de Icaza的結構庫這樣的庫。

就我個人而言,我不喜歡在這種情況下使用編組。我只需在結構或類中添加一些「Open/Save」,「Read/Write」,「Hydrate/Dehydrate」,「Serialize/Deserialize」方法。

class POCO { 
    int aaa; 
    double bbb; 

    public void Read(BinaryReader r) { 
     aaa = r.ReadInt32(); 
     bbb = r.ReadDouble(); 
    } 
    public void Write(BinaryWriter w) { 
     w.Write(aaa); 
     w.Write(bbb); 
    } 
} 

這樣,您完全可以控制讀取和寫入的內容。

+0

+1,BinaryWriter也會比使用編組更快。 – 2009-10-20 16:42:29

+0

有沒有這個endian問題?對於aaa,首先寫入的是高字節還是低字節?怎麼樣的雙?更重要的是,這件事真的讓人擔心嗎? – 2009-10-20 16:43:02

+0

**沒有**,沒有排序問題。鑑於他過去直接從內存寫入結構到磁盤,他顯然並不關心小小和大小,而是依賴於他的機器架構。 – 2009-10-20 16:54:02

3

進行快速單元測試,使用移植的C#版本生成文件,然後比較系統生成的文件中的內容。那麼你至少會有一個自動發現差異的測試。