【问题标题】:Dynamic array of structures in dynamic array of structure in CC中结构的动态数组中的结构的动态数组
【发布时间】:2017-02-08 13:00:41
【问题描述】:

我需要分配未知数量的用户数组,并且每个用户必须有未知数量的选择数组。所有数据均从 CSV 文件中读取。

到目前为止,我有:

typedef struct wybor            //struct choice
{
    char rozmiar_kawy[2];
    char czy_z_mlekiem[4];
    char ile_cukru[2];
    char godzina[20];
}wybor;

typedef struct user
{
    char id[5];
    char imie[20];
    wybor *tablica_wyborow;     //dynamic array of struct choice
}user;


void odczyt_z_pliku(user **tab, int n);     //reading from file csv
void godzina(user *kawa);               //doesnt matter :p

int main() 
{
    int licznik = 0;            //counter for number of users
    user *tablica_userow;       //dynamic array of struct users
    tablica_userow = NULL;
    setlocale(LC_ALL, "pl_PL");

    odczyt_z_pliku(&tablica_userow, licznik);

    getchar();
    printf("%s", tablica_userow[0].tablica_wyborow[2].rozmiar_kawy);        //check if it works
    getchar();
    return 0;
}

void odczyt_z_pliku(user **tab, int n)
{

    int i = 0;
    (*tab) = malloc(1*sizeof(*(*tab)));
    tab[n]->tablica_wyborow = malloc(1*sizeof(*(tab[n]->tablica_wyborow)));
    FILE *plik;
    plik = fopen("users.csv", "a+");

        //start reading from file and its working until...
        fscanf(plik, "%[^;] ; %[^;] ; %[^;] ; %[^;] ; %[^;] ; %s\n", tab[n]->id, tab[n]->imie, tab[n]->tablica_wyborow[i].rozmiar_kawy, tab[n]->tablica_wyborow[i].czy_z_mlekiem, tab[n]->tablica_wyborow[i].ile_cukru, tab[n]->tablica_wyborow[i].godzina);
        i++;

        tab[n]->tablica_wyborow = realloc(tab[n]->tablica_wyborow,(i+1)*sizeof(*(tab[n]->tablica_wyborow)));

        fscanf(plik, "%[^;] ; %[^;] ; %[^;] ; %[^;] ; %[^;] ; %s\n", tab[n]->id, tab[n]->imie, tab[n]->tablica_wyborow[i].rozmiar_kawy, tab[n]->tablica_wyborow[i].czy_z_mlekiem, tab[n]->tablica_wyborow[i].ile_cukru, tab[n]->tablica_wyborow[i].godzina);

        i = 0;
        n++;
        *tab = realloc(*tab,(n+1)*sizeof(user)); //...now, here there is a memory writing location error

        tab[n]->tablica_wyborow = malloc(sizeof(*tab[n]->tablica_wyborow));

        fscanf(plik, "%[^;] ; %[^;] ; %[^;] ; %[^;] ; %[^;] ; %s\n", tab[n]->id, tab[n]->imie, tab[n]->tablica_wyborow[i].rozmiar_kawy, tab[n]->tablica_wyborow[i].czy_z_mlekiem, tab[n]->tablica_wyborow[i].ile_cukru, tab[n]->tablica_wyborow[i].godzina);
        i++;
        tab[n]->tablica_wyborow = realloc(tab[n]->tablica_wyborow, (i + 1) * sizeof(*(tab[n]->tablica_wyborow)));

        fscanf(plik, "%[^;] ; %[^;] ; %[^;] ; %[^;] ; %[^;] ; %s\n", tab[n]->id, tab[n]->imie, tab[n]->tablica_wyborow[i].rozmiar_kawy, tab[n]->tablica_wyborow[i].czy_z_mlekiem, tab[n]->tablica_wyborow[i].ile_cukru, tab[n]->tablica_wyborow[i].godzina);

    fclose(plik);

}

我不知道为什么我不能正确重新分配用户数组。

我没有释放内存,因为我尝试时它崩溃了。

【问题讨论】:

  • odczyt_z_pliku 你有tab[n] 这是错误的。应该是(*tab)[n]。然后(*tab)[n] 不是一个指针而是一个实际的结构实例,所以你不应该使用-> 来访问它的元素。
  • 为什么你有四个相同的fscanf 电话?如果文件中有更多数据怎么办?或更少?循环呢?
  • wybor * 是一个指针,而不是一个数组。但它可以指向数组的第一个元素。
  • @Someprogrammerdude 我有四个 fscanf 只是为了测试,当然会有一个循环。我会检查你的解决方案,谢谢!
  • @Someprogrammerdude 它有效!非常感谢您的帮助:)

标签: c arrays csv struct realloc


【解决方案1】:

您可以使用链表来读取数据。用户数据结构有一个指向用户选择的链表的指针。

如果您仍然想使用数组,您现在可以计算用户数,为其分配一个数组并用用户填充它。以同样的方式,您可以计算用户的选择数量并为其分配一个数组,然后填充它。

您的链表应该有一个 void * 成员,该成员将为用户存储指向单独数据结构的指针,因此您只需将用户数据结构的指针从链表移动到您的数组。

用户数据结构有一个成员wybor *tablica_wyborow; 供用户选择。您可以维护一个链表,在读取数据时保存用户选择,然后,一旦读取了用户的所有选择,您就可以对它们进行计数并为其分配一个数组并复制选择数据(按值或指针)进入它。

一切都完成后,解除分配不再需要的链表。

或者,您可以读取文件进行计数,然后重新处理它。但这会给计算单个用户的选择带来问题。

【讨论】:

  • 是的,我今天早上才想到。我正在写一个计数函数,等待你的帮助:D
猜你喜欢
  • 2012-10-11
  • 1970-01-01
  • 2020-04-14
  • 2017-03-13
  • 2013-11-08
  • 2020-11-09
  • 2014-01-16
  • 1970-01-01
  • 2014-08-22
相关资源
最近更新 更多