Делал программу про склад магазина.Сделал функцию для чтения данных о складе из файла. Что не так?
Товар на складе представлен в виде структуры.В функции при чтении файла считывается название, количество и цена.И вот если с ценой и количеством все хорошо и они правильно сохраняются в своих ячейках,то с названием товара при выводе элемента структуры в другой функции неверно.В данном случае название товара под любым индексом одинаковое и равно последнему считанному названию товара.
Код функции чтения файла
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 шт):
Вы один раз выделили память для name и пишите в неё через strcpy, который всякий раз переписывает предыдущее значение. Исправить можно выделением памяти для каждого name отдельно. Лучше всего просто использовать std::string везде без C-строк.