[英]C: read binary file to memory, alter buffer, write buffer to 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;
}
二進制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;
}
}
1.此代碼是否會正確生成第一步(讀取文件到內存)?
2.如果是,我如何更改,說緩沖區中的第二個對象的值為0F 00?
3.如何獲取緩沖區並將其寫回文件?
4.有沒有辦法讓我以冗長的方式檢查緩沖區中的值?
總而言之,我只想幫助掌握整個概念,以便我自己解決這個問題。
謝謝!
編輯:刪除了文件的循環。 添加了打印整個緩沖區的功能。
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)我不明白你在問什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.