【发布时间】:2017-04-22 16:31:11
【问题描述】:
这是一个简单的程序,将结构存储到二进制文件中
其中的结构和项
typedef struct Item
{
int busy; //item is busy
int key; //item key
int len; // len of info in item
int release; //item release (version of item)
char *info; //info (char array)
}Item;
typedef struct Table
{
Item* items[MAX];
int size = MAX;
}Table;
这是实现文件读写功能的代码
// Write table to file
void WriteToFile(const char *filename, Table* table)
{
FILE *fl;
Item *p;
fl = fopen(filename, "w+b");
fwrite(&(table->size), sizeof(int), 1, fl);
for (int i = 0; i < table->size; i++)
{
p = table->items[i];
if (p->busy != 0) //Write only elements with busy != 0
{
fwrite(&(p->key), sizeof(int), 1, fl);
fwrite(&(p->release), sizeof(int), 1, fl);
fwrite(&(p->len), sizeof(int), 1, fl);
fwrite(&(p->info), sizeof(char), p->len, fl); //p->len contains strlen(info)
}
}
fclose(fl);
}
// Read table from binary file
int ReadFromFile(const char *filename, Table* table)
{
FILE *fl;
char *info;
int key = NULL;
int release = NULL, len;
fl = fopen(filename, "r+b");
if (fread(&table->size, sizeof(int), 1, fl) != 1) return 0;
while (!feof(fl))
{
if (fread(&key, sizeof(int), 1, fl) != 1) return 1;
if (fread(&release, sizeof(int), 1, fl) != 1) return 0;
if (fread(&len, sizeof(int), 1, fl) != 1) return 0;
info = (char *)malloc(len);
if (fread(&info, sizeof(char), len, fl) != len) return 0;
//Code that inserts item to table
}
fclose(fl);
return 1;
}
如果我在从文件中读取信息变量时尝试在调试器下查看信息变量,则会收到一条消息“读取字符串字符时出错”。从 ReadFromFile 函数退出时,我收到一个错误 “围绕变量 'info' 的堆栈已损坏。”
【问题讨论】:
-
fread(&info, ...)==>fread(info, ...)可能会修复堆栈损坏。info已经是指向内存的指针,千万不要尝试覆盖指针本身。 -
注意你写的是指向文件的指针;您需要改为写入该数据。查找序列化。
标签: c