pretty code

2022年2月28日 星期一

反樸歸真的 fread and fwrite

最近有位同事要離職,為了讓同事好好交接,決定把他未完成的工作接下來做。

雖然平常開會都會討論個人進度,但因為自己不是負責的人,故也不知道原本是如何實作的?

現在變成自己要做,還是先來研究一下,有沒有什麼簡單又可以加速開發的方式?

看了一下他之前的 Code,原來 UEFI Shell 中間過程的傳遞也是一個 C struct 的變數,只是再設計成另外一種格式轉成文字檔,然後由 Windows 的另一個 Tool 來接手 parsing。

看到這裡我就覺得有點阿雜,感覺一直在訂 Spec 寫 Parser,我們似乎可以省略這個過程?反正原本的格式雖然是字串,但不參照 Spec,其實人也無法一眼看出那些數值的真實意義。

接著我直覺想到的就是使用 C struct 並搭配 fread and fwrite 函數,直接把資料存成 binary 檔案,反正現在常用的程式語言,都有 Binding C language 的能力,像我喜歡的 Go 就可以使用 cgo 的方式來使用 C Code!

剛才測試了一下,指定 struct alignment 的語法,VC and GCC 看起來都通用,最困難的點已經不是問題了,剩下的就是開發時 Debug 的問題了。


#include <stdio.h>

#pragma pack(push, 1)
struct Arg {
    int id;
    char name[3];
    int command;
};
#pragma pack(pop)

int main(void)
{
    struct Arg arg = {1, "AA", 2};

#if 1
    FILE *f = fopen("struct.bin", "ab");
    if (f) {
        fwrite(&arg, 1, sizeof(arg), f);
        fclose(f);
    }
#else
    FILE *f = fopen("struct.bin", "rb");
    if (f) {
        fread(&arg, 1, sizeof(arg), f);
        fclose(f);

        printf("%d, %s, %d \n", arg.id, arg.name, arg.command);
    }
#endif

    return 0;
}

沒有留言: