2011-03-28 16 views
1

我是新手程序員,正在寫C語言的一個簡單的wav-player作爲一個寵物項目。部分文件加載過程需要從文件頭中讀取特定數據(採樣率,通道數......)。 目前我在做什麼與此類似:從C中的二進制文件中讀取不同位數據的良好編碼風格是什麼?

  1. 掃描字節序列,並跳過它
  2. 讀2個字節到變量
  3. 校驗值,並返回出錯
  4. 跳過4個字節
  5. 讀4個字節爲變量b
  6. 檢查值,並返回出錯

...等等。 (代碼見:https://github.com/qgi/Player/blob/master/Importer.c

我寫了一些幫助函數來執行掃描/跳過/讀取位。儘管如此,我仍在重複閱讀,檢查,幾次跳過部分內容,這看起來既不是非常有效,也不是很聰明。這對我的項目來說不是一個真正的問題,但是當處理二進制文件看起來這是一個相當常見的任務時,我想知道: 是否存在某種模式,以更清晰的代碼更有效地完成此操作?

回答

2

大多數情況下,人們通常會定義與文件結構相匹配的結構(通常帶有類似#pragma pack(1)的內容以確保不會出現填充)。然後他們將數據讀入一個類似fread的實例中,並使用結構中的值。

+0

謝謝,我沒有想到結構!具有很大的意義。 – 2011-03-28 21:24:40

0

爲了提高效率,使用4096字節大小的緩衝區讀取數據,然後對緩衝區中的數據進行解析會更有效率,並且只執行一次掃描解析就可以獲得最高效率。

+1

緩衝使用已經落後龜etc實現的,因此沒有必要 – fazo 2011-03-28 21:05:11

1

是我遇到的最乾淨的選擇是scanf式的功能unpack由Kernighan的&派克上page 219 of The Practice of Programming介紹,它可以像

// assume we read the file header into buf 
// and the header consists of magic (4 bytes), type (2) and length (4). 
// "l" == 4 bytes (long) 
// "s" == 2 bytes (short) 
unpack(buf, "lsl", &magic, &type, &length); 
+0

謝謝,這看起來像一個體面和靈活的解決方案! – 2011-03-29 07:07:34

+0

@qgi:這是我見過的最便攜的解決方案,對二進制文件解析和網絡編程都很好。 (它也適用於'struct',順便說一句。) – 2011-03-29 15:28:28

相關問題