konsolowy czytnik tekstu

0

Witam, mam za zadanie napisać program konsolowy który ma odczytywać tekst z pliku i wyświetlić go z możliwością przewijania. Mam pomysł, aby zrobić to w taki sposób, ładuję tekst linia po linii do tablicy stringów (z góry określona ilość linii). Potem wyświetlam np 30 pierwszych linii (tak ustalone w zadaniu) i czekam na zdarzenie z klawiatury, jeśli strzałka w dół to czyszczę ekran i wyświetlam linie od 2 do 31 itd... jeśli spacja to przewijam cały ekran czyli sprawdzam która linia jest ostatnia wyświetlona, czyszczę ekran i wyświetlam 30 linii zaczynając od aktualnej ostatniej.

Tak się to powinno prawidłowo zrobić, czy jakiś inny bardziej fachowy sposób jest na tego typu rzeczy? Tekst ma być wyświetlony w konsoli w dodatkowo zrobionej ramce ze znaków ASCII

0

Skoro tak ma to być zrobione to twój pomysł jest ok.

0

aha, ok dzięki;) myślałem że jest jakiś bardziej profesjonalny sposób na zrobienie czegoś takiego niż czyszczenie ekranu i wyświetlanie w pętli od nowa

0

Jaki profesjonalny? xd Najprostszy ten chyba, czyli najlepszy.

0

Myślałem, że może są jakieś metody godne uwagi i użycia w C++, które znacznie by uprościły wszystko. A co do zadania to jest jeszcze taka informacja:

"można maksymalnie otrzymać 5 punktów: 3 punkty za zaimplementowanie przedstawionej powyżej funkcjonalności i 2 punkty stanowiące subiektywną ocenę prowadzącego (uwzględniającą przede wszystkim styl kodowania i staranność wykonania)."

Nie chcę stracić tych 2 punktów

0

A co może być godne większej uwagi od jednej funkcji czyszczącej? Jeżeli nie chcesz stracić tych 2 punktów to jak już napiszesz to wklej tutaj i ci ew. poprawimy czy ulepszymy.

0

no okej, w sumie to nic;) tak będzie najprościej;) ...sam nie wiem co myślałem...

0
porschelukas napisał(a):

Myślałem, że może są jakieś metody godne uwagi i użycia w C++, które znacznie by uprościły wszystko. A co do zadania to jest jeszcze taka informacja:

"można maksymalnie otrzymać 5 punktów: 3 punkty za zaimplementowanie przedstawionej powyżej funkcjonalności i 2 punkty stanowiące subiektywną ocenę prowadzącego (uwzględniającą przede wszystkim styl kodowania i staranność wykonania)."

Nie chcę stracić tych 2 punktów

Te dwa punkty to "uwzględniającą przede wszystkim styl kodowania i staranność wykonania". Czyli trzymaj się takich podstawowych zasad:
#formatowanie kodu (wcięcia)
#nazewnictwo symboli (nazwy, które wskazują funkcjonalność symbolu)
#funkcje i metody nie dłuższe niż 20 linijek (nie mające więcej niż 3 elementy kontroli przepływu: if, for, wile...)
#nie stosowanie liczb magicznych (definiować stałe).

0

a w jaki sposób ustawić rozmiary okna konsoli gdzieś znalazłem coś takiego:

HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SMALL_RECT windowSize = {0, 0, 80, 50};
SetConsoleWindowInfo(hConsole, TRUE, &windowSize);

ale okno po wyświetleniu ma zdecydowanie mniej niż 50 linii, nie wiem jak się uporać z tym

0

Dlaczego chcesz samemu ustawiać rozmiar okna konsoli? Niech użytkownik decyduje o tym jak mu wygodnie. To ty pobierz rozmiar okna, który ustawił użytkownik.
Pamiętaj o tym, że są dwa różne rozmiary konsoli - okna i bufora, który jest nieco większy od tego pierwszego. Możesz użyć tego drugiego, by użytkownik mógł za pomocą suwaka sprawdzić co było wyżej.

