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

Jak usunąć miganie przy używaniu system("cls");?

Object Storage Arubacloud
+1 głos
621 wizyt
pytanie zadane 17 lutego 2021 w C i C++ przez Drożdżówka Obywatel (1,870 p.)
edycja 17 lutego 2021 przez Drożdżówka

Witam.

Mam problem, mianowicie załóżmy, że mam w programie taką pętlę:

while(true){
system("cls");
cout << "coś tam" << endl;

}

Teraz pojawia się problem, gdy cout wypisuje "coś tam" napis ten zaczyna jakby migać. Wiem, że to wina system();, ale nie mogę znaleźć alternatywy dla tej funkcji :/. Wiecie jak temu zaradzić?

3 odpowiedzi

+1 głos
odpowiedź 17 lutego 2021 przez Author[] Gaduła (3,130 p.)
Miganie jest efektem tworzenia nowych napisów oraz natychmiastowego usuwania ich. Nie wiem co chciałeś poprzez to osiągnąć ale tworzenie w konsoli nowych napisów zaraz po usunięciu poprzednich jest bez sensu.
komentarz 17 lutego 2021 przez Drożdżówka Obywatel (1,870 p.)
To był tylko przykład...
komentarz 17 lutego 2021 przez Author[] Gaduła (3,130 p.)

Zobacz ten link: stackoverflow

Poza tym nie słyszałem o żadnej innej alternatywie

0 głosów
odpowiedź 17 lutego 2021 przez mokrowski Mędrzec (155,460 p.)
komentarz 17 lutego 2021 przez Drożdżówka Obywatel (1,870 p.)
To zbyt ogólna odpowiedź.
komentarz 17 lutego 2021 przez mokrowski Mędrzec (155,460 p.)
Przy tak ogólnym pytaniu, masz ogólną odpowiedź. No ale dobrze, trochę dokładniej:

1. Czyścisz konsolę (może być std::system("cls"))

2. Ustawiasz kursor na odpowiedniej pozycji (może być 0, 0)

3. Wyświetlasz tekst

4. Zmieniasz tekst

5. Powrót do pkt. 2

Tu masz podpowiedź jak ustawić kursor dla Windows i GNU/Linux:

https://thoughtsordiscoveries.wordpress.com/2017/04/26/set-and-read-cursor-position-in-terminal-windows-and-linux/

Jedyna wada takiego (prostego) rozwiązania, to konieczność pamiętania by poprzedni tekst, "zamazywał" poprzedni...

Wystarczająco dokładnie? :)
komentarz 17 lutego 2021 przez Drożdżówka Obywatel (1,870 p.)
Już korzystałem z tego rozwiązania, ale problemem jest ten pozostający tekst...
komentarz 17 lutego 2021 przez mokrowski Mędrzec (155,460 p.)
Hmm.. a rozważałeś dodanie odpowiedniej ilości spacji ? :) Np. długość tekstu zawsze 16 znaków a jeśli krótszy to uzupełniasz spacjami :)

To naprawdę najprostsze rozwiązanie. Jak potrzebujesz wyrafinowanych (okienka, kolory, pola danych...), to pozostaje już API i ew. pochodne biblioteki ncurses,
komentarz 17 lutego 2021 przez Drożdżówka Obywatel (1,870 p.)
Kombinowałem coś z tymi spacjami. Jeżeli to jest jedyne rozwiązanie to co poradzę? Najwyżej kod będzie wyglądał jak śmietnik, ale ważne, że wszystko będzie działało ;).
komentarz 17 lutego 2021 przez mokrowski Mędrzec (155,460 p.)

Nie jedyne.. przeczytaj uważnie co napisałem. Najprostsze. Co oznacza że ma granice rozsądnego stosowania do małych aplikacji. Kod nie będzie wyglądał jak śmietnik jeśli zastosujesz jakąkolwiek hermetyzację. Np. funkcję która "sama dopisze spacje do komunikatu". Funkcja może nawet pamiętać jaka była ostatnia długość komunikatu aby nie dopisywać spacji bez potrzeby.

0 głosów
odpowiedź 17 lutego 2021 przez VBService Ekspert (253,340 p.)
edycja 17 lutego 2021 przez VBService

<curses.h>

 

#include <curses.h>

int main()
{
  char users_name[100];

  // Remember, when using Curses, no change will appear
  // on the screen until refresh() is called
  initscr();

  addstr(" What is your name: ");
  refresh();
  getnstr(users_name, sizeof(users_name) - 1);

  clear(); // system("cls");

  printw(" Greetings and salutations %s!\n", users_name);
  refresh();

  printw("\n Press ENTER to quit.");
  refresh();
  getnstr(users_name, sizeof(users_name) - 1);

  endwin();
  return 0;
}

 

lub może nie do końca w temacie, ale przeanalizuj ten kod (dawno temu była potrzeba napisania, TAKIEGO zegara)  wink

zegar.cmd

@echo off
:loop
timeout /T 0 /NOBREAK > NUL
cls
set h=%time:~0,2%
set m=%time:~2,2%
set s=%time:~4,4%
echo %h%%m%%s%
timeout /T 1 > NUL
rem choice /T:1 /D:"y" /N > NUL
goto loop

timeout in a batch file ]

Podobne pytania

+1 głos
2 odpowiedzi 631 wizyt
pytanie zadane 5 kwietnia 2021 w C i C++ przez niezalogowany
0 głosów
2 odpowiedzi 566 wizyt
pytanie zadane 21 maja 2020 w C i C++ przez Atman Użytkownik (810 p.)
0 głosów
1 odpowiedź 700 wizyt
pytanie zadane 6 czerwca 2019 w C i C++ przez kkajet007 Nowicjusz (180 p.)

92,572 zapytań

141,422 odpowiedzi

319,645 komentarzy

61,959 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...