Делал программу про склад магазина.Сделал функцию для чтения данных о складе из файла. Что не так?

Товар на складе представлен в виде структуры.В функции при чтении файла считывается название, количество и цена.И вот если с ценой и количеством все хорошо и они правильно сохраняются в своих ячейках,то с названием товара при выводе элемента структуры в другой функции неверно.В данном случае название товара под любым индексом одинаковое и равно последнему считанному названию товара.

Код функции чтения файла

void file_read(product* storage, int& cur_size)
{
    int count;
    float price;
    string str;
    char* name;
    name = new char[str_size];
    ifstream fin;
    fin.open("storage.txt");
    if (!fin.is_open())
    {
        cout << "ошибка открытия файла";
    }

    while (fin >> str>>count>>price)
    {   
        strcpy(name, str.c_str());
        //cout << name<<endl;
        storage[cur_size].name = name;
        //cout << storage[cur_size].name<<cur_size<<endl;
        storage[cur_size].count = count;
        storage[cur_size].price = price;
        cur_size++;
    }

    fin.close();


    return;
}
  

Код функции вывода информации о товаре

void show(product* storage, int cur_size)
{

    if (cur_size == 0)
        cout << "Склад пуст" << endl;
    else {
        cout << "\t" << "Информация о товарах на складе" << endl;
        cout << "-------------------------------------------------" << endl;
        cout << "Название" << "        " << "Количество" << "        " << "Цена" << endl;
        for (int i = 0; i < cur_size; i++)
        {
            int key = (20 - strlen(storage[i].name));
            cout << storage[i].name<<i;
            for (int j = 0; j < key; j++)
                cout << " ";
            cout << storage[i].count << "              " << storage[i].price << endl;
        }
    }return;
}

Здесь во второй функции все storage[i].name одинаковы и выводят последнее из имевшихся на складе товаров.Почему так и как чтобы корректно работало сделать?


Ответы (1 шт):

Автор решения: karmik

Вы один раз выделили память для name и пишите в неё через strcpy, который всякий раз переписывает предыдущее значение. Исправить можно выделением памяти для каждого name отдельно. Лучше всего просто использовать std::string везде без C-строк.

→ Ссылка