使用 C 中的 fwrite() 将二进制文件写入文件

Kat*_*sto 0 c binary binaryfiles

我正在尝试将 4 个unsigned short int以十六进制表示的数字写入二进制文件。

除了我正在写的数字之外,我还不断收到很多垃圾,我不知道为什么。我假设在从unsigned short int二进制文件的转换过程中,有垃圾被写入我的文件中。

我写入二进制文件的函数是:

int write_file  (char* name, unsigned short int array[x] ){

    FILE *fptr;
    fptr = fopen(name, "wb");
    if(fptr==NULL)
    {
        fclose(fptr);
        return (0);
    }
    unsigned short int code = 0xABCD;
    const void *ptr = &code;
    fwrite(ptr, sizeof(ptr), 1, fptr);

    unsigned short int code2 = 0x0000;
    const void *ptr2 = &code2;
    fwrite(ptr2, sizeof(ptr2), 1, fptr);

    unsigned short int code3 = 0x0001;
    const void *ptr3 = &code3;
    fwrite(ptr3, sizeof(ptr3), 1, fptr);

    unsigned short int code4 = 0x1101;
    const void *ptr4 = &code4;
    fwrite(ptr4, sizeof(ptr4), 1, fptr);

    return (0);
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,二进制文件将被解释为:

ABCD 0000 0001 1101
Run Code Online (Sandbox Code Playgroud)

但我得到的是这个:

abcd f250 0190 0000 0000 eeb6 1915 7ffd
0001 eea6 1915 7ffd 1101 ee96 1915 7ffd
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 5

您将错误的字节大小传递给fwrite().

您正在传递每个变量的字节大小void*sizeof(void*)在 32 位构建中是 4 个字节,在 64 位构建中是 8 个字节(sizeof(void*)在您的情况下似乎返回 8)。您需要传递unsigned short int所指向的变量的字节大小(2 个字节)。

void*您根本不需要变量。并且不要忘记错误检查:

int write_obj_file  (char* filename, unsigned short int program_bin[ROWS] ){

    FILE *fptr = fopen(filename, "wb");
    if (fptr == NULL)
        return -1;

    unsigned short int code = 0xABCD;
    if (fwrite(&code, sizeof(code), 1, fptr) < 1) {
        fclose(fptr);
        return -1;
    }

    unsigned short int code2 = 0x0000;
    if (fwrite(&code2, sizeof(code2), 1, fptr) {
        fclose(fptr);
        return -1;
    }

    unsigned short int code3 = 0x0001;
    if (fwrite(&code3, sizeof(code3), 1, fptr) {
        fclose(fptr);
        return -1;
    }

    unsigned short int code4 = 0x1101;
    if (fwrite(&code4, sizeof(code4), 1, fptr) {
        fclose(fptr);
        return -1;
    }

    fclose(fptr);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)