【问题标题】:Using realloc() while reading file读取文件时使用 realloc()
【发布时间】:2016-03-02 11:21:16
【问题描述】:

我正在尝试使用 realloc 为我的数组分配更多内存,每次 while 循环读取一组数据时。

这是函数

void loadStats(Database *db){
  FILE *file = fopen("stats.txt", "r");
  int i = 0;
  while (fscanf(file,"%s %d/%d %d.%d %s - %s %d - %d %f", 
    &db[i].dayname, &db[i].day, &db[i].month, &db[i].hour, &db[i].minute,
    &db[i].hometeam, &db[i].awayteam, &db[i].homescore, &db[i].awayscore, &db[i].spectators) != EOF){
    db[i].spectators = db[i].spectators * 1000;
    i++;
    db = realloc(db, sizeof(db) + sizeof(Database));
  }
  fclose(file);
}

这是我要阅读的文件:stats.txt

#include <stdio.h>
#include <stdlib.h>

typedef struct{
  char dayname[3];
  int day;
  int month;
  int hour;
  int minute;
  char hometeam[3];
  char awayteam[3];
  int homescore;
  int awayscore;
  float spectators;
} Database;

void loadStats(Database *db);
void printStats(Database *db);

int main(){
  Database *db = malloc(sizeof(Database));
  loadStats(db);
  printStats(db);
  return 0;
}

void loadStats(Database *db){
  FILE *file = fopen("stats.txt", "r");
  int i = 0;
  while (fscanf(file,"%s %d/%d %d.%d %s - %s %d - %d %f", 
    &db[i].dayname, &db[i].day, &db[i].month, &db[i].hour, &db[i].minute,
    &db[i].hometeam, &db[i].awayteam, &db[i].homescore, &db[i].awayscore, &db[i].spectators) != EOF){
    db[i].spectators = db[i].spectators * 1000;
    i++;
    db = realloc(db, sizeof(db) + sizeof(Database));
  }
  fclose(file);
}

void printStats(Database *db){
    int i;
    printf("Enter array number.\n");
    scanf("%d", &i);
    printf("db[%d].dayname = %s\ndb[%d].day = %d\ndb[%d].month = %d\ndb[%d].hour = %d\ndb[%d].minute = %d\n"
           "db[%d].hometeam = %s\ndb[%d].awayteam = %s\ndb[%d].homescore = %d\ndb[%d].awayscore = %d\ndb[%d].spectators = %f\n\n", 
            i, db[i].dayname, i, db[i].day, i, db[i].month, i, db[i].hour, i, db[i].minute,
            i, db[i].hometeam, i, db[i].awayteam, i, db[i].homescore, i, db[i].awayscore, i, db[i].spectators);
}

编辑:问题是这会崩溃,我尝试过不使用 realloc 而是使用 malloc 分配固定数量,但如果数据增加它不会。所以我试图让代码适应读取的数据量。

【问题讨论】:

标签: c while-loop realloc


【解决方案1】:

首先,让我告诉你

 db = realloc(db, sizeof(db) + sizeof(Database));

是一种非常糟糕的编码方式,如果realloc() 失败,您最终也会丢失实际的指针。完成事情的更好方法是(伪代码)

Database * temp = NULL;
temp = realloc(db, sizeof(db) + sizeof(Database));
if (temp)
  db = temp;

也就是说,db 是一个指针,sizeof(db) 总是会给你指针的大小,而不是分配给它的内存量。在realloc() 中使用新大小时,您必须维护和更新一个单独的计数器来保存该大小。类似的东西

 realloc(db, counter * sizeof(Database));  //counter is updated after every allocation

应该为你做这项工作。

【讨论】:

  • 使用 (i + 1) 作为计数器,它可以工作。非常感谢您的帮助。
  • 如果使用 realloc() 的代码在发生故障时会简单地终止,我认为在这种情况下释放旧指针并不重要。实际上,在某些 C 实现中——尤其是在 Linux 下——分配似乎成功的事实并不能保证它们返回一个指向可用存储的指针,因此在分配失败后尝试继续没有多大意义。
猜你喜欢
  • 1970-01-01
  • 2012-02-16
  • 2016-12-26
  • 2018-09-25
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
相关资源
最近更新 更多