Problem z usunięciem konkretnego wiersza

0

Witam,

Mam następujący problem. Muszę napisać program na programowanie polegający na tym, że ma on tworzyć bazy studentów, pracowników, grup przedmiotowych itp. Mam jeden problem, który uniemożliwia mi zakończeni i oddanie tego projektu. Potrzebuję funkcji , która usunie mi prowadzącego z grupy, czyli z pliku tekstowego usunie mi wiersz, który rozpoczyna się "Prowadzacy". Wymyśliłem coś takiego :

void kasuj_prowadzacego (string sciezka)
{
  fstream plik (sciezka.c_str(), ios::in|ios::out)
  string dane, a;
  while(!plik.eof() )
  {
    getline(plik, dane);
    a = dane.substr(0,10);
    if (a != "Prowadzacy")
      plik >> dane;
  }
  plik.close();
}

Chciałem zrobić tak, że będę pobierał dane z pliku wierszami, następnie będę tworzył stringa, który będzie zawierał tylko początek pobranego wiersza i jeśli on jest różny od "Prowadzacy" to zapisuje ten wiersz do pliku o tej samej nazwie, jeśli byłby taki sam to wiersz nie zostałby zapisany ponownie do tego pliku. Chcąc zobaczyć, w którym momencie mi się coś psuje zamieniłem linijkę "plik >> dane;" na "cout << dane << endl;" i program wtedy wywala się kiedy próbuje wczytać pusty wiersz. Plik , który wczytuję wygląda tak:

Przedmiot: PP
Identyfikator: 1CL


Prowadzacy: Jan Kowalski

Student: Jerzy Kowalski

Przy trzeciej linijce wywala błąd i program się zamyka. Mógłby mi ktoś pomóc? Tylko ta funkcja brakuje mi do ukończenia projektu :/ Z góry bardzo dziękuję za pomoc ;)

0

A jak chcesz zrobić substring 0-10 na ciągu który jest pusty? Musisz dodać warunek sprawdzający pod getline - jeżeli linia jest pusta to od razu przechodzisz do kolejnej iteracji (wykorzystując if lub continue).

PS. Mógłbyś na przyszłość podać jaki to komunikat błędu.

0

Ok , o tym nie pomyślałem, ale plik nadal nie ulega zmianie : / Mam teraz coś takiego:

void kasuj_prowadzacego (string sciezka)
{
  fstream plik (sciezka.c_str(), ios::in|ios::out);
  string dane, a;
  while(!plik.eof() )
  {
    getline(plik, dane);
    if (dane.size() > 10)
    {
        a = dane.substr(0,10);
        if (a != "Prowadzacy")
            plik << dane << endl;
    }

  }
  plik.close();
}

I nadal pozostaje w pliku ta linijka :/ To już jest drugie forum , na którym proszę o pomoc :/ Zauważyłem, że miałem ">>" zamiast "<<". Gdy wywołam w programie funkcję to program mi się zacina i ciągle miga kreseczka, nic się nie dzieje :/

0

To nie zapisuj do tego samego pliku - tu pewnie jest problem. Zapisz do nowego a później ewentualnie zmień nazwę jeżeli jest taka konieczność.

0

Dziękuję mistrzu za pomoc :) Działa. Chciałem oszczędzić tworzenia pomocniczego pliku , ale zostałem do tego zmuszony :P Jakby ktoś kiedyś potrzebował to wrzucam kod:

void kasuj_prowadzacego (string sciezka)
{
  rename(sciezka.c_str(), "test.txt");
  ifstream tplik("test.txt");
  ofstream aplik (sciezka.c_str());
  string dane, a;
  while(!tplik.eof() )
  {
    getline(tplik, dane);
    if (dane.size() > 10)
    {
        a = dane.substr(0,10);
        if (a != "Prowadzacy")
            aplik << dane << endl;
    }

  }
  aplik.close();
  tplik.close();
  remove("test.txt");
}

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