Problemy z fstreamem

0

Hej,
tworzę program, który ma za zadnie operować dwoma plikami tekstowymi (jeden z angielskimi słówkami, a drugi z polskimi) i wykonywać następujące operacje:
1) Przegląd słówek
2) Dodawanie słówek
3) Usuwanie słówek
4) Generowanie i sprawdzanie testu.
Jednak pojawił się pewien problem przy usuwaniu słówek. Postanowiłem umieścić zawartość plików w dwóch wektorach, a następnie usunięcie wskazanego przez użytkownika elementu i wprowadzenie wektora z powrotem do pliku nadpisując poprzednie elementy. Jednak pojawia się błąd podczas ponownego umieszczania elementów w plikach. Oto mój kod odpowiedzialny za tą funkcję:

fstream polskie;
fstream angielskie;
vector<string> slavic;
vector<string> germanic;
vector<string> :: iterator s;
vector<string> :: iterator g;
void trzy()
{
  string a,b;
  polskie.open ("polskie.txt", fstream::in, fstream::out, fstream:: app);
  angielskie.open ("angielskie.txt",fstream::in, fstream::out, fstream:: app);
  while(polskie >> a && angielskie >> b)
  {
     slavic.push_back(a);
     germanic.push_back(b);
  }
  int i = 1, numerek;
  cout << "Ktory element chcesz usunac?:" << endl;
  for (s = slavic.begin(); s != slavic.end(); s++)
  {
     cout << i << ". " << slavic[i-1] << " "<< germanic[i-1] << endl;
     i++;
  }
  cout << endl;
  cin >> numerek;
  slavic.erase(slavic.begin() + numerek - 1);
  germanic.erase(germanic.begin() + numerek - 1);
  i = 1;
  for (s = slavic.begin(); s != slavic.end(); s++)
  {
     cout << i << ". " << slavic[i-1] << " "<< germanic[i-1] << endl;
     i++;
  }
  i=1;
  for (s = slavic.begin(); s != slavic.end(); s++)
  {
      polskie << slavic[i-1] << endl;
      i++;
  }
  polskie.close();
  i=1;
  for (g = germanic.begin(); g != germanic.end(); g++)
  {
      angielskie << germanic[i-1] << endl;
      i++;
  }
  angielskie.close();
  system("pause");
}

Dodatkowo: Czy ma ktoś pomysł jak usunąć zawartość pliku tekstowego?

2

Dużo problemów ma ten kod.

  1. zmienne globalne
  2. nazwa funkcji trzy, która nic nie mówi co to ma robić
  3. funkcja trzy jest zbyt chaotyczna i robi za dużo, powinieneś dzielić to na mniejsze funkcje
  4. dziwaczne pętle for, które niby używa iteratorów, ale tak naprawdę używają indeksów - używaj indeksów bo iteratorów zapewne nie rozumiesz.

Co znaczy Jednak pojawia się błąd podczas ponownego umieszczania elementów w plikach.? Crash, exception, plik jest pusty, plik ma za dużo danych.

2

Weź przepisz funkcję trzy (zmieniając jej nazwę), korzystając z takich mniejszych funkcji:

using LangWords = std::vector<std::string>;

LangWords loadLangWords(std::istream& input)
{
    LangWords result;

    std::string word;
    while (input >> word) result.push_back(word);
    // lub lepiej, bo niektóre słowa są dwu członowe:
    // while (std::getline(input, word)) result.push_back(word);
    return result;
}

LangWords loadLangWords(const std::string& fileName)
{
    std::ofstream f { fileName,  std::ios::trunc };
    return loadLangWords(f);
}

std::ostream& writeLangWords(std::ostream& out, const LangWords& words)
{
    for (const auto& word : words)
        out << word << '\n';

    return out;
}

bool writeLangWords(const std::string& fileName, const LangWords& words)
{
    std::ofstream f { fileName };
    if (!f) return false;
    return writeLangWords(f, words);
}

size_t printRespectivePairsWithIdex(std::ostream& out, const LangWords& a, const LangWords& b)
{
    auto n = std::min(a.size(), b.size());

    for (int i=0; i < n; ++i) {
        out << std::setw(3) << (i + 1) << '\t' << a[i] << << '\t'  b[i] << \'n';
    }
    return n;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0