目标: 用二进制数据打开文件,将整个文件读入内存,更改文件的某些部分,将内存缓冲区写入该文件,关闭该文件。利润?C:读取二进制文件到内存,更改缓冲区,写入缓冲区到文件
问题: 我刚开始学习C和我无法找到有关如何更改为二进制数据存储在存储器缓冲区足够的信息。来自web开发者背景(php,python,as3)对我来说这是一个新领域。
上下文: 我有一个函数,它将文件的路径和指针地址指向char指针内存缓冲区。然后它打开文件,遍历文件并将数据写入内存缓冲区。最后关闭文件。
二进制文件的目的是为某些对象保存category-ids,它们的位置是它们自己的id。 category-ids表示为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;
}
二进制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;
}
}
将这个代码产生的第一步(正在读取文件到内存)?
2.如果是,我该如何改变,比如缓冲区中的第二个对象的值为0F 00?
3.如何获取缓冲区并将其写回文件?
4.有没有办法让我以冗长的方式检查缓冲区中的值?
总而言之,我只是想帮助您掌握整个概念,所以我可以自己解决这个问题。
谢谢!
编辑:删除文件的循环。增加了一个打印整个缓冲区的函数。
1.好的,我删除了循环。我的意思是二进制列表中的第二个对象。例如,如果文件有2个值,则文件将以hexedit格式查看:“01 00 11 00”。我的意思是,我如何改变缓冲区中的第二个值(11 00)?好的,那么只需传入整个缓冲区呢?没有转换或任何字符?我只是想要一种显示缓冲区的方法,以便检查它是否正确。所以如果你有任何其他的方式比我在主要上面添加的功能。 – rzetterberg 2011-02-27 17:10:27
感谢您为我清理所有内容,但仍未给我一个完整的解决方案。非常感激 :) – rzetterberg 2011-02-27 17:34:10