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

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

问题:我刚刚开始学习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("\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; } 

二进制handler.c:

 #include  #include  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; } } 

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

2.如果是,我怎么能改变,说缓冲区中的第二个对象的值是0F 00?

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

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

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

谢谢!

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

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

注意:您为fread指定的参数是向后的。 第二个参数是您正在读取的类型的大小,应该是sizeof(char) 。 第三个参数应该是您想要读取的字符数量,应该是fileSize 。 但是,您的代码仍然可以正常工作,但是当您读取1个字节长的fileSize对象时,它希望读取1个长度为fileSize字节的对象。

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

 short n = 0; n |= buffer[2] << 0; n |= buffer[3] << 8; 

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

 buffer[2] = n >> 0; buffer[3] = n >> 8; 

3) fwrite

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