Перезапись в файл С++

Пишу проект - добавление продуктов с консоли прямо в с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 шт):

Автор решения: gbg
  1. CSV - плохой формат, для того, чтобы хранить в нем обрабатываемые данные. Практически любое изменение данных влечет за собой необходимость переписывать хвост файла - вставили букву в слово - переписывайте, удалили букву - переписывайте.

  2. В связи с этим, наиболее технологично отказаться от хранения данных в CSV. Для локальных данных есть SQLite, для расшаренных - другие СУБД. Они скрывают от разработчика черновую работу по хранению данных, более того, они дают разработчику кучу возможностей по поиску и организации данных, которые ему придется в противном случае делать самому (с риском наляпать ошибок).

  3. Если же вы решили упорствовать (или над вами стоит отставший от технологий препод), проще всего сделать так - данные сидят в RAM, вы их туда один раз загружаете из CSV в свои структуры, потом редактируете как надо, потом пишете полностью новый файл, затирая старый.

  4. Если же вам все равно хочется поковыряться с файлами (например, есть ограничение "хранить в памяти только обрабатываемую строку"), делаете так:

  • создаете новый файл, например, приклеив к нему расширение .tmp
  • перебираете старый файл в поисках удаляемой записи и копируете прочитанные записи в новый файл
  • удаляемую запись пропускаете
  • дальше можно просто закинуть в новый файл весь хвост старого без проверок.
  • Закрываете оба файла
  • Переименовываете старый файл, например, приклеив к нему расширение .bak (backup, резерваная копия)
  • Переименовываете новый файл именем старого.
→ Ссылка