【发布时间】: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