• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Usuwanie konkretnego fragmentu z pliku tekstowego

Object Storage Arubacloud
0 głosów
335 wizyt
pytanie zadane 13 maja 2017 w C i C++ przez Riddick Bywalec (2,600 p.)

Tworzę mini programik do edycji plików tekstowych w których są zapisane wszystkie frazy tekstowe do innego programu. Napotkałem się na pewien błąd logiczny którego nie potrafię rozgryźć.

Mam funkcję która zapisuje tekst do tablicy do podanego przeze mnie momentu. Ten moment to miejsce gdzie zgadzają się 3 wartości: #txt# znak że tu się zaczyna nowa fraza, kategoria oraz numer frazy. Jeśli funkcja napotka taką konfiguracje, sprawdza kolejne pojedyncze wyrazy aż napotka #end# czyli znak końca frazy. Później zapisuje resztę pliku. I tak mam zapisany cały plik z wyjątkiem frazy której nie chcę. Funkcja podmienia całą zawartość pliku na tą zapisaną.

void Del (string plik, string kategoria, string numer) {
	fstream file;
	string tekst;
	string tekst2;
	string tekst3;
	file.open(plik.c_str(), ios::in|ios::out|ios::binary);
	vector <string> kontener;
	if(!file.good()) {
		OptionA(80,'n',"Nie udalo sie usunac frazy","Ok");
	}
	while(!file.fail()) {
		file>>tekst;
		if(tekst=="#txt#") {
			file>>tekst2;
			if(tekst2==kategoria) {
				file>>tekst3;
				if(tekst3==numer) {
					string tekst4;
					do{
						file>>tekst4;
					}while(tekst4!="#end#");
					cout<<tekst4;
					system("pause");
					file>>tekst4;
					cout<<tekst4;
					system("pause");
				} else {
					kontener.push_back(tekst);
					kontener.push_back(tekst2);
					kontener.push_back(tekst3);
				}
			} else {
				kontener.push_back(tekst);
				kontener.push_back(tekst2);
			}
		} else {
			kontener.push_back(tekst);
		}
	}
	file.close();
	file.open(plik.c_str(), ios::trunc|ios::out|ios::binary);
	system("cls");
	for(int i=0;i<kontener.size();i++) {
		file<<kontener[i]<<" ";
	}
		system("pause");

	file.close();
	return;
}

Problem występuje w miejscu gdzie ma się zacząć zapisywanie tekstu po ominiętym fragmencie. W miejscu gdzie wszystko ma się zacząć od nowa wszystko się sypie funkcja przestaje działać jakby wpadła w niekończącą się pętle lub jeśli usuwam środkowy fragment zapisuje mi ostatnią frazę z pominiętego fragmentu czyli #end# co jest nie możliwe bo na początku pętli bierze kolejny wyraz...

Proszę o pomoc

1 odpowiedź

–1 głos
odpowiedź 13 maja 2017 przez WilmaOlcho Obywatel (1,740 p.)

Wydaje mi się że jedynym błędęm jest stosowanie ios::fail() w miejscu gdzie nadawałby się ios::eof()
iosy <<link
Czyli mógłbyś spróbować z  while (!file.eof())

1
komentarz 13 maja 2017 przez j23 Mędrzec (194,920 p.)

To już lepiej jak zrobi: while(file >> tekst) { ... }

komentarz 13 maja 2017 przez WilmaOlcho Obywatel (1,740 p.)
Wszak racja, na jedno wyjdzie
komentarz 20 maja 2017 przez Riddick Bywalec (2,600 p.)
Przeanalizowałem jeszcze raz tą pętle która faktycznie była źle zrobiona ale problemem nie był ios::fail tylko miejsce w którym aktualizuje się zmienna tekst. Zamiast na początku powinna się aktualizować na końcu ponieważ pierwszy warunek sprawdza fragment tekstu, który już był pominięty w pętli do while.

Podobne pytania

0 głosów
0 odpowiedzi 243 wizyt
pytanie zadane 25 kwietnia 2018 w C i C++ przez damianoom Nowicjusz (240 p.)
0 głosów
2 odpowiedzi 150 wizyt
pytanie zadane 25 kwietnia 2015 w C i C++ przez Marcin Szczodry Nowicjusz (210 p.)
0 głosów
1 odpowiedź 461 wizyt
pytanie zadane 11 października 2020 w C i C++ przez magda_19 Gaduła (3,080 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...