目標: 用二進制數據打開文件,將整個文件讀入內存,更改文件的某些部分,將內存緩衝區寫入該文件,關閉該文件。利潤?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