【发布时间】: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