Массив не заполняется для основной программы - C (СИ)
Формулировка задачи:
Здравствуйте!
Возникла такая проблема:
есть динамический массив структур
есть функция, которая добавляет в массив структуру, заполняет ее и возвращает количество структур в массиве
Проблема в том, что массив не заполняется для основной программы (тот же самый кусок заполнения из функции в основной программе прекрасно работает)
Подскажите, пожалуйста, что у меня не так с объевляением
Product *database = NULL;
int isGetProduct(Product *database, int countProducts, char *line)
Решение задачи: «Массив не заполняется для основной программы»
textual
Листинг программы
#define MAXLEN 255//с проверкой ввода #define SEPARATOR '\t' #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct AA { int id, price, count; char name[MAXLEN]; }Product; void isGetVal(char *line, char *strVal, int *i) { int j = 0; while((line[*i] != SEPARATOR) && (*i < strlen(line)) && line[*i] != '\n') { strVal[j] = line[(*i)++]; j++; } strVal[j] = '\0'; (*i)++; } Product *isGetProduct(Product *database, int *countProducts, char *line) { int i = 0, j = 0; char strId[MAXLEN]; char strName[MAXLEN]; char strPrice[MAXLEN]; char strCount[MAXLEN]; database = realloc(database, (*countProducts + 1) * sizeof(Product)); isGetVal(line, strId, &i); isGetVal(line, strName, &i); isGetVal(line, strPrice, &i); isGetVal(line, strCount, &i); database[*countProducts].id = atoi(strId); strcpy(database[*countProducts].name, strName); database[*countProducts].price = atoi(strPrice); database[*countProducts].count = atoi(strCount); //printf("%d\n", database[0].price); (*countProducts)++; return database; } void printDB(Product *database, int countProducts) { int i; for(i = 0; i < countProducts; i++) { printf("%d %s %d %d\n", database[i].id, database[i].name, database[i].price, database[i].count); } } int main() { Product *database = NULL; FILE *dbFile; char line[MAXLEN]; int countProducts = 0; dbFile = fopen("database.txt", "rt"); while(!feof(dbFile)) { fgets(line, MAXLEN - 1, dbFile); database = isGetProduct(database, &countProducts, line); } printDB(database, countProducts); /*database = (Product*)realloc(database, (countProducts + 1) * sizeof(Product)); database[countProducts].id = 1; strcpy(database[countProducts].name, "test1"); database[countProducts].price = 2; database[countProducts].count = 3; countProducts++; database = (Product*)realloc(database, (countProducts + 1) * sizeof(Product)); database[countProducts].id = 4; strcpy(database[countProducts].name, "test2"); database[countProducts].price = 5; database[countProducts].count = 6; printf("%d\n", database[1].price); printDB(database, countProducts); free(database); getchar();*/ fclose(dbFile); free(database); system("pause"); return 0; }
Объяснение кода листинга программы
- В этом коде используется структура
Product
, которая содержит поляid
,price
,count
и массив символовname
для хранения информации о товарах. - Функция
isGetProduct
считывает строку из файла и преобразует ее в числовые значения для полейid
,price
иcount
структурыProduct
. - Функция
printDB
выводит информацию о товарах из структурыdatabase
в консоль. - В функции
main
открывается файлdatabase.txt
для чтения и создается пустой массивdatabase
для хранения товаров. - Затем происходит чтение каждой строки из файла и добавление товара в массив
database
с помощью функцииisGetProduct
. - После чтения всех строк из файла, выводится информация о всех товарах в консоль с помощью функции
printDB
. - В конце программы происходит освобождение памяти, выделенной под массив
database
, и закрытие консоли.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д