0
xeo545x39 napisał(a):

A co może być godne większej uwagi od jednej funkcji czyszczącej? Jeżeli nie chcesz stracić tych 2 punktów to jak już napiszesz to wklej tutaj i ci ew. poprawimy czy ulepszymy.

otóż może być coś. zamiast czyścić ekran i ponownie zapełniać go tekstem, co może spowodować miganie (flickering), należy wypisywać tekst w taki sposób, żeby każda linijka była wypełniona spacjami aż do końca wiersza. czyli niejako wypisywać i czyścić jednocześnie.
warto też ukryć na moment wypisywania kursor, żeby nie latał po ekranie, a jeszcze lepiej byłoby wypisywać tekst bez przemieszczania kursora, ewentualnie kompletnie go schować.

0
Rev napisał(a):

Dlaczego chcesz samemu ustawiać rozmiar okna konsoli? Niech użytkownik decyduje o tym jak mu wygodnie. To ty pobierz rozmiar okna, który ustawił użytkownik.
Pamiętaj o tym, że są dwa różne rozmiary konsoli - okna i bufora, który jest nieco większy od tego pierwszego. Możesz użyć tego drugiego, by użytkownik mógł za pomocą suwaka sprawdzić co było wyżej.

Muszę ustawić chyba na sztywno ponieważ takie są warunki zadania (załącznik). A może coś, źle zrozumiałem. Nie do końca wiem też o co chodzi z tą ramką bo mi się nie zgadzają rozmiary, np biorąc pod uwagę szerokość i zakładając, że 80 to szerokość okna, 12 to margines z lewej i prawej czyli 80 - 12 -12 = 56, a 56 jest rożne od 50 czyli szerokości ramki z wyświetlanym plikiem... Więc albo coś, źle rozumiem, albo nie wiem... z wysokością jest podobnie

0

Jako "bajer" możesz zrobić zawijanie tekstu - pamiętaj że linia tekstu w pliku może przekroczyć szerokość ekranu i warto by jakoś sensownie na to zareagować a nie po prostu ucinać taką linię. W prostszej wersji zawijanie linii na końcu w stałym miejscu lub w trudniejszej zawijanie z dokładnością do wyrazu. Jeśli zdecydujesz się na taki krok warto też zaznaczyć w jakiś sposób że linia została zawinięta.

0
szopenfx napisał(a):

Jako "bajer" możesz zrobić zawijanie tekstu - pamiętaj że linia tekstu w pliku może przekroczyć szerokość ekranu i warto by jakoś sensownie na to zareagować a nie po prostu ucinać taką linię. W prostszej wersji zawijanie linii na końcu w stałym miejscu lub w trudniejszej zawijanie z dokładnością do wyrazu. Jeśli zdecydujesz się na taki krok warto też zaznaczyć w jakiś sposób że linia została zawinięta.

hmm nie rozumiem w treści zadania jest napisane, żeby taką linię uciąć i zasygnalizować znakiem ">" z prawej strony ramki.

A co do wysokości okna konsoli, to nadal nie wiem jak to zrobić...

0
ŁF napisał(a):
xeo545x39 napisał(a):

A co może być godne większej uwagi od jednej funkcji czyszczącej? Jeżeli nie chcesz stracić tych 2 punktów to jak już napiszesz to wklej tutaj i ci ew. poprawimy czy ulepszymy.

otóż może być coś. zamiast czyścić ekran i ponownie zapełniać go tekstem, co może spowodować miganie (flickering), należy wypisywać tekst w taki sposób, żeby...

Jednym wywołaniem WriteConsoleOutputCharacter można zapełnić całe okno konsoli wskazaną tablicą znaków i jest to bardzo szybkie, nie powoduje migotania. Taki double buffering.

1 użytkowników online, w tym zalogowanych: 0, gości: 1