6 / 7
Jan 2015

Cześć!
Nie chciało mi się szukać czegoś takiego w necie więc napisałem sobie króciutki programik porównujący 2 pliki .txt (np. porównuje prawidłowy output z outputem Twojego programu). Bardzo pomocne jeśli chce się rozwiązywać i testować zadania w których trzeba coś narysować ze znaków (np. zadanie "Wiatraczki") i z resztą w każdym innym zadaniu - komu chce przeglądać się kilkadziesiąt linijek cyferek i porównywać je z prawidłowym wyjściem? smile
Ok, starczy gadania.

Link do binarki: drive.google.com/file/d/0B7OYxY ... sp=sharing

Link do kodu: pastebin.com/1qe0Pz274

Nazwę pliku podać należy bez rozszerzenia ("plik" a nie "plik.txt"), oba pliki znajdować muszą się w tym samym folderze co aplikacja!

Mam nadzieję, że komuś ułatwi to nieco korzystanie ze spoja smile

  • created

    Jan '15
  • last reply

    Jan '15
  • 6

    replies

  • 761

    views

  • 3

    users

  • 3

    links

Z tego co widzę to używasz funkcji getline, więc jeśli w którymś pliku wystąpią nadmiarowe białe znaki to program ich nie zignoruje (są zadania w których dobrze że tak się dzieje, ale są takie w których nie trzeba się nimi przejmować).

Skoro białe znaki i tak są ważne jest w Windowsie (a w Linuxie na pewno jest też jakaś smile) funkcja porównująca dwa pliki: fc.
Więc otwierasz okno poleceń, przechodzisz do folderu z plikami i wpisujesz:

fc plik1 plik2

I wiesz czy pliki są identyczne czy nie. Oczywiście wiem że Twój program wypluwa ilość nieidentycznych linijek co jest zaletą, ale i tak ich trzeba szukać ręcznie - mała różnica w porównaniu z informacją że są różne.

PS. Portal z którego ściąga się binarke wymaga rejestracji przez facebooka, google+ lub jakieś inne opcje - mnie to zniechęciło do ściągania.

Dzięki za opinię! smile

Tak, z tą binarką rzeczywiście tragedia, jak będę miał chwilę to dam linka do pobrania z mojego google drive.

I łatwo zauważyć, że na kod spojrzales jednym okiem smiley
Program zwraca następujące informacje:
1. Długość pliku pierwszego i pliku drugiego (jeśli jest różna to wiadomo, że pliki nie są identyczne)
2. Sprawdza i porownuje po kolei każda linijkę obu plików - jesli są identyczne idzie dalej, jeśli nie są wyświetla numer linii i te linie z obu plików dodajac na poczatku i na koncu || żeby widac było dodatkowe spacje
3. Wyświetla napis z informacja ile linijek jest identycznych lub informacje że wszystkie porównane linie są identyczne

