(筆記) 如何寫入binary file某個byte的值? (C/C++) (C)

來源:互聯網
上載者:User

Abstract
通常公司為了保護其智慧財產權,會自己定義檔案格式,其header區會定義每個byte各代表某項資訊,所以常常需要直接對binary檔的某byte直接進行寫入。

Introduction
使用環境:Windows XP SP3 + Visual C++ 6.0 SP6

將在wf.bin的0x33 byte處寫入0xAC值。

WriteByte.c / C

 1 /* 
2 (C) OOMusou 2011 http://oomusou.cnblogs.com
3
4 Filename : WriteByte.c
5 Compiler : Visual C++ 6.0
6 Description : how to write byte value with n-byte position?
7 Release : oct.31,2011 1.0
8 */
9
10 #include <stdio.h>
11
12 int main() {
13 FILE *fp;
14 int filesize;
15 unsigned char buff[1];
16
17 fp = fopen("./wf.bin", "rb+");
18 if (!fp) {
19 fclose(fp);
20 return -1;
21 }
22
23 buff[0] = 0xAC;
24
25 fseek(fp, 0x33, SEEK_SET);
26 fwrite(buff, sizeof(unsigned char), 1, fp);
27
28 fclose(fp);
29
30 return 0;
31 }

17行

fp = fopen("./wf.bin", "rb+");

將wf.bin開啟,rb表示read binary,+表示除了read外,也可以做write。

23行

buff[0] = 0xAC;

由於要寫入的是1個byte,其值為0xAC,故先宣告buff這個char array,將0xAC填入。

25行

fseek(fp, 0x33, SEEK_SET);

使用fseek將binary file的檔案位置移到0x33處,其中SEEK_SET表示offset是從檔頭開始。

26行

fwrite(buff, sizeof(unsigned char), 1, fp);

正式使用fwrite將buff寫入檔案。

完整程式碼下載
WriteByte.7z

Conclusion
以上的code看起來都很直觀,但讓我搞一天的地方是在17行,我原本以為既然是要寫入binary file,所以很直覺的這樣寫:

fp = fopen("./wf.bin", "wb");

wb表示write binary,看起來非常直覺,但結果卻會變成位置0x33處的確會寫入0xAC,但檔案卻到此為止,後面的資料完全不見了!!

為什麼會這樣呢?

在C IN A NUTSHELL語法暨程式庫標準辭典[1] p.208第7行:

如果模式字串以r開始,此檔案必須有存在檔案系統中才行。如果模式字串以w開始,那麼如果檔案不存在,就會建立一個新檔案;如果存在,那麼之前的內容就會遺失,因為在write中,fopen()函式會將檔案的長度截為0。

也就是說,因為使用wb開啟,且又使用fseek()移動了binary file的位置到0x33,所以0x33之後檔案長度被截為0,然後fwrite()將0xAC寫到檔案位置0x33處。

所以雖然只是小小的差異,但結果卻天差了十萬八千裡啊。

在此筆記fopen()所有參數排列組合的意義[2]

r 打開現有text file以便讀取
w 產生新text file或截短現有text file至零長度以便寫入
a 附加。產生新text file或打開現有text file以便在檔案結束處寫入
rb 打開現有binary file以便讀取
wb 產生新binary file或將現有binary file截至零長度以便寫入
ab 附加。產生新binary file或打開現有binary file以便在檔案結束處寫入
r+ 打開現有text file,以便更新(讀和寫)
w+ 產生新text file或將現有text file截至零長度以便更新。
a+ 附加。產生新text file或打開現有text file以便更新,在檔案結束處寫入
r+b或rb+ 打開現有binary file以便更新(讀和寫)
w+b或wb+ 產生新binary file或截短現有檔案至零長度以便更新
a+b或ab+ 附加。產生新binary file或截短現有檔案至零長度以便更新,在檔案結束處寫入

See Also

(筆記) 如何寫入binary file某個byte連續n byte的值? (C/C++) (C)

Reference
[1] Peter Prinz & Tony Crawford 2005, 蔡學鏞 編譯,C IN A NUTSHELL語法暨程式庫標準辭典,美商歐萊禮股份有限公司

[2] P.J Plauger, The Standard C Library

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.