Перезапись в файл С++
Пишу проект - добавление продуктов с консоли прямо в сsv файл.
Проблема - удаление продукта с файла.
Фрагмент кода с добавлением в файл:
void Keyboard::input()
{
outData.open("C:\\Users\\vadim_oyanwuw\\source\\repos\\Online-Store\\Online-
Store\\Products\\Keyboard.csv", ios::app);
++keyboardCounter;
cout << "Enter name company keyboard:\t";
cin >> nameCompany;
setNameCompany(nameCompany);
name_.push_back(nameCompany);
string line = "--------------------";
outData << line << endl;
outData << nameCompany << endl;
outData << line << endl;
cout << "Enter model keyboard:\t";
cin >> model;
setModelProduct(model);
model_.push_back(model);
outData << line << endl;
outData << model << endl;
outData << line << endl;
cout << "Enter date manufacture product:\t";
cin >> date;
setYearManufacture(date);
yearManufacture_.push_back(date);
outData << line << endl;
outData << date << endl;
outData << line << endl;
cout << "Enter type keyboard:\t";
cin >> typeKeyboard;
setTypeKeyboard(typeKeyboard);
typeKeyboard_.push_back(typeKeyboard);
outData << line << endl;
outData << typeKeyboard << endl;
outData << line << endl;
cout << "Enter color keyboard:\t";
cin >> colorKeyboard;
setColorKeyboard(colorKeyboard);
color_.push_back(colorKeyboard);
outData << line << endl;
outData << colorKeyboard << endl;
outData << line << endl;
cout << "Enter price keyboard:\t";
cin >> price;
setPriceKeyboard(price);
price_.push_back(price);
outData << line << endl;
outData << price << endl;
outData << line << endl;
cout << "~~~~~~~~~~~~~~~~~~~~~" << endl;
printKeyboard();
}
Фрагмент кода удаления:
void Keyboard::deleteProduct()
{
outData.open("C:\\Users\\vadim_oyanwuw\\source\\repos\\Online-Store\\Online-
Store\\Products\\Keyboard.csv", ios::app);
typeKeyboard_.pop_back();
outData << typeKeyboard << endl;
name_.pop_back();
outData << nameCompany << endl;
model_.pop_back();
yearManufacture_.pop_back();
outData << date << endl;
color_.pop_back();
outData << colorKeyboard << endl;
price_.pop_back();
outData << price << endl;
connect_.pop_back();
outData << connect << endl;
}
Вопрос,почему при вызове функции удаления, вылетает аборт(окно ошибки) Возможно у кого-то есть ещё какое-то решения, все никак не могу решить проблему..
Ответы (1 шт):
CSV - плохой формат, для того, чтобы хранить в нем обрабатываемые данные. Практически любое изменение данных влечет за собой необходимость переписывать хвост файла - вставили букву в слово - переписывайте, удалили букву - переписывайте.
В связи с этим, наиболее технологично отказаться от хранения данных в CSV. Для локальных данных есть SQLite, для расшаренных - другие СУБД. Они скрывают от разработчика черновую работу по хранению данных, более того, они дают разработчику кучу возможностей по поиску и организации данных, которые ему придется в противном случае делать самому (с риском наляпать ошибок).
Если же вы решили упорствовать (или над вами стоит отставший от технологий препод), проще всего сделать так - данные сидят в RAM, вы их туда один раз загружаете из CSV в свои структуры, потом редактируете как надо, потом пишете полностью новый файл, затирая старый.
Если же вам все равно хочется поковыряться с файлами (например, есть ограничение "хранить в памяти только обрабатываемую строку"), делаете так:
- создаете новый файл, например, приклеив к нему расширение .tmp
- перебираете старый файл в поисках удаляемой записи и копируете прочитанные записи в новый файл
- удаляемую запись пропускаете
- дальше можно просто закинуть в новый файл весь хвост старого без проверок.
- Закрываете оба файла
- Переименовываете старый файл, например, приклеив к нему расширение .bak (backup, резерваная копия)
- Переименовываете новый файл именем старого.