запись двоичного файла в файл с использованием unsigned short в C с помощью fwrite () - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь записать 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);
}

В идеале двоичный файл будет интерпретироваться как:

ABCD 0000 0001 1101

Но я получаю это вместо:

abcd f250 0190 0000 0000 eeb6 1915 7ffd
0001 eea6 1915 7ffd 1101 ee96 1915 7ffd

1 Ответ

4 голосов
/ 15 апреля 2020

Вы передаете неправильный размер байта fwrite().

Вы передаете размер байта каждой переменной void*. sizeof(void*) - это 4 байта в 32-битной сборке и 8 байтов в 64-битной сборке (в вашем случае 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)
    {
        fclose(fptr);
        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;
}
...