在C中读取二进制文件导致seg错误

时间:2018-04-02 05:31:19

标签: c segmentation-fault binaryfiles

我可以写入二进制文件并在同一执行中读取它。但是如果我稍后执行程序只是为了从文件中读取,则会导致seg错误。 为了简单起见,我对所有内容进行了硬编码并省略了错误检查。

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

typedef struct Details {
     int num;
     char *name;
}details;

int writeData(char *, details *);
int readData(chhar *);
int main() {
        details *new;
        new = (details *)malloc(sizeof(new));
        new->num = 8;
        new->name = "Name";
        writeData("filename", new);
        readData("filename");      //no error on this instance
}

int writeData(char *name, details *new) {
        FILE *fp;
        fp = fopen(name, "wb+");
        fwrite(&new, sizeof(new), 1, fp);
        fclose(fp);
 }

 int readData(char *name) {
        details *new;
        FILE *fp;
        fp = fopen(name, "rb");
        fread(&new, sizeof(new),1,fp);
        printf("%d\n", new->num);
        printf("%s\n", new->name);
        fclose(fp);
 }

但如果我

 //writeData("filename", new);

再次编译并仅使用

运行
 readData("filename");

然后它导致seg错误。 我已经尝试了所有知识。我无法理解的是存在要读取的文件,无论我是否重新编译代码都无关紧要。

1 个答案:

答案 0 :(得分:4)

读取和编写指针是没用的。 read不会写一个指向对象,typedef struct Details { int num; char name[SOME_SIZE]; } details; 不会为你神奇地分配内存并读取指向的对象。

由于您要存储的类型包含指针,因此直接读取和写入也不会起作用。只有没有任何指针的结构才能安全地读写。

也就是说,如果您的结构是这样的

 fwrite(new, sizeof(*new), 1, fp);

 new = malloc(sizeof(*new));
 fread(new, sizeof(*new), 1, fp);

你可以像这样读写它

char*

但是interface GroupTask { void onProcessing(final CountDownLatch latch); } 成员意味着这个简单的方法会失败。

您需要为数据类型编写序列化反序列化函数,并使用它们来读取和写入该类型的对象。