Mechanizm porównywania jest oparty na pętli while z dwoma getlinami w warunku - informacja o tym ile linijek zostanie porownanych także jest wyświetlana (max to długość krótszego pliku, jesli ilość linijek jest równa porównane zostana cale pliki.

Nie trzeba, tak jak mówisz, różnic szukać ręcznie.

Łącząc info można wyciągnąć wszystkie potrzebne informacje, np. równa ilość linijek + zero znalezionych roznic = pliki są identyczne.

Też zauważyłem ten wątek, ale się wstrzymałem z komentowaniem wink
Czy jest sens robić tego typu program, gdy są już gotowe, darmowe, do wykorzystania?

Z jednej strony na pewno tak, przy jego tworzeniu i poprawianiu masz okazję dużo się nauczyć. To że dałeś tu takie info, też może CI wyjść na dobre, możliwe, że dostaniesz trochę opinii i komentarzy od ewentualnych "końcowych uzerów". Aby jednak tak się stało, twój "produkt" musi być konkurencyjny wobec istniejących.

Warto więc zobaczyć jak działają inne tego typu programy i jak używają je użytkownicy. Ja używam linuxa, więc dużo Ci nie pomogę.
Pod linuxem jest multum takich programów, ja używam diff - konsolowy a czasami meld'a - wersji okienkowej, która dokładniej pokazuje różnice.
Jest jeszcze cmp - porównuje pliki binarnie - bajt po bajcie, diff porównuje pliki tekstowe, liniami.
Jak działa diff - jeżeli pliki są jednakowe, domyślnie, nic nie wyświetla, ale po dodaniu przełącznika wyświetla że podane pliki o wielkości takiej i takiej były identyczne.
Dla mnie jest to wystarczająca informacja - było ok i program nic nie wyświetlił, lub były różnice i wtedy wyświetla linię poprzedzającą, linię/linie różniące się i jedną następną, oraz numery linii. To zachowanie, można oczywiście zmieniać przełacznikami, ale ja z tego nie korzystam, wystarcza, że jest błąd i muszę go szukać już ręcznie w kodzie programu, a nie w pliku wyjścia [ewentualnie muszę znale[color=#FF0000][s]ś[/s][/color]źć dla jakich danych wejściowych mam błędy] - jak by to robił twój program byłby super - dla błędnej linii outputu, wyświetlał odpowiednią linię input.
Program diif, uruchomiony bez parametrów wyświetla podpowiedź, ma też dokumentację [man diff] oraz można w necie znaleźć i ściągnąć jego źródła [ramka niżej - home page] - w końcu to program na licencji gnu. Popatrz [fragment]:

diff
diff: missing operand after 'diff'
diff: Try 'diff --help' for more information.

diff --help
Usage: diff [OPTION]... FILES
Compare FILES line by line.
Mandatory arguments to long options are mandatory for short options too.
      --normal                  output a normal diff (the default)
  -q, --brief                   report only when files differ
  -s, --report-identical-files  report when two files are the same
  -c, -C NUM, --context[=NUM]   output NUM (default 3) lines of copied context
  -u, -U NUM, --unified[=NUM]   output NUM (default 3) lines of unified context
  -e, --ed                      output an ed script
  -n, --rcs                     output an RCS format diff
  -y, --side-by-side            output in two columns
..........
i jeszcze kilka[nascie] linii opcji ;-), a na koncu:
..........
FILES are 'FILE1 FILE2' or 'DIR1 DIR2' or 'DIR FILE...' or 'FILE... DIR'.
If --from-file or --to-file is given, there are no restrictions on FILE(s).
If a FILE is '-', read standard input.
Exit status is 0 if inputs are the same, 1 if different, 2 if trouble.
Report bugs to: bug-diffutils@gnu.org
GNU diffutils home page: <http://www.gnu.org/software/diffutils/>
General help using GNU software: <http://www.gnu.org/gethelp/>

Poczekaj, lub wróć do tego postu, bo jeszcze nie skończyłem, za jakiś czas jeszcze wrócę tu do edycji lub w nowym poście i trochę jeszcze dopiszę, jeżeli będziesz oczywiście chciał wink

Tak dokładnie jak mówisz. Wiec jeżeli Kubo chciałbyś poprawić swój program to do programu w podstawowej wersji wprowadzasz 3 informacje:
- ścieżkę do folderu z wejściami
- ścieżkę do folderu z wyjściami
- ścieżkę do skompilowanego pliku z programem który sprawdzamy
Dostajemy na out:
- plik in dla których nie przeszło testu
Ja osobiście mam taki programik, ale jest tak brzydki, że chyba się nim nie pochwalę unamused Zresztą zazwyczaj po prostu otwieram pliki z outami w notepadzie i robię alt-tab. Programu używam jedynie dla długich testów.
Dodatkowe "fajne" funkcje:
- wyświetlony czas wykonania
- linijka pliku wejściowego o której wspomniał narbej - nie zawsze się da, ale czasem można j[color=#FF0000][s]a[/s][/color]ą wink "zgadnąć" - np wtedy gdy w pliku in i out jest tyle samo liniio (albo o jedna więcej z pominięciem pierwszej - bo to prawdopodobnie liczba testów). Wtedy jeśli się dla jakiegoś problemu da można sobie tak przygotować in, żeby był on w jednej linii.

I gratuluje inicjatywy smile

PS. Jeżeli ktoś zna fajne narzędzia tego typu to podzielcie się.

Dzięki za komentarze!
Myślę że spojrzeliście na ten projekcik znacznie poważniej niż ja smiley Po kodzie od razu widać, że jest pisany na kolanie - mało funkcji, zupełnie nieprofesjonalne nazwy zmiennych, śmieszna klasa (właściwie nie wiem po co ona, skopiowana z innego projektu, "chirurgicznie" wyciąłem z niej kilkanaście funkcji i zmiennych i zostało takie oto coś) itd. Nie myślałem nawet, że uznacie, że to może w jakimkolwiek stopniu konkurować z innymi tego typu programami smile

Ale... teraz już chyba za późno, zacząłem to muszę kontynuować. W weekend będę miał trochę wolnego czasu, zobaczę ile uda mi się zrobić i na ile będzie to przekraczać moje umiejętności (naukę programowania zacząłem niedawno, chętnie nauczę się nowych rzeczy ale może to zająć trochę czasu).

@zaro: masz rację, po dodaniu takich funkcji użyteczność programu wzrosła by o milion procent, postaram się zaimplementować wszystko co wymieniłeś smile nie wiem ile z nich jest teraz w mojej mocy, czego nie umiem to się douczę, postaram się rozwijać program krok po kroku.

@narbej: jasne, bardzo chętnie poczytam rady od bardziej doświadczonej osoby! smile Proponuję jednak żebyś się z tym aż tak bardzo nie spieszył, najpierw zobaczę co da się zrobić i napiszę nową wersję tego programu. Zrobię też tak jak radzisz, przejrzę źródła innych tego typu programów.

Jeszcze raz dziękuję za rady i komentarze!

P.S. link do binarki poprawiłem

Mówiąc o konkurencyjności, nie miałem na myśli, żebyś dorównywał np programowi diff, a tylko ewentualnie czerpał z niego wzór i natchnienie;-) Ma on tyle opcji, ale i tak najczęściej korzysta się z ich ograniczonej listy - ja praktycznie z żadnej - chociaż mógłbym np korzystać z opcji ignorowanie różnic białych znaków. Dlatego, ważniejsze jest wymyślenie scenariusza, "łańcucha" w jakim działałby program tego typu. Np
1. edytor
2. kompilator
3. błędy kompilacji - powrót do edycji
4. uruchomienia na małym teście
5. błędy go to 1
6. uruchomienie na większym poprawnościowym
7. błędy - wyłapane linie i dane na których się sypie i z tymi danymi - go to 1
8. włączenie zegarka i wachdoga [wyłączenie jak za długo]
9 uruchomienie dla testów wydajnościowych
10. raport czasu [błędy tylko czy są czy nie]
11 . edycja poprawki
12. if not ok go to 2
13 else go to spoj

Większość rzeczy już jest [każde IDE] czy w linux [time itd] i można by to zgrabnie połączyć dodatkowo w bashu - jeżeli ktoś miałby taką potrzebę i ochotę lub programie.
Mimo to rób swoje, napewno się przy tym dużo nauczysz i może wymyślisz coś fajnego.
Źródła diff'a są mocno przerośnięte, dostosowane do kompilacji pod różnorakie systemy, a pakiet zawiera także źródła programu cmp, diff3 [porównywanie 3 plików], sdiff .
Popatrz jeszcze jak to robią sędziowie i czerp natchnienie: ......?? kurde, chciałem podać Ci link, ale nie mogę go znaleźć. Kiedyś był taki wątek z opisanymi sędziami ze SPOJ;a ale może został skasowany?

pozdrawiam

PS
Znalazłem:
viewtopic.php?f=10&t=2800