Rensa skärm i C++, Geany [LÖST]
-
- 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]
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
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.
- 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
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...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
-
- Inlägg: 1269
- Blev medlem: 15 dec 2007, 03:20
- OS: Xubuntu
Re: Rensa skärm i C++, Geany
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).
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).
-
- 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
Tack för det snabba svarent!
Mja, jag testade system("clear"); men får bara felmeddelandet
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
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:
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?
Mja, jag testade system("clear"); men får bara felmeddelandet
Kod: Markera allt
calculator.cpp:96: error: ‘system’ was not declared in this scope
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

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)
Är det någonting jag missar?
-
- Inlägg: 1269
- Blev medlem: 15 dec 2007, 03:20
- OS: Xubuntu
Re: Rensa skärm i C++, Geany
Det är X-programmering (X11, X-Window). Grafiska program. En helt annan skola än jag clear i kommandoraden.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![]()
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.Neonii skrev: Jag testade att köra "clear | less", men fick bara fram:
samt en blinkande markör efter (END)-et. Kan inte end avbryta kommandot med ctrl + c, eller stänga ner terminalen med ctrl + d.Kod: Markera allt
ESC[HESC[2J (END)
Är det någonting jag missar?
- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
Re: Rensa skärm i C++, Geany
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";
}
Kod: Markera allt
#include <iostream>
main() {
std::cout << "\ec";
}

Re: Rensa skärm i C++, Geany
För att system ska fungera måste du lägga till include-filen cstdlib högst upp.Neonii skrev:Mja, jag testade system("clear"); men får bara felmeddelandetKod: Markera allt
calculator.cpp:96: error: ‘system’ was not declared in this scope
Kod: Markera allt
#include <cstdlib>
Kod: Markera allt
#include <cstdlib.h>
- 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
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.David Andersson skrev:Jag vet inget om Geany men antagligen accepterar den samma styrsekvenser som en terminal (som xterm, urxvt eller terminalen i ubuntu).
/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;
}

-
- 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
Det funkade kanon, testade "std::cout << "\ec";" och allt funkade precis som det ska.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.Jag har iofs brukat göra så här istället:Kod: Markera allt
#include <iostream> main() { std::cout << "\e[H\e[2J"; }
Men jag har ingen aning om det ena alternativet är bättre än det andraKod: Markera allt
#include <iostream> main() { std::cout << "\ec"; }
Tack för alla svar, nu blir det till att ta upp kodandet igen!

- 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
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.Neonii skrev:Tack för det snabba svarent!
Mja, jag testade system("clear"); men får bara felmeddelandetHar annars hört att det är ett Windows-kommando, kan det stämma?Kod: Markera allt
calculator.cpp:96: error: ‘system’ was not declared in this scope
Kod: Markera allt
main() {
system("clear");
}

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...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
- 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
Jo det funkar även i c++, se ovan. Problemet var att han inte hade inkluserat rätt headerfil.Osprey skrev: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.Neonii skrev:Tack för det snabba svarent!
Mja, jag testade system("clear"); men får bara felmeddelandetHar annars hört att det är ett Windows-kommando, kan det stämma?Kod: Markera allt
calculator.cpp:96: error: ‘system’ was not declared in this scope
Men hur som helt så har du ju fått det att funka nu ändå...Kod: Markera allt
main() { system("clear"); }
/Micke

- 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
Ok då vet jag det och det var jag som hade scrollat för dåligt för att se det...micke_nordin skrev:Jo det funkar även i c++, se ovan. Problemet var att han inte hade inkluserat rätt headerfil.

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...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
-
- 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]
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?
Finns det någon sanning i detta?
- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
Re: Rensa skärm i C++, Geany [LÖST]
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.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?
- 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]
Ä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
/Micke

- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
Re: Rensa skärm i C++, Geany [LÖST]
Själva escape-sekvensen är ANSI/ISO/ECMA-standard, men om den funkar i windows vet jag intemicke_nordin skrev:Är cout << "\ec"; plattformsoberoende, dvs funkar det även i t.ex. windows?

Skiver <escape>-tecken följt av ett "c" till standard-ut.micke_nordin skrev:Vad gör kommandot exakt?
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:system("clear"); anropar väl systemets mekanism för att rensa terminalfönstret,
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.micke_nordin skrev:men vad gör cout << "\ec";? Att den skriver ut en escape-sekvens ser jag ju. men lite mer precist?
- 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]
Och det escapesekvensen gör är alltså att först backa till början av teckenströmmen och sedan ta bort alla tecken (typ)?Konservburk skrev: Själva escape-sekvensen är ANSI/ISO/ECMA-standard, men om den funkar i windows vet jag inte![]()
/Micke

- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
Re: Rensa skärm i C++, Geany [LÖST]
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.micke_nordin skrev:Och det escapesekvensen gör är alltså att först backa till början av teckenströmmen och sedan ta bort alla tecken (typ)?Konservburk skrev: Själva escape-sekvensen är ANSI/ISO/ECMA-standard, men om den funkar i windows vet jag inte![]()
Om "\e[H\e[2J" motsvarar kommandot clear så motsvarar nog "\ec" mer kommandot reset.
-
- 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]
Borde lägga till att om man använder sig av
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
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!
Kod: Markera allt
cout << "\ec";
Om man istället använder
Kod: Markera allt
cout << "\e[H\e[2J";
Tänkte det kunde vara bra att dela med sig av!

Happy coding!
-
- Inlägg: 1269
- Blev medlem: 15 dec 2007, 03:20
- OS: Xubuntu
Re: Rensa skärm i C++, Geany [LÖST]
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.
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.