Попытка чтения байтов с использованием fread, но получение ошибки сегментации 11 - PullRequest
0 голосов
/ 08 мая 2019

Я записываю строку в виде байтов в файл, а затем хочу прочитать двоичный код обратно как строку, используя strtol.Я проверил двоичный файл, и он содержал двоичный файл с буквой, которую я включил, используя имя файла xxd -b.Однако, когда я пытаюсь прочитать его обратно и преобразовать в строку, возникает ошибка сегментации 11. Не уверен, что я делаю неправильно.

#include <stdio.h>
#include <stdlib.h>

int main() {

    FILE* fr = fopen("kot.bin", "wb+");
    size_t written = fwrite("n", 1, 1, fr);
    printf("written is: %zu\n", written);
    fclose(fr);

    FILE* fw = fopen("kot.bin", "rb");
    char * name;
    size_t red = 0;
    red = fread(name, 1, 1, fw);
    if (red==0) {
        printf("ur wrong\n");
    }
    printf("red: %zu\n", red);
    char c = (char) strtol(name, NULL, 2);
    printf("c: %c\n", c);

    return 0;
}

Я просто хочу сохранить один байт в буфере, используйтеstrtol, чтобы превратить его в персонажа и напечатать.

1 Ответ

2 голосов
/ 08 мая 2019

Во-первых, вы забыли выделить память для чтения байта. Я рекомендую:

name = (char*)malloc(1);

Во-вторых, использование strtol не имеет смысла. У вас есть байт, содержащий 'n'. Это не строка с нулевым символом в конце, поэтому я думаю, что вызов strtol приведет к неопределенному поведению. Но в любом случае 'n' не является цифрой, поэтому strtol вернет 0. Затем вы преобразуете long int 0 в char. Не смотря на это, я не знаю, какой символ (если есть) соответствует значению long int 0, но это точно не 'n'. Сделайте это так:

printf("c: %c\n", *name);
...