Przekazywanie między plikami tekstowymi

0

Witam serdecznie.
Dopiero zaczynam swoją przygodę z c++, do czego zmusiły mnie studia i muszę wykonać na przyszły tydzień parę programów.

Pierwszy z nich to : Napisz program który sczytuje linie z klawiatury i zapisuje je do pliku "a.txt". Następnie z tego pliku "a.txt" przepisuje do pliku "b.txt" te linie które mają co najmniej pięć znaków "a".

#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;


int main()
{

    fstream f;
    fstream g;
    string s;
    char a;

    f.open ("a.txt", fstream :: out | fstream :: in | fstream :: app);

    if (!f.good())
    {
        cout << "BLAD" << endl;
    }

    cout << "Zapisz cos do pliku"<<endl;

    cin >> s;
    cin.ignore();

    f<<s<<endl;
    f.close();

    string wiersz;
    a=a;


    f.open ("a.txt", fstream :: out | fstream :: in);

    int licznik=0;


    while (!f.eof())
    {
        getline (f, wiersz);
        for (int i=0; i<wiersz.length(); i++ )
        {
            if (wiersz[i]==a)
            {
                licznik++;
            }
        }
        if (licznik >= 4)
        {
            g.open ("b.txt", fstream :: in | fstream :: app);
            g << wiersz << endl;
        }
    }

    return 0;
}

Napisałem coś takiego jednak jak się domyślacie nie działa ... kompiluje się, zapisuje się do pliku a.txt, ale gdy ma wybrać te wyrazy z czterema literami a i je przekazać to nie wykonuje tego co powinien

1

nie zamknąłeś pliku g, nie zerujesz licznika po wczytaniu linii. otwieranie pliku (g) w pętli to beznadziejny pomysł. mam wrażenie, że nie masz pojęcia do czego służą flagi:
fstream :: app, fstream :: out, fstream :: in
doczytaj: http://www.cplusplus.com/reference/iostream/fstream/fstream/

spróbuj tak:

#include <iostream>
#include <fstream>

using namespace std;

int zlicz(const string& s, char c)
{
  int ret = 0;
  for (int i=0; i<s.size(); i++)
    {
      if (s[i]==c)
        ret++;
    }
  return ret;
}

int main()
{
  // plik a.txt mozna odczytac, zapisywac do niego i na poczatku jest czyszczony
  fstream f("a.txt", fstream::in | fstream::out | fstream::trunc);
  if (!f.good())
    {
      cout << "Nie mozna otworzyc pliku a.txt!" << endl;
      return 0;
    }

  string line;
  cout << "Wprowadz kolejne linie. Po wprowadzeniu ostatniej linii nacisnij CTR-Z i zatwierdz enterem." << endl;
  while (getline(cin,line))
    {
      f << line << "\n";
    }

  // do tego pliku mozna tylko zapisywac, zauwaz ze uzylem ofstream zamiast fstream
  ofstream g("b.txt");
  if (!g.good())
    {
      f.close();
      cout << "Nie mozna otworzyc pliku b.txt!" << endl;
      return 0;
    }
  // flush spowoduje ze bufor do ktorego wpisywales zapisze fizycznie sie na dysku (mozna usunac ta linie)
  f.flush();
  // przewiniecie do poczatku pliku, czyli odczyt tego co dopiero co zapisales zamiast otwierac na nowo
  f.seekg(ios_base::beg);
  
  while (getline(f,line))
    {
      if (zlicz(line,'a')>=5)
        g << line << "\n";
    }
  
  f.close();
  g.close();
  return 0;
}

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