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++学习企鹅圈子】,分享(源码、项目实战视频、项目笔记,基础入门教程)

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

    编程学习书籍:


     

    编程学习视频:

  • 相关阅读:
    AE Featureclass 添加字段
    C# AE 打开本地数据
    C# DataTable操作
    IDL + AE + C#
    C#, HashTable
    KMeans Clustering
    C#打开外部程序
    二叉树删除操作(java)
    python小游戏水文
    QQ机器人
  • 原文地址:https://www.cnblogs.com/mu-ge/p/14202318.html
Copyright © 2011-2022 走看看