Rensa skärm i C++, Geany [LÖST]

Här diskuteras programmering och utveckling
Neonii
Inlägg: 59
Blev medlem: 03 sep 2008, 18:51
OS: Ubuntu
Utgåva: 16.04 Xenial Xerus LTS
Ort: Karlskrona

Rensa skärm i C++, Geany [LÖST]

Inlägg av Neonii »

Hejsan!

Brukade programmera lite C++ på min gamla Windows-burk då jag gick i gymnasiet, och tänkte återuppta detta tidsfördriv.

Jag började koda lite granna, men då jag kompilerade koden så gnällde kompilatorn på kommandot "clrscr();",, vilket jag alltid brukade använda då jag pillade i Borland C++.

Så, då jag inte hittade något svar på google, så frågar jag nu er: Vad för kommando kör man om man vill rensa skärmen på text i Geany, precis som man gör med kommandot "clear" i terminalen?

Tacksam för svar,
Neonii
Senast redigerad av 1 Neonii, redigerad totalt 10 gånger.
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Rensa skärm i C++, Geany

Inlägg av Osprey »

Vet inte exakt men om det inte funkar med en enkel system("clear"); så kan du kanske använda XClearWindow. Den senare av dem har jag dock aldrig provat själv...
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
David Andersson
Inlägg: 1269
Blev medlem: 15 dec 2007, 03:20
OS: Xubuntu

Re: Rensa skärm i C++, Geany

Inlägg av David Andersson »

Jag vet inget om Geany men antagligen accepterar den samma styrsekvenser som en terminal (som xterm, urxvt eller terminalen i ubuntu). Du kan se vad kommandot clear skickar till terminalen med kommandot clear | less .

Om du gör ett program som ska köras från terminalen och vill göra mer än bara skriva ut text rakt upp och ner så kan du antigen använda biblioteket curse eller lära dig alla escape-sekvenser som styr terminalen (slå upp ansi escape sequenses).
Neonii
Inlägg: 59
Blev medlem: 03 sep 2008, 18:51
OS: Ubuntu
Utgåva: 16.04 Xenial Xerus LTS
Ort: Karlskrona

Re: Rensa skärm i C++, Geany

Inlägg av Neonii »

Tack för det snabba svarent!

Mja, jag testade system("clear"); men får bara felmeddelandet

Kod: Markera allt

calculator.cpp:96: error: ‘system’ was not declared in this scope
Har annars hört att det är ett Windows-kommando, kan det stämma?

Jag googlade även på XClearWindow, fick fram http://tronche.com/gui/x/xlib/graphics/ ... indow.html, vilket verkar vara på rätt väg, men jag blev inte klokare på att läsa det där :P

Verkar ju skumt ifall man inte kan göra en enkel clear screen i C++-kod, eftersom det funkar perfekt i terminalen..

@David:

Jag testade att köra "clear | less", men fick bara fram:

Kod: Markera allt

ESC[HESC[2J
(END)
samt en blinkande markör efter (END)-et. Kan inte end avbryta kommandot med ctrl + c, eller stänga ner terminalen med ctrl + d.
Är det någonting jag missar?
David Andersson
Inlägg: 1269
Blev medlem: 15 dec 2007, 03:20
OS: Xubuntu

Re: Rensa skärm i C++, Geany

Inlägg av David Andersson »

Neonii skrev: Jag googlade även på XClearWindow, fick fram http://tronche.com/gui/x/xlib/graphics/ ... indow.html, vilket verkar vara på rätt väg, men jag blev inte klokare på att läsa det där :P
Det är X-programmering (X11, X-Window). Grafiska program. En helt annan skola än jag clear i kommandoraden.
Neonii skrev: Jag testade att köra "clear | less", men fick bara fram:

Kod: Markera allt

ESC[HESC[2J
(END)
samt en blinkande markör efter (END)-et. Kan inte end avbryta kommandot med ctrl + c, eller stänga ner terminalen med ctrl + d.
Är det någonting jag missar?
Hehe. Glömde berätta att man går ur less med q. Om du kan få ditt c++-program att skriva ut den där escape-sekvensen i terminalfönstret så bör fönstret rensas.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Rensa skärm i C++, Geany

Inlägg av Konservburk »

David Andersson skrev:Om du kan få ditt c++-program att skriva ut den där escape-sekvensen i terminalfönstret så bör fönstret rensas.

Kod: Markera allt

#include <iostream>
main() {
	std::cout << "\e[H\e[2J";
}
Jag har iofs brukat göra så här istället:

Kod: Markera allt

#include <iostream>
main() {
	std::cout << "\ec";
}
Men jag har ingen aning om det ena alternativet är bättre än det andra :P
Användarvisningsbild
Jarulf
Inlägg: 604
Blev medlem: 04 feb 2007, 22:46
OS: Ubuntu
Ort: Skellefteå
Kontakt:

Re: Rensa skärm i C++, Geany

Inlägg av Jarulf »

Neonii skrev:Mja, jag testade system("clear"); men får bara felmeddelandet

Kod: Markera allt

calculator.cpp:96: error: ‘system’ was not declared in this scope
För att system ska fungera måste du lägga till include-filen cstdlib högst upp.

Kod: Markera allt

#include <cstdlib>
alternativt

Kod: Markera allt

#include <cstdlib.h>
Användarvisningsbild
micke_nordin
Inlägg: 1539
Blev medlem: 21 aug 2008, 17:03
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Rensa skärm i C++, Geany

Inlägg av micke_nordin »

David Andersson skrev:Jag vet inget om Geany men antagligen accepterar den samma styrsekvenser som en terminal (som xterm, urxvt eller terminalen i ubuntu).
Geany är bara en texteditor, den har en kompileringsknapp och en körknapp, men den kompilerar med g++ på precis samma sätt som om man kompilerar i terminalen (geany kör kommandot 'g++ -Wall -c "%f"' för att kompilera och 'g++ -Wall -o "%e" "%f"' för att bygga, där %e och %f är variabler som byts mot filnamn, dessa kommandon kan också modifieras av användaren själv). Detta har alltså att göra med vad c++ har för möjligheter och vilka kommandon språket kan skicka till systemet.

/Micke

Edit: Här har du ett exempelprogram som rensar skärmen:

Kod: Markera allt

#include <iostream>
#include <cstdlib>
#include <pthread.h>

using namespace std;

int main(int argc, char** argv)
{
	cout << "Testar att rensa skärmen!\n";
	for(int i = 3; i > 0; i--)
	{
		cout << i << endl;
		sleep(1);
	}
	
	system("clear");
	
	return 0;
}
Neonii
Inlägg: 59
Blev medlem: 03 sep 2008, 18:51
OS: Ubuntu
Utgåva: 16.04 Xenial Xerus LTS
Ort: Karlskrona

Re: Rensa skärm i C++, Geany

Inlägg av Neonii »

Konservburk skrev:
David Andersson skrev:Om du kan få ditt c++-program att skriva ut den där escape-sekvensen i terminalfönstret så bör fönstret rensas.

Kod: Markera allt

#include <iostream>
main() {
	std::cout << "\e[H\e[2J";
}
Jag har iofs brukat göra så här istället:

Kod: Markera allt

#include <iostream>
main() {
	std::cout << "\ec";
}
Men jag har ingen aning om det ena alternativet är bättre än det andra :P
Det funkade kanon, testade "std::cout << "\ec";" och allt funkade precis som det ska.

Tack för alla svar, nu blir det till att ta upp kodandet igen! ;)
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Rensa skärm i C++, Geany

Inlägg av Osprey »

Neonii skrev:Tack för det snabba svarent!

Mja, jag testade system("clear"); men får bara felmeddelandet

Kod: Markera allt

calculator.cpp:96: error: ‘system’ was not declared in this scope
Har annars hört att det är ett Windows-kommando, kan det stämma?
Testade och i ren C-kod funkar det alldeles utmärkt, C++ är jag för dålig på för att kunna säga varför det inte funkar där.

Kod: Markera allt

main() {
	system("clear");
}
Men hur som helt så har du ju fått det att funka nu ändå... :)
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
micke_nordin
Inlägg: 1539
Blev medlem: 21 aug 2008, 17:03
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Rensa skärm i C++, Geany

Inlägg av micke_nordin »

Osprey skrev:
Neonii skrev:Tack för det snabba svarent!

Mja, jag testade system("clear"); men får bara felmeddelandet

Kod: Markera allt

calculator.cpp:96: error: ‘system’ was not declared in this scope
Har annars hört att det är ett Windows-kommando, kan det stämma?
Testade och i ren C-kod funkar det alldeles utmärkt, C++ är jag för dålig på för att kunna säga varför det inte funkar där.

Kod: Markera allt

main() {
	system("clear");
}
Men hur som helt så har du ju fått det att funka nu ändå... :)
Jo det funkar även i c++, se ovan. Problemet var att han inte hade inkluserat rätt headerfil.

/Micke
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Rensa skärm i C++, Geany

Inlägg av Osprey »

micke_nordin skrev:Jo det funkar även i c++, se ovan. Problemet var att han inte hade inkluserat rätt headerfil.
Ok då vet jag det och det var jag som hade scrollat för dåligt för att se det... :)
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Neonii
Inlägg: 59
Blev medlem: 03 sep 2008, 18:51
OS: Ubuntu
Utgåva: 16.04 Xenial Xerus LTS
Ort: Karlskrona

Re: Rensa skärm i C++, Geany [LÖST]

Inlägg av Neonii »

Men annars har jag hört att man ska undvika "system("pause")", "system("clear")" osv. då de tar upp mycket prestanda från programmet.

Finns det någon sanning i detta?
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Rensa skärm i C++, Geany [LÖST]

Inlägg av Konservburk »

Neonii skrev:Men annars har jag hört att man ska undvika "system("pause")", "system("clear")" osv. då de tar upp mycket prestanda från programmet.

Finns det någon sanning i detta?
system("clear") forkar först ett skal, som i sin tur forkar själva kommandot "clear", så det blir ju två extra processer i onödan. Iofs inget problem om du bara gör det en enda gång, men du kanske vill undvika att göra det djupt nere i nästlade slingor.
Användarvisningsbild
micke_nordin
Inlägg: 1539
Blev medlem: 21 aug 2008, 17:03
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Rensa skärm i C++, Geany [LÖST]

Inlägg av micke_nordin »

Är cout << "\ec"; plattformsoberoende, dvs funkar det även i t.ex. windows? Vad gör kommandot exakt? system("clear"); anropar väl systemets mekanism för att rensa terminalfönstret, men vad gör cout << "\ec";? Att den skriver ut en escape-sekvens ser jag ju. men lite mer precist?

/Micke
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Rensa skärm i C++, Geany [LÖST]

Inlägg av Konservburk »

micke_nordin skrev:Är cout << "\ec"; plattformsoberoende, dvs funkar det även i t.ex. windows?
Själva escape-sekvensen är ANSI/ISO/ECMA-standard, men om den funkar i windows vet jag inte :P
micke_nordin skrev:Vad gör kommandot exakt?
Skiver <escape>-tecken följt av ett "c" till standard-ut.
micke_nordin skrev:system("clear"); anropar väl systemets mekanism för att rensa terminalfönstret,
system() forkar ett skal som sedan gör vad det vill med argumentet. Jag antar att windows använder "cmd.exe" som skal istället för /bin/sh. Sedan måste nog själva kommandot "clear" finnas, vilket det gör enligt posix. Men jag vet inte om windows tillhandahåller det kommandot.
micke_nordin skrev:men vad gör cout << "\ec";? Att den skriver ut en escape-sekvens ser jag ju. men lite mer precist?
Det där gör inget mer än att skriva escape-sekvensen till standard-ut. Det är sedan terminalen som tolkar escape-sekvensen och gör vad den finner lämpligt.
Användarvisningsbild
micke_nordin
Inlägg: 1539
Blev medlem: 21 aug 2008, 17:03
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Rensa skärm i C++, Geany [LÖST]

Inlägg av micke_nordin »

Konservburk skrev: Själva escape-sekvensen är ANSI/ISO/ECMA-standard, men om den funkar i windows vet jag inte :P
Och det escapesekvensen gör är alltså att först backa till början av teckenströmmen och sedan ta bort alla tecken (typ)?

/Micke
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Rensa skärm i C++, Geany [LÖST]

Inlägg av Konservburk »

micke_nordin skrev:
Konservburk skrev: Själva escape-sekvensen är ANSI/ISO/ECMA-standard, men om den funkar i windows vet jag inte :P
Och det escapesekvensen gör är alltså att först backa till början av teckenströmmen och sedan ta bort alla tecken (typ)?
Standarden säger inte mer än att <esc>c ska göra Reset to Initial State, men mer exakt vad det innebär är helt upp till terminalen. Den andra escape-sekvensen som vi hade uppe "\e[H\e[2J" gör däremot precis det du säger, dvs flyttar först markeren längst upp till vänster <esc>[H, och rensar sedan bort alla tecken <esc>[2J.

Om "\e[H\e[2J" motsvarar kommandot clear så motsvarar nog "\ec" mer kommandot reset.
Neonii
Inlägg: 59
Blev medlem: 03 sep 2008, 18:51
OS: Ubuntu
Utgåva: 16.04 Xenial Xerus LTS
Ort: Karlskrona

Re: Rensa skärm i C++, Geany [LÖST]

Inlägg av Neonii »

Borde lägga till att om man använder sig av

Kod: Markera allt

cout << "\ec";
för att rensa terminalen, så har kommandot en liten "bi-effekt", då den rensar / skriver om hela skärmen, vilket får den att blinka till. Sjukt irriterande då man buggtestar sitt program, och behöver navigera runt en hel del.

Om man istället använder

Kod: Markera allt

cout << "\e[H\e[2J";
som någon nämnde innan, så rensas endast terminalfönstret på sin text, och hela skärmen blinkar inte.

Tänkte det kunde vara bra att dela med sig av! :)

Happy coding!
David Andersson
Inlägg: 1269
Blev medlem: 15 dec 2007, 03:20
OS: Xubuntu

Re: Rensa skärm i C++, Geany [LÖST]

Inlägg av David Andersson »

Och nu när vi alla vet hur man gör "clear" i shell-script och C++-program så skulle jag vilja rekommendera: låt bli!

Eller, det beror på. Gör det inte slentrianmässigt.

En del lägger ett clear i början av sitt script, sen är resten av programmet ren text, text ut och promptar med text in. Det som händer då är att när man rullar tillbaka i terminalen så saknas 23 rader text. Kommandon man skrivit in tidigare och deras output är borta. Om scriptet eller C++-programmet är i huvudsak text-orienterat, låt det vara helt text-orienterat.
Skriv svar

Återgå till "Programmering och webbdesign"