【问题标题】:Trying to read bytes using fread but getting Segmentation Fault 11尝试使用 fread 读取字节但出现分段错误 11
【发布时间】:2019-05-08 03:42:34
【问题描述】:

我正在将字符串作为字节写入文件,然后想使用 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 将其变成一个字符并打印出来。

【问题讨论】:

  • 欢迎来到 Stack Overflow。您忽略了分配内存来读取字节。我推荐name = (char*)malloc(1);
  • @Beta,这将是一个绝妙的答案。
  • 哦,伙计。感谢那。我认为我使用 strtol 有问题,我以前从未真正使用过它。虽然分段错误现在消失了,但当我尝试打印 c 时,它似乎是空的。关于为什么会这样的任何想法?

标签: c file byte


【解决方案1】:

首先,您忽略了分配内存来读取字节。我推荐:

name = (char*)malloc(1);

其次,您对strtol 的使用毫无意义。您有一个包含“n”的字节。这 not 是一个以 null 结尾的字符串,所以我认为在其上调用 strtol 会导致未定义的行为。但无论如何,'n' 不是数字,所以strtol 将返回 0。然后您将long int 0 转换为char。如果不查找,我不知道哪个字符(如果有)对应于long int 值 0,但它肯定不是“n”。这样做:

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

【讨论】:

  • 谢谢。我的印象是我必须使用 strtol 将 name 的内容转换为使用 strtol 的字符串。我不知道我可以简单地把它当作一个角色来读。谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
  • 2022-01-14
  • 1970-01-01
  • 2020-06-20
  • 2013-10-20
相关资源
最近更新 更多