[C++]Progress bar w konsoli


(Kamilmlody5) #1

Witam.

Po spędzonych godzinach w google, szukałem i myślałem, jak tu zrobić progress bar w konsoli. Chciałem zrobić prosty test na kopiowaniu pliku(Copyfile) w C++ i żeby pokazywało mi ile zostało. Dochodziłem do prymitywnego sposobu, ale myślę, że to nie to. Ale po długich przeszukiwaniach, znalazłem setki source code i dochodziłem właśnie do swojego myślenia. Mój pomysł:

  1. Ilość bajtów pliku źródłowego

  2. Ilość bajtów pliku docelowego

  3. Obliczenie różnicy i pokazywanie tego procentowo( []0% [++++]25% [++++++++++]100% )

Ale według mnie to troche mija sie z celem i mam pytanie, czy w ogóle inny sposób istnieje? A po drugie chyba nie da rady w taki sposób. Może jakbym pocioł plik.


(Sawyer47) #2

Możesz użyć biblioteki boost, ma gotowy pasek dostępu: http://www.boost.org/doc/libs/1_38_0/li ... ss_display

Na co, na obliczenie postępu? Jeśli masz dwie wielkości cur – bieżącą wartość oraz max – maksymalną wartość i cur zmienia się w zakresie 0..max to wartość procentowa to po prostu (cur / max)*100

Czemu nie da rady? Oraz co chcesz zrobić z plikiem?!


(Kamilmlody5) #3

Jeżeli chodzi o dzielenie pliku, to myślałem, żeby zrobić to ręcznie. Z mojej nikłej wiedzy C++ wynika, że mozna zrobić to tak:

-dziele plik na 4 części

-copyfile....(1czesc)

-Cout - skopiowano 25%

-copyfile....(2czesc)

-cout - skopiowano 50%

-itd.

Bo niestety nie mam wogóle pojęcia jak działa progress bar(C++ to mój pierwszy poważny język) i jak jednocześnie(bez dzielenia pliku) kopiować i pokazywać postęp na ekranie w czasie rzeczywistym. A jeżeli chodzi o biblioteke boost, to można ją ominąć, i napisać kod w standardowych bibliotekach? Czy jestem skazany na boost'a?


(Sawyer47) #4

Nie jesteś skazany, ale jeśli twoja wiedza na temat programowania jest delikatnie mówiąc marna, to czemu nie użyć gotowego kodu? Zresztą jedną z zasad programowania jest DRY.Co do kopiowania pliku to chyba naturalne jest, że pobierasz wielkość całego pliku, oraz podczas kopiowania zliczasz ile już zostało skopiowane. Jakiekolwiek "fizyczne" dzielenie pliku nie ma żadnego sensu.


(Kamilmlody5) #5

W takim razie program musi robić 2 rzeczy na raz. Może mi ktoś to pokazać. Bo sobie tego nie wyobrażam. Dla mnie to albo tylko kopiuje, albo zlicza.


([alex]) #6

W czystym C/C++ niema polecenia kopiowania pliku, więc robi się to następująco:

  1. Otwierasz plik źródłowy.

  2. Sprawdzasz jego rozmiar do zmiennej "źródłowy rozmiar".

  3. Tworzysz plik docelowy.

  4. Ustawiasz zmienną "docelowy rozmiar" na 0

  5. W pętle dopóki "docelowy rozmiar" mniejszy od "źródłowy rozmiar" ...

5.1. Wczytujesz ze źródłowego pliku do buforu fragment pliku.

5.2. Zapisujesz do docelowego pliku wczytany fragment.

5.3. Zwiększasz zmienną "docelowy rozmiar" o rozmiar zapisanego fragmentu.

5.4. Ewentualnie wyświetlasz postęp kopiowania.

5.5. Powtarzasz pętle.

  1. Zamykasz plik docelowy.

  2. Zamykasz plik źródłowy.


(Kamilmlody5) #7

Jak ustawić bufor? Kiedyś się z tym spotkałem, ale raczej nie było to(program pracujący z tekstem).


([alex]) #8

Np:

char bufor[32*1024];


(Kamilmlody5) #9

Ale chodzi mi o wczytanie do bufora części pliku.


(Sawyer47) #10

http://www.cppreference.com/wiki/io/read dla iostream lub http://www.cppreference.com/wiki/c/io/fread dla stdio


(Kamilmlody5) #11

Chyba nic z tego nie wyjdzie. Mam za małą wiedzę na ten temat. Niby poduczyłem się "Od zera do gier kodera" i "Symfonia c++", ale jednak brak mi praktyki. Męczyłem się z tym dwa tygodnie. Dziwie sie bo gdy szukałem pod hasłem "progress bar" to wyskakiwało mi tylko kod na rysowanie. To, to i ja potrafię, ale nie potrafię tego połączyć z kopiowaniem. Postaram się jeszcze raz napisać kod, z tym buffer. Thx za odpowiedzi.