• 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");?

VPS Starter Arubacloud
+1 głos
590 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 (251,170 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 588 wizyt
pytanie zadane 5 kwietnia 2021 w C i C++ przez niezalogowany
0 głosów
2 odpowiedzi 541 wizyt
pytanie zadane 21 maja 2020 w C i C++ przez Atman Użytkownik (810 p.)
0 głosów
1 odpowiedź 658 wizyt
pytanie zadane 6 czerwca 2019 w C i C++ przez kkajet007 Nowicjusz (180 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...