Forum: PC-Programmierung Formatierte Textausgabe in C


von Benedikt (Gast)


Lesenswert?

Kann es sein, dass es in C (z.B. bei einer Win32 Konsolenanwendung)
nicht möglich ist, den Textcursor an eine bestimmte Stelle zu setzen,
oder den Bilschirm zu löschen ?

von Dominik Tewiele (Gast)


Lesenswert?

Bildschirm löschen:

system("cls");


Cursor setzen, farbige Texte:

siehe conio.h


Dominik

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

C selbst definiert derartige Funktionen überhaupt nicht.

Unter DOS wurden von einigen Compilerherstellern nichtportable
Funktionen à la gotoxy() etc. mitgeliefert, die aber eben nicht
portierbar waren und unter Win32 nicht existieren.

Ein anderer Ansatz war die Verwendung von ANSI.SYS und die Ausgabe
steinzeitlicher Terminalsteuercodes; auch das ist ein unter Win32 nicht
verwendbarer Ansatz.

Wenn gezielt Win32-Konsolanwendungen entwickelt werden sollen, können
die dafür vorgesehenen Console-API-Funktionen verwendet werden.

Vor einiger Zeit gab es hier schon mal eine Diskussion zum Thema:
http://www.mikrocontroller.net/forum/read-8-218292.html#218292

darin hat René König einen netten Wrapper um die Microsoft'schen
Konsolfunktionen gepostet
http://www.tbkoenig.de/files/conioex/CONIOEX.ZIP

Hier ein Auszug aus der beigelegten Readme.txt:

Zur Zeit sind folgende Funktionen implementiert:
void clrscr(void);            // Bildschirm löschen
void clreol(void);            // Zeile von der aktuellen CursorPosition
an löschen
void gotoxy(int x, int y);    // Cursor an die Koordinaten (x, y)
bewegen
int  wherex(void;)            // X-Koordinate des Cursors ermitteln
int  wherey(void);            // Y-Koordinate des Cursors ermitteln
void insline(void);           // Zeile einfügen
void delline(void);           // Zeile entfernen
void textcolor(int color);    // Textfarbe setzen
void textbackground(int clr); // Hintergrundfarbe des Textes setzen
void textattr(int attr);      // Text/Hintergrundfarbe in einem Rutsch
setzen
void highvideo(void);         // Hohe Intensität für folgende Ausgaben
setzen
void lowvideo(void);          // Niedrige Intensität für folgende
Ausgaben setzen
void _setcursortype(int cur); // Cursorform festlegen

von Rolf Magnus (Gast)


Lesenswert?

> Ein anderer Ansatz war die Verwendung von ANSI.SYS und die Ausgabe
> steinzeitlicher Terminalsteuercodes; auch das ist ein unter Win32
> nicht verwendbarer Ansatz.

Wieso "steinzeitlich"? Die wurden halt nur unter Dos nie verwendet,
weil man da blödsinnigerweise erst explizit einen Treiber laden mußte.
Auf den meisten anderen Betriebssystemen sind die Escape-Sequenzen
praktisch Standard. Sie werden allerdings normalerweise nicht direkt
verwendet, sondern über Libraries.

> Wenn gezielt Win32-Konsolanwendungen entwickelt werden sollen,
> können die dafür vorgesehenen Console-API-Funktionen verwendet
> werden.

Und wenn sie portabel sein sollen, nimmt man ncurses.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

"auf den meisten anderen BS" heißt wohl: Unter *nix. Was da auch kein
wirkliches Wunder ist, da dieses OS sehr, sehr alt ist und durchaus
noch mit echten seriellen Terminals gearbeitet wurde, als das
Escape-Sequenzen-Konzept entwickelt wurde.
Wenn man das richtig nutzt, muss man termcap auswerten, da ja nicht
jedes Terminal ANSI- oder VT100-Kompatibel ist. Es gab ja noch zig
andere Terminals, die alle ihre eigenen "Sprachen" verwendeten, VT52,
TVI950, irgendwelche Tektronix-Terminals, Cybernex, 'ne echte Teletype
...

Ich finde das steinzeitlich.

Gibt es von ncurses eine native win32-Portierung, die kein cygwin
erfordert?

von Benedikt (Gast)


Lesenswert?

Danke, die CONIOEX Funktionen laufen echt super !
Irgendwann muss ich doch mal mit echter Windowsprogrammierung anfangen,
aber bis dahin reichen die Funktionen hoffentlich.

von Rolf Magnus (Gast)


Lesenswert?

> "auf den meisten anderen BS" heißt wohl: Unter *nix.

Naja, fast jedes außer Windows ist ja heute in irgendeiner Form von
*nix abgeleitet, egal ob Linux, Solaris, FreeBSD, MacOS, QNX, ...

> Was da auch kein wirkliches Wunder ist, da dieses OS sehr, sehr
> alt ist und durchaus noch mit echten seriellen Terminals
> gearbeitet wurde, als das Escape-Sequenzen-Konzept entwickelt
> wurde.

Und das kann man auch heute noch. Und eine Verbindung über Telnet/ssh
funktioniert wohl auch nicht viel anders.

> Wenn man das richtig nutzt, muss man termcap auswerten, da ja
> nicht jedes Terminal ANSI- oder VT100-Kompatibel ist. Es gab ja
> noch zig andere Terminals, die alle ihre eigenen "Sprachen"
> verwendeten, VT52, TVI950, irgendwelche Tektronix-Terminals,
> Cybernex, 'ne echte Teletype

Allerdings. Das ist das schöne an ncurses. Das kümmert sich automatisch
drum und unterstützt alle nur erdenklichen Terminal-Typen.

> Ich finde das steinzeitlich.

Ich finde, daß es eine praktische Lösung ist, die man nicht wegwerfen
muß, nur weil sie schon lange existiert. Ist natürlich nicht optmial,
daß es so viele verschiedene Varianten gibt.

> Gibt es von ncurses eine native win32-Portierung, die kein cygwin
> erfordert?

Gute Frage. Gurgeln nach "ncurses windows" bringt nicht viel, weil
man dann immer nur erfährt, daß man in ncurses auch Fenster im
Textmodus machen kann.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ja, die ncurses-Frage stellte ich, weil auch ein "gurgeln" (schön!)
nach "ncurses win32" keine wahre Erhellung brachte.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.