【问题标题】:Error reading char array from binary file从二进制文件中读取字符数组时出错
【发布时间】: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(&amp;info, ...) ==> fread(info, ...) 可能会修复堆栈损坏。 info 已经是指向内存的指针,千万不要尝试覆盖指针本身。
  • 注意你写的是指向文件的指针;您需要改为写入该数据。查找序列化。

标签: c


【解决方案1】:

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

fread(info, sizeof(char), len, f1);

您所写的内容会导致输入从堆栈中的位置开始完成

info

被存储。由于它本身就是一个指针变量,所以也会占用栈上的4个字节,fread操作就会发生在这里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多