2011-02-27 111 views
5

目標: 用二進制數據打開文件,將整個文件讀入內存,更改文件的某些部分,將內存緩衝區寫入該文件,關閉該文件。利潤?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.有沒有辦法讓我以冗長的方式檢查緩衝區中的值?

總而言之,我只是想幫助您掌握整個概念,所以我可以自己解決這個問題。

謝謝!

編輯:刪除文件的循環。增加了一個打印整個緩衝區的函數。

回答

2

1)不可以。因爲您使用fread讀取整個文件,所以不需要在getFileBuffer中循環。您也不需要撥打fseek,因爲每次從文件中讀取時,都會自動在文件流中前進。我沒有調試過你的代碼,但是看起來你的循環完成後,緩衝區中的每個元素將包含相同的值,並且它將等於文件中最後一個字節。

注意:您爲fread指定的參數是向後的。第二個參數是您正在閱讀的類型的大小,應該是sizeof(char)。第三個參數應該是你想要讀取的字符數量,應該是fileSize。但是,您的代碼仍然有效,但它表示要在讀取fileSize字節長度爲1字節的對象時讀取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)我不明白你在問什麼。

+0

1.好的,我刪除了循環。我的意思是二進制列表中的第二個對象。例如,如果文件有2個值,則文件將以hexedit格式查看:「01 00 11 00」。我的意思是,我如何改變緩衝區中的第二個值(11 00)?好的,那麼只需傳入整個緩衝區呢?沒有轉換或任何字符?我只是想要一種顯示緩衝區的方法,以便檢查它是否正確。所以如果你有任何其他的方式比我在主要上面添加的功能。 – rzetterberg 2011-02-27 17:10:27

+0

感謝您爲我清理所有內容,但仍未給我一個完整的解決方案。非常感激 :) – rzetterberg 2011-02-27 17:34:10

相關問題