这是一个simpe程序,它将struct存储到二进制文件
中其中的结构和项目
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;
}
如果我在调试器中尝试查看info变量时从文件中读取它,我会收到一条消息“读取字符串字符的错误”。退出 ReadFromFile 功能后,我收到错误“变量'信息'周围的堆栈已损坏。”
答案 0 :(得分:0)
fread要求第一个参数是你要开始阅读的第一个地址。 所以你需要写
S
您所写的内容会导致从
位置开始在堆栈中完成输入fread(info, sizeof(char), len, f1);
存储。由于它本身就是一个指针变量,它也会占用堆栈上的4个字节,这样就会发生fread操作。