我可以写入二进制文件并在同一执行中读取它。但是如果我稍后执行程序只是为了从文件中读取,则会导致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错误。 我已经尝试了所有知识。我无法理解的是存在要读取的文件,无论我是否重新编译代码都无关紧要。
答案 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);
}
成员意味着这个简单的方法会失败。
您需要为数据类型编写序列化和反序列化函数,并使用它们来读取和写入该类型的对象。