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

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

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

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

WriteByte.c / C

17行

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

23行

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

25行

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

26行

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

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

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

為什麼會這樣呢?

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

也就是說,因為使用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

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

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

Original: https://www.cnblogs.com/oomusou/archive/2011/10/31/writebyte.html
Author: 真 OO无双
Title: (筆記) 如何寫入binary file某個byte的值? (C/C++) (C)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535034/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • C++11 列表初始化

    在我们实际编程中,我们经常会碰到变量初始化的问题,对于不同的变量初始化的手段多种多样,比如说对于一个数组我们可以使用 int arr[] = {1,2,3}的方式初始化,又比如对于…

    C++ 2023年5月29日
    050
  • 无废话–Mac OS, VS Code 搭建c/c++基本开发环境

    无废话,直接上步骤。 1) 安装 xcode。 打开App Store,搜索xcode,进行下载安装。 2)执行命令: xcode-select –install 安装…

    C++ 2023年5月29日
    056
  • 聊聊 C++ 中的几种智能指针 (上)

    一:背景 我们知道 C++ 是手工管理内存的分配和释放,对应的操作符就是 new/delete 和 new[] / delete[], 这给了程序员极大的自由度也给了我们极高的门槛…

    C++ 2023年5月29日
    081
  • C++中如何精确地输出特定类型的位数

    precision()函数和fixed合用的方法。 其中,fixed表示使用一般的方法(不是科学计数法之类的)输出浮点数。precision是cout自定义的函数,用来设置小数输出…

    C++ 2023年5月29日
    048
  • C++高性能服务器框架——日志系统

    日志文件系统 对文件系统进行修改时,需要进行很多操作。这些操作可能中途被打断,也就是说,这些操作不是”不可中断”(atomic)的。如果操作被打断,就可能造…

    C++ 2023年5月29日
    068
  • visual studio code的c++扩展

    posted @2020-08-20 10:07 kissrule 阅读(338 ) 评论() 编辑 Original: https://www.cnblogs.com/longc…

    C++ 2023年5月29日
    099
  • 侯捷c++系统工程师:全方位提升技能素养 侯捷C++视频全系列合集

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    C++ 2023年5月29日
    080
  • Visual C++ 运行库合集包完整版 v20201209

    Microsoft Visual C++ Redistributable(系统运行库,简称MSVC,VB/VC)是Windows操作系统应用程序的基础类型库组件。 此版Visual…

    C++ 2023年5月29日
    070
  • 客户端单元测试实践——C++篇

    作者 | 思兼来源 | 阿里开发者公众号 背景 我们团队在手淘中主要负责BehaviX模块,代码主要是一些逻辑功能,很少涉及到UI,为了减少双端不一致问题、提高性能,我们采用了将核…

    C++ 2023年5月29日
    063
  • VS Code C++ 代码格式化方法(clang-format)

    转自:https://blog.csdn.net/core571/article/details/82867932?depth_1-utm_source=distribute.pc…

    C++ 2023年5月29日
    0106
  • windows下使用vscode编写运行以及调试C/C++

    c++本地运行和debughttps://www.cnblogs.com/TAMING/p/8560253.html 运行C++/C代码 在终端运行 文件读入https://blo…

    C++ 2023年5月29日
    046
  • 聊聊 C++ 大一统的初始化运算符 {}

    一:背景 最近发现 C++ 中的类型初始化操作,没有 {} 运算符搞不定的,蛮有意思,今天我们就来逐一列一下各自的用法以及汇编展现,本来想分为 值&#…

    C++ 2023年5月29日
    028
  • C/C++中static,const,inline三种关键字的总结(参照网络)

    一、 关于staticstatic 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static 修饰符的产生原因、作用谈起,全面分析static 修饰符…

    C++ 2023年5月29日
    066
  • 【转】C++知识点总结

    其他路径: 微信公众号:程序喵星人 更多资源和视频教程,QQ:1902686547 这篇文章是对C++的知识点做了一些简单的总结,基本包含了所有的C++基础知识点。以下提到的知识点…

    C++ 2023年5月29日
    052
  • c++自定义排序_lambda表达式

    class Solution { void quickSort(vector& strs, int l, int r) { if (l >= r) return; i…

    C++ 2023年5月29日
    046
  • 【转】C++的赋值构造函数(赋值运算符重载)

    当一个类的对象向该类的另一个对象赋值时,就会用到该类的赋值构造函数。 当没有重载赋值构造函数(赋值运算符)时,通过默认赋值构造函数来进行赋值操作 注意:这里a,b对象是已经存在的,…

    C++ 2023年5月29日
    050
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球