logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

C++: Jak zsumować identyczne wiersze z pliku tekstowego?

eljann 11 Paź 2011 21:08 2197 6
REKLAMA
  • #1 10017158
    eljann
    Poziom 9  
    Posty: 24
    Witam forumowiczów
    Ostatnio zacząłem sie znowu interesować C++. Postanowiłem napisać łatwy programik który wczytuje tekst z pliku txt. Następnie sumuje takie same wiersze (tzn. gdy występi na przykład 5 wierszy o treści "yyy" to zsumuje je do jednego wiersza i postawi koło niego 5 itp.). A następnie zapisze wynik do innego pliku tekstowego. Z wczytywaniem i zapisywaniem pliku tekstowego nie mam problemu. Nie umiem natomiast stworzyć pętli/wyrażenia warunkowego która bedzie porównywała i sumowała identyczne wiersze. Dobrzy forumowicze czy wiecie może od "której strony można ugryźć ten problem" ?

    Pozdrawiam
  • REKLAMA
  • #2 10017420
    blue_17
    Poziom 32  
    Posty: 2414
    Pomógł: 172
    Ocena: 471
    Niestety nie znam C ale myślę że innych językach programowania jest podobnie

    Wczytaj zawartość linii ładuj ją do zmiennej
    potem w drugą zmienną wczytuj po kolei następne wiersze
    Zastosuj licznik w pętli który będzie się inkrementował jak znajdzie taki sam wyraz (najlepiej dodatkowa zmienna)

    Na końcu pętli zapisuj "wzorcową" zmienną do pliku i doklej do niej wartość licznika tzn ilość wystąpień.

    Na końcu zadbaj żebyś jakoś zliczył ilość linijek w pliku żebyś wiedział ile razy wykonać pętle, albo użyć warunku w pętli który będzie wykonywał pętlę do końca zbioru w zależności w czym piszesz i co masz do dyspozycji.

    Pozdrawiam
  • REKLAMA
  • #3 10018848
    sedr
    Poziom 17  
    Posty: 186
    Pomógł: 19
    Ocena: 3
    Użyj jakiejś mapy haszującej bądź słownika.
  • REKLAMA
  • #4 10021876
    ed-ek
    Poziom 34  
    Posty: 1814
    Pomógł: 275
    Ocena: 42
    Zdefiniuj kontener vector do którego wpiszesz kolejne wiersze pliku. Jest on w istocie tablicą i łatwo sobie poradzisz z szukaniem i wyliczaniem ilości identycznych wierszy.
  • REKLAMA
  • #5 10042958
    Dariusz Bismor
    Poziom 18  
    Posty: 150
    Pomógł: 35
    Ocena: 16
    Och, można kombinować na własną rękę. Nie polecam tu pojemnika vector, gdyż prawdopodobnie trzeba będzie pojemnik posortować, co dla vector-a stringów może zbyt długo trwać.
    Jednak najprostsze możliwe rozwiązanie to użycie mapy, z kluczem w postaci wiersza i wartością w postaci licznika. Wygląda to mniej więcej tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Całość załatwia jedna linia kodu: ++m[s]. W przypadku, gdy linii jeszcze nie ma w mapie, powoduje ona dodanie linii (klucza) do mapy, waraz z domyślną dla typu int wartością (zero), a następnie inkrementację tego zera. Gdy linia już w mapie jest, opeartor tablicowy znajduje odpowiadającą jej wartość, która potem jest inkrementowana.
    Wypisanie kluczy i wartości z mapy wygląda tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    HTH,
    Dariusz
  • #6 10043011
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    no tak, a co gdy nie znajdzie się gotowca?
    pomyśl jak sam byś to robił?
  • #7 10043401
    Dariusz Bismor
    Poziom 18  
    Posty: 150
    Pomógł: 35
    Ocena: 16
    Cytat:
    no tak, a co gdy nie znajdzie się gotowca?
    pomyśl jak sam byś to robił?

    Nie bardzo to rozumiem. Ja zrobiłbym to sam właśnie tak. Zresztą powyższy przykład jest moim własnym przykładem. Przecież nie będę implementował sam zbalansowanego drzewa binarnego - nieco może przesadzając, na podobnej zasadzie można dojść do absurdu "pomyśl jak sam byś zaimplementował swój kompilator".

    Co innego, oczywiście, droga dojścia do takiego wyniku. Sam też nie wymyśliłem tego od podstaw, ani przez czytanie Standardu C++, lecz słyszałem/widziałem gdzieś podobny kod. Co w tym złego? Tak się przecież uczymy: czytając książki, pytając na forum.

    A jeżeli już jesteśmy przy zwracaniu komuś uwagi i nie wnoszeniu niczego do tematu, kolego Xitami, klawisz Shift Ci się zaciął?

    Dariusz

Podsumowanie tematu

✨ Użytkownik forum poszukuje pomocy w napisaniu programu w C++, który wczytuje tekst z pliku i sumuje identyczne wiersze, zapisując wynik do innego pliku. Odpowiedzi sugerują różne podejścia do rozwiązania problemu, w tym użycie mapy haszującej (słownika) do zliczania wystąpień wierszy oraz kontenera vector do przechowywania wierszy. Wskazówki obejmują również inkrementację licznika dla identycznych wierszy oraz wypisywanie wyników z mapy. Dyskusja porusza również kwestie efektywności i alternatywnych metod implementacji.
Wygenerowane przez model językowy.
REKLAMA