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

Program działający na plikach.

0 głosów
244 wizyt
pytanie zadane 2 marca 2019 w C i C++ przez AdrianK Początkujący (320 p.)

Witam. Od paru ładnych godzin mam pewien problem z napisaniem funkcji, która dany ciąg znaków wczytanych z pliku, np: gewdaaadrrrrvvd, zamieni na: gewda|3dr|4v|2d, czyli w skrócie każde wielokrotne wystąpienie pewnego znaku np. aaaaa przerabia na wersję skrótową a|5. Myślałem żeby każdy znak wrzucać w tablice, następnie ja zwiększać i sprawdzać z poprzednim znakiem. Nie wiem czy dobrze próbowałem to zrobić, jeżeli jest ktoś w stanie mnie naprowadzić na odpowiedni tor, będę wdzięczny. Oto mój dotychczasowy kod: 

void konwersja(const string &Chaos, const string &Konwersja)
{
    ifstream plik;
    plik.open(Chaos.c_str());
    if(!plik.is_open())
        throw "Blad otwierania pliku!";
    ofstream plik2;
    plik2.open(Konwersja.c_str());
    if(!plik2.is_open())
    {
        plik.close();
        throw "Blad otwierania pliku do konwersji!";
    }
    if(plik.good()==true && plik2.good()==true)
    {
        while(!plik.eof())
        {
            char c=plik.get();
            plik2<<c;
        }
    }
    plik.close();
    plik2.close();
}
int main()
{
    ofstream("konwersja.txt");
    try
    {
        konwersja("chaos.txt","konwersja.txt");
    }catch(const char *wiadomosc)
    {
        cerr<<wiadomosc<<endl;
    }

    return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 2 marca 2019 przez Rzepek Bywalec (2,050 p.)
wybrane 2 marca 2019 przez AdrianK
 
Najlepsza

Zrób int'a przechowującego liczbę powtórzeń. Nazwijmy go "ile_pod_rząd". (Na początku niech ma wartość 1)

Przed:

char c=plik.get();
plik2<<c;

sprawdź czy c nie jest równe plik.get() (Czyli poprzedni znak następnemu znakowi, oczywiście nie licząc pierwszego razu gdzie nie ma poprzedniego znaku). Jeżeli jest, to zamiast dodawać znak do plik2, dodaj 1 do "ile_pod_rząd".

Jeżeli poprzedni znak nie będzie równy następnemu oraz "ile_pod_rząd" będzie większe od 1, to dopisz do pliku "|" + ile_pod_rząd, oraz ustaw ile_pod_rząd na 1.

komentarz 2 marca 2019 przez Rzepek Bywalec (2,050 p.)
void konwersja(const string &Chaos, const string &Konwersja)
{
	int ile_pod_rzad = 1;
	char c = ' ';
	char n = ' ';
	ifstream plik;
	plik.open(Chaos.c_str());
	if (!plik.is_open())
		throw "Blad otwierania pliku!";
	ofstream plik2;
	plik2.open(Konwersja.c_str());
	if (!plik2.is_open())
	{
		plik.close();
		throw "Blad otwierania pliku do konwersji!";
	}
	if (plik.good() == true && plik2.good() == true)
	{
		while (!plik.eof())
		{
			n = plik.get();

			if (c == n)
				ile_pod_rzad++;

			else
			{
				if (ile_pod_rzad > 1)
				{
					plik2 << '|' << ile_pod_rzad;
					ile_pod_rzad = 1;
					plik2 << n;
				}
				else
					plik2 << n;
			}

			c = n;
		}
	}
	plik.close();
	plik2.close();
}

 

komentarz 2 marca 2019 przez AdrianK Początkujący (320 p.)
Dzięki wielkie za pomoc :)

Podobne pytania

0 głosów
1 odpowiedź 1,863 wizyt
pytanie zadane 1 lutego 2019 w Python przez Byczek_ Bywalec (2,570 p.)
0 głosów
1 odpowiedź 1,387 wizyt
pytanie zadane 12 lutego 2021 w Bezpieczeństwo, hacking przez Niepokonana7999 Bywalec (2,310 p.)
0 głosów
1 odpowiedź 1,834 wizyt

93,771 zapytań

142,731 odpowiedzi

323,383 komentarzy

63,372 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...