zoukankan      html  css  js  c++  java
  • C语言丨如何修改文件中间的几个字节?这才是打开文件的正确方式!

    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语言中如何修改文件中间的几个字节的详细介绍。感谢阅读,希望能帮助到大家,有什么问题欢迎评论区留言。


     

    如果你想更好的提升你的编程能力,学好C语言C++编程!弯道超车,快人一步!

    C语言C++学习企鹅圈子】,分享(源码、项目实战视频、项目笔记,基础入门教程)

    欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

    编程学习书籍:


     

    编程学习视频:

  • 相关阅读:
    【NOIP2007】守望者的逃离
    20200321(ABC)题解 by 马鸿儒 孙晨曦
    20200320(ABC)题解 by 王一帆
    20200319(ABC)题解 by 王一帆 梁延杰 丁智辰
    20200314(ABC)题解 by 董国梁 蒋丽君 章思航
    20200309(ABC)题解 by 梁延杰
    20200307(DEF)题解 by 孙晨曦
    20200306(ABC)题解 by 孙晨曦
    20200305(DEF)题解 by 孙晨曦
    20200303(ABC)题解 by 王锐,董国梁
  • 原文地址:https://www.cnblogs.com/mu-ge/p/14202318.html
Copyright © 2011-2022 走看看