Sida 1 av 1
Rensa skärm i C++, Geany [LÖST]
Postat: 10 dec 2008, 01:51
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
Re: Rensa skärm i C++, Geany
Postat: 10 dec 2008, 02:04
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...
Re: Rensa skärm i C++, Geany
Postat: 10 dec 2008, 02:18
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).
Re: Rensa skärm i C++, Geany
Postat: 10 dec 2008, 02:23
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
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?
Re: Rensa skärm i C++, Geany
Postat: 10 dec 2008, 03:24
av David Andersson
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:
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.
Re: Rensa skärm i C++, Geany
Postat: 10 dec 2008, 03:31
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

Re: Rensa skärm i C++, Geany
Postat: 10 dec 2008, 09:25
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.
alternativt
Re: Rensa skärm i C++, Geany
Postat: 10 dec 2008, 09:39
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;
}
Re: Rensa skärm i C++, Geany
Postat: 10 dec 2008, 12:45
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

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!

Re: Rensa skärm i C++, Geany
Postat: 10 dec 2008, 13:39
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.
Men hur som helt så har du ju fått det att funka nu ändå...

Re: Rensa skärm i C++, Geany
Postat: 10 dec 2008, 13:49
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.
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
Re: Rensa skärm i C++, Geany
Postat: 10 dec 2008, 13:52
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...

Re: Rensa skärm i C++, Geany [LÖST]
Postat: 10 dec 2008, 14:17
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?
Re: Rensa skärm i C++, Geany [LÖST]
Postat: 10 dec 2008, 14:26
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.
Re: Rensa skärm i C++, Geany [LÖST]
Postat: 10 dec 2008, 14:36
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
Re: Rensa skärm i C++, Geany [LÖST]
Postat: 10 dec 2008, 15:08
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
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.
Re: Rensa skärm i C++, Geany [LÖST]
Postat: 10 dec 2008, 15:37
av micke_nordin
Konservburk skrev:
Själva escape-sekvensen är ANSI/ISO/ECMA-standard, men om den funkar i windows vet jag inte
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
Re: Rensa skärm i C++, Geany [LÖST]
Postat: 10 dec 2008, 15:57
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
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.
Re: Rensa skärm i C++, Geany [LÖST]
Postat: 11 dec 2008, 19:50
av Neonii
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!
Re: Rensa skärm i C++, Geany [LÖST]
Postat: 11 dec 2008, 20:43
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.