簡體   English   中英

用 C 對文件進行二進制讀取和寫入

[英]Binary Reading from and Writing to a File in C

我需要一些幫助,用 C 編寫程序以從文件讀取和向文件寫入二進制值。 對於這個程序,我不需要讀入文件的全部內容(2048 字節),只需要讀入前 30 個半字。

我確實知道如何編寫程序來為文本文件執行此操作,但我是二進制文件的新手。 我需要像文本文件一樣分配內存嗎? 使用緩沖區會有幫助嗎? 這些命令與 fprintf、sscanf 和其他語法內容相似還是不同?

這個例子應該有效

#define FILE "file path"
#define LEN 30
int main()
{
    int read;
    char *buffer;
    HANDLE hFile = CreateFile(FILE, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 
                              FILE_ATTRIBUTE_NORMAL, NULL);
    if(hFile == INVALID_HANDLE_VALUE){
        printf("[-] CreateFile() failed.\n");
        return 0;}
    buffer = (char*)malloc(LEN);
    ReadFile(hFile, buffer, LEN, &read, NULL);
}

您讀取沒有特殊標志的文件。 你提到你只需要前 30 個半字,這顯然是前 30 個字節。 ReadFile()nNumberOfBytesToRead參數,所以你只需要傳遞 30。如果你願意,你可以嘗試讀取 .exe 文件並打印你得到的內容。 它應該以 MZ 開頭,並且“該程序不能在 dos 模式下運行”(您需要讀取 30 多個字節才能看到所有內容)。 一些 NULL 字節不會讓您簡單地打印它,所以您應該嘗試這種方式

int PrintBuffer(char *buffer)
{
    int written;
    HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
    WriteFile(out, buffer, LEN, &written, NULL);
    CloseHandle(out);
}

編輯:沒有winapi的版本

#define PATH "file path"
#define LEN 30
#define HWORD 1
int main()
{
    int i = 0;
    char *buffer = (char*)malloc(LEN);
    FILE *f = fopen(PATH, "rb");

    if(!f) printf("[-] fopen() failed.\n");
    else printf("[+] fopen() succeeded.\n");

    if(fread(buffer, HWORD, LEN, f) != LEN) printf("[-] fread() failed.\n");
    else printf("[+] fread() succeeded.\n");

現在打印沒有 NULL 字節的數據過早地切斷輸出

    for(i = 0; i < LEN; i++) printf("%c", buffer[i]);
}

fread()從文件中讀取“元素”具有以下參數:
1. 接收讀取數據的緩沖區。
2. 每個元素的大小(以字節為單位)。 半字是一個字節,所以大小為 1。
3.要閱讀的元素數量。 在這種情況下 30. 4. 您用於fopen()的 FILE* 。

返回值是成功讀取的元素數量,應該是30個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM