C:将二进制文件读取到内存,更改缓冲区,将缓冲区写入文件

rze*_*erg 5 c memory binary file

目标: 用二进制数据打开文件,将整个文件读入内存,更改文件的某些部分,将内存缓冲区写入文件,关闭文件.利润?

问题: 我刚刚开始学习C,但是我找不到有关如何更改内存缓冲区中二进制数据的足够信息.来自Web开发人员背景(php,python,as3)这对我来说是一个新的领域.

上下文: 我有一个函数,它接受文件的路径和指针地址到char指针的内存缓冲区.然后打开文件,遍历文件并将数据写入内存缓冲区.最后关闭文件.

二进制文件的目的是为某些对象保存category-id,它们的位置是它们自己的id.category-id表示为2字节短路.所以基本上它只是一个二进制文件,里面装满了很多我希望能够阅读和更改的短裤.

这是我到目前为止所得到的:

main.c中:

#include "binary-handler.h"

void showFileBuffer(char *buffer, unsigned int fileSize){
    int i = 0;
    for(; i < fileSize; ++i){
        printf("<%d:%x>\n", i, ((char *)buffer)[i]);
    }
}

int main(){
    char path[] = "assets/map-squares.bin";
    char *buffer;
    int fileSize;
    fileSize = readFileToMemory(path, &buffer);
    showFileBuffer(buffer, fileSize);

    //Code to change buffer
    //Code to write buffer to file
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

二进制handler.c:

#include <stdio.h>
#include <stdlib.h>

unsigned int getFileSize(FILE **file){
    unsigned int size;
    if(fseek(*file, 0, SEEK_END) == -1){ return -1; }
    size = ftell(*file);
    fseek(*file, 0, SEEK_SET);
    return size;
}

char *getFileBuffer(FILE **file, unsigned int fileSize){
    char *buffer = malloc(fileSize + 1);
    fread(buffer, fileSize, 1, *file);
    return buffer;
}

unsigned int readFileToMemory(char path[], char **buffer){
    unsigned int fileSize;

    FILE *file = fopen(path, "rb");
    if(file != NULL){
        fileSize = getFileSize(&file);
        *buffer = getFileBuffer(&file, fileSize);
        fclose(file);
        return fileSize;
    }else{
        *buffer = NULL;
        return -1;
    }
}
Run Code Online (Sandbox Code Playgroud)

1.此代码是否会正确生成第一步(读取文件到内存)?

2.如果是,我如何更改,说缓冲区中的第二个对象的值为0F 00?

3.如何获取缓冲区并将其写回文件?

4.有没有办法让我以冗长的方式检查缓冲区中的值?

总而言之,我只想帮助掌握整个概念,以便我自己解决这个问题.

谢谢!

编辑:删除了文件的循环.添加了打印整个缓冲区的功能.

Mar*_*lon 2

1) 不需要。您不需要循环,getFileBuffer因为您使用fread. 您也不需要调用fseek,因为每次从文件中读取时,您都会在文件流中自动前进。我还没有调试您的代码,但看起来当您的循环完成时,缓冲区中的每个元素都将包含相同的值,并且它将等于文件中最后一个字节的值。

注意:您为 fread 指定的参数是向后的。第二个参数是您正在读取的类型的大小,应该是sizeof(char)。第三个参数应该是您想要读取的字符数,应该是fileSize。不过,您的代码仍然有效,但它表示当您读取字节长的1对象时,它想要读取字节长的对象。fileSizefileSize1

2)您可以像这样读取第二个短值(以小端方式):

short n = 0;
n |= buffer[2] << 0;
n |= buffer[3] << 8;
Run Code Online (Sandbox Code Playgroud)

您可以将短路写回文件,如下所示:

buffer[2] = n >> 0;
buffer[3] = n >> 8;
Run Code Online (Sandbox Code Playgroud)

3)fwrite

4)我不明白你在问什么。