c语言中如何修改文件中间的几个字节

 更新时间:2020年10月5日 17:30  点击:1275

fopen的打开模式

在C语言中文件打开方式有这么几种:

r 以只读方式打开文件,只能读不能写,往文件中写是没有任何效果的
r+ 可以读,也可以写,文件打开的时候,指向文件开头,可以通过seek改变读写位置
w 这种方式打开的文件句柄,只能写,如果文件存在则将长度清零,否则新建文件,这种句柄通过seek之后,seek位置之前的文件数据全部变成0x00
w+ 同w选项,只不过多了一个可读功能
a 这种方式打开的文件,可以写,但是位置在文件末尾,即使往回seek也没有用,数据还是从文件末尾开始附加
a+ 同a选项,多了可读的功能
另外还有2个选项,可以与上面的6个选项复合使用,一个是t表示以文本的方式打开文件(默认是t),一个是b表示以二进制的方式打开文件,t和b是互斥的不能同时使用。当与b组合时,有这么几种方式:wb、ab、rb、wb+、ab+、rb+,而a,w,r这几个选项是不能组合使用的,其中a,w都表示写文件,只不过一个在文件尾,一个在文件开始处,r表示读文件。我试过将a,w,r几个两两组合使用,发现下面的现象:

wr 与w效果一样
rw与r效果一样
aw与a效果一样
wa 与w效果一样
ar与a效果一样
ra与r效果一样
可以看出来当a,w,r在一起组合使用的时候,其后面的选项实际上好像是被忽略了

问题的解决方法:rb+打开文件

所以解决文章开头提出来的问题,应该使用 rb+ 的方式打开文件,这种方式打开的文件,可读,可写,打开之后写指针在文件开始处,可以任意seek,而seek之后写的内容会覆盖被写的内容,其他没有写到的内容不会有改变。

测试程序

//程序测试结果在ubuntu linux下运行获得
#include <stdio.h>
#include <string.h>
int main()
{
  //文件原始数据
  //00 01 02 03 04 05 06 07 08 09
 
  //下面每一个fopen前面注释中的数据是以该方式打开文件,写文件之后文件的内容
   
  //00 00 00 00 CC DD
  //FILE * file = fopen("./test.data","wb+");
  
  //00 00 00 00 CC DD
  //FILE * file = fopen("./test.data","wb");
  
  //00 01 02 03 CC DD 06 07 08 09
  FILE * file = fopen("./test.data","rb+"); //这种是正确的做法
  
  //00 01 02 03 04 05 06 07 08 09
  //FILE * file = fopen("./test.data","rb");
  
  //00 01 02 03 04 05 06 07 08 09 CC DD
  //FILE * file = fopen("./test.data","ab");
  
  //00 01 02 03 04 05 06 07 08 09 CC DD
  //FILE * file = fopen("./test.data","ab+");
  
  //00 00 00 00 CC DD
  //FILE * file = fopen("./test.data","wr");
  
  //00 01 02 03 04 05 06 07 08 09
  //FILE * file = fopen("./test.data","rw");
  
  //00 01 02 03 04 05 06 07 08 09 CC DD
  //FILE * file = fopen("./test.data","aw");
  
  //00 00 00 00 CC DD
  //FILE * file = fopen("./test.data","wa");
  
  //00 01 02 03 04 05 06 07 08 09 CC DD
  //FILE * file = fopen("./test.data","ar");
  
  //00 01 02 03 04 05 06 07 08 09
  //FILE * file = fopen("./test.data","ra");
  if(file!=NULL)
  {
   char buffer[]={0xCC,0xDD};
   fseek(file,4,SEEK_SET);
   fwrite(buffer,1,sizeof(buffer),file);
   fclose(file);
  }
  return 0;
}

修改C中二进制文件中的一些字节

有没有办法改变二进制文件中单个字节的值?我知道如果以r b模式打开文件,光标将位于现有文件的开头,您在该文件中写入的任何内容都将覆盖现有内容.

但我想在一个文件中只改变1个字节.我想你可以复制不应修改的文件内容,并在正确的位置插入所需的值,但我想知道是否还有其他方法.

我希望实现的一个例子:

将第3个字节更改为67

初始档案:

00 2F 71 73 76 95

写入后的文件内容:

00 2F 67 73 76 95

使用fseek移动到文件中的位置:

FILE *f = fopen( "file.name", "r+b" );
fseek( f, 3, SEEK_SET ); // move to offest 3 from begin of file
unsigned char newByte = 0x67;
fwrite( &newByte, sizeof( newByte ), 1, f );
fclose( f );

到此这篇关于c语言中如何修改文件中间的几个字节的文章就介绍到这了,更多相关修改文件中间字节内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

[!--infotagslink--]

相关文章

  • C#将数字转换成字节数组的方法

    这篇文章主要介绍了C#将数字转换成字节数组的方法,涉及C#字符串操作的技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • C++中int类型按字节打印输出的方法

    这篇文章主要给大家介绍了关于C++中int类型按字节打印输出的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-04-25
  • C#将布尔类型转换成字节数组的方法

    这篇文章主要介绍了C#将布尔类型转换成字节数组的方法,涉及C#中字符串函数的使用技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • C#将字节数组转换成数字的方法

    这篇文章主要介绍了C#将字节数组转换成数字的方法,涉及C#类型转换的技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • Javascript将双字节字符转换成单字节字符并计算长度

    这篇文章主要介绍Javascript将双字节字符转换成单字节字符并计算长度的方法,简单实用,需要的朋友可以参考下。...2016-06-24
  • 在Access中实现字段长超过255个字节的新思路

    不如在mdb中设一字段为外部一ASCII文件的记录行号或其他检索时用的关键字段,该文件用来记录Memo类字段; 或者,在mdb中做多个字段来记录超过256长的字符串,取得时候做字符...2016-11-25
  • PHP中多字节字符串操作实例详解

    我们所说的多字节字符指的是不在传统的 128 个 ASCII 字符集中的字符,比如中文字符,下面这篇文章主要给大家介绍了关于PHP中多字节字符串操作的相关资料,需要的朋友可以参考下...2021-08-23
  • PHP中字符与字节的区别及字符串与字节转换示例

    在php中字符是可使用多种不同字符方案或代码页来表示的抽象实体。字节是通过网络传输信息(或在硬盘或内存中存储信息)的单位。本文还通过实例给大家介绍了php中字符串与字节转换示例,感兴趣的朋友一起看看吧...2016-10-20
  • C语言实现 数据类型占多少字节指针占多少字节

    这篇文章主要介绍了 C语言 数据类型占多少字节指针占多少字节的实例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-04-25
  • c# String扩展 让你在PadLeft和PadRight时不再受单双字节问题困扰

    这篇文章主要介绍了c# String扩展 让你在PadLeft和PadRight时不再受单双字节问题困扰,需要的朋友可以参考下...2020-06-25
  • C++多字节字符与宽字节字符相互转换

    最近在C++编程中经常遇到需要多字节字符与宽字节字符相互转换的问题,自己写了一个类来封装wchar_t与char类型间的转换...2020-04-25
  • 使用php自带的多字节处理函数来处理中文,最佳方法

    <? echo "<p>__________________________<p>"; $string="242432反对感是456,,犯得上广泛大使馆地方7890abc"; $mb_strlen=mb_strlen($string); $len=20; echo $s...2016-11-25
  • php字符串与byte字节数组转化类示例

    文章给大家提供一个php字符串与byte字节数组转化类示例,希望文章对各位同学会有所帮助。 代码如下 复制代码 <?php /** * byte数...2016-11-25
  • 浅谈java中字节与字符的区别

    这篇文章主要介绍了浅谈java中字节与字符的区别,字节是java中的基本数据类型,用来申明字节型的变量;字符是语义上的单位,它是有编码的,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-07-22
  • Java常用字节流和字符流实例汇总

    这篇文章主要介绍了Java常用字节流和字符流实例汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-26
  • c语言中如何修改文件中间的几个字节

    工作中碰到一个问题,如何只修改文件中间的几个字节,而其他的内容不变。这个问题看似简单,但是很多人估计都不知道怎么做。我开始seek到文件的特定的位置,然后写文件,但是使用的文件打开模式不对,文件不是被清空,就是被截断,达不到效果...2020-10-05
  • 字节飞书面试promise.all实现示例

    这篇文章主要为大家介绍了字节飞书面试promise.all实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...2022-06-15
  • java 实现取int型的第二个字节的数

    这篇文章主要介绍了java实现取int型的第二个字节的数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2022-01-26