【问题标题】:Modify some bytes in a binary file in C用C修改二进制文件中的一些字节
【发布时间】:2015-12-26 17:38:34
【问题描述】:

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

但我只想更改文件中的 1 个字节。我猜你可以复制不应该修改的文件内容,并在正确的位置插入所需的值,但不知道有没有其他方法。

我想实现的一个例子: 将第 3 个字节更改为 67

初始文件:

00 2F 71 73 76 95

写入后的文件内容:

00 2F 67 73 76 95

【问题讨论】:

    标签: c file byte


    【解决方案1】:

    使用fseek()定位文件指针,然后写出1个字节:

    // fseek example
    #include <stdio.h>
    
    int main ()
    {
        FILE * pFile;
        pFile = fopen("example.txt", "wb");
        fputs("This is an apple.", pFile);
        fseek(pFile, 9, SEEK_SET);
        fputs(" sam", pFile);
        fclose(pFile);
        return 0;
    }
    

    http://www.cplusplus.com/reference/cstdio/fseek/

    对于现有文件且仅更改 1 个字符:

    FILE * pFile;
    char c = 'a';
    
    pFile = fopen("example.txt", "r+b");
    
    if (pFile != NULL) {
        fseek(pFile, 2, SEEK_SET);
        fputc(c, pFile);
        fclose(pFile);
    }
    

    【讨论】:

    • 所以如果我先执行fseek(file, 3, SEEK_SET); 然后 fwrite(&buffer, sizeof(char), 1, file);` 并且缓冲区的值是 67,那会按照我的意愿完成吗?
    • 是的,但您也可以使用 fputc()。你在 fseek() 中的“文件”需要是一个指针。
    【解决方案2】:

    使用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 );
    

    【讨论】:

    • 谢谢,我以为在做这样的事情之后,文件将只保存00 2F 67
    • @Gernot1976 注意sizeof( unsigned char ) 定义为1,最好使用它来匹配写入的变量类型的任何更改,例如sizeof newbyte
    猜你喜欢
    • 2018-03-27
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多