从二进制文件读取char数组时出错

时间:2017-04-22 16:31:12

标签: c

这是一个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 功能后,我收到错误“变量'信息'周围的堆栈已损坏。”

1 个答案:

答案 0 :(得分:0)

fread要求第一个参数是你要开始阅读的第一个地址。 所以你需要写

S

您所写的内容会导致从

位置开始在堆栈中完成输入
fread(info, sizeof(char), len, f1);
存储

。由于它本身就是一个指针变量,它也会占用堆栈上的4个字节,这样就会发生fread操作。