【问题标题】:Segmentation fault when reading a binary file into a structure将二进制文件读入结构时出现分段错误
【发布时间】:2012-03-25 03:19:45
【问题描述】:

我在尝试用 C 读取二进制文件时遇到了一些问题。 这个问题我以前从来没有遇到过,我真的不知道如何处理它。

所以,有一个名为“hash_record”的结构,其中有很多以二进制模式存储在我的“HASH_FILE”文件中。这是结构:

typedef struct hash_record {
char *hash;
char *filename;
} hash_record;

我是这样写文件的:

hash_record hrec;
[...] code that fill the structure's fields [...]
FILE* hash_file = fopen(HASH_FILE, "ab");
fwrite(&hrec, sizeof(hash_record), 1, hash_file);
fclose(shared_file);

这只是一个总结,fwrite() 函数在一个循环中,因此我可以用许多 hash_record 填充文件。 然后,在那段代码之后,我立即开始读取文件并打印一些数据以确保一切顺利。这是代码:

int print_data() {
hash_record rec;

printf("Data:\n");
FILE* hash_file = fopen("hash.bin", "rb");
if (hash_file == NULL)
    return -1;
while(fread(&rec, sizeof(hash_record), 1, hash_file) == 1)
    printf("Filename: %s - Hash: %s", rec.filename, rec.hash);
fclose(hash_file);
return 0;
}

一切正常! 问题是,如果我在我的程序实例中编写二进制文件然后退出它,当我再次打开它时(注释写入文件的代码以便它只能读取它)它会给我一个分段错误。当我在 while() 循环中调用 printf() 时出现此错误。如果我只打印一个普通字符串而不调用“rec”,则不会给出错误,所以我假设在“rec”中存储数据有问题。

有什么想法吗?

谢谢!

【问题讨论】:

  • 你不能序列化一个char*,至少不是你想的那样。您需要正确地进行序列化,这超出了评论的范围。
  • 我猜fread 调用没有在rec 中存储任何内容,这就是 printf 失败的原因。使用调试器确保rec 不为空
  • 我们需要更多信息来帮助您。关于您正在编写的数据结构的一些细节。特别是,结构是否包含地址?如果是,则写程序中的地址与读程序无关;您必须重新建立地址。但是,您显示的内容并不能告诉我们问题所在。
  • 这是数据结构: typedef struct hash_record { char *hash;字符 * 文件名; } hash_record;

标签: c segmentation-fault


【解决方案1】:

你正在写出指针。当您从程序的同一个实例中读回它们时,数据在同一个地方并且指针是有意义的。如果您从另一个实例中读取它们,则指针是错误的。

【讨论】:

  • 我会去的。如果你想保存字符串,你必须自己将它们转储到文件中。
  • 谢谢!你是对的,问题出在结构本身。我使用指针来存储字符串,并且在将所有内容写入文件时都没有考虑过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多