# [C++] 2 Cout aber gleiche Zeile, Zeilenfarbe ändern Konsole



## Asix (2. Mai 2009)

Tag auch,

mir ist gerade aus Langeweile ne Idee fürn Programm gekommen, welches ich jetzt verfeinern will(optisch).

1. Frage
Wie bekomme ich es hin, dass 2 Couts in der gleichen Zeile stehen? Bzw. dass das 2. Cout ("später" im Code) die Zeile des 1. ergänzt (hoffe ist verständlich beschrieben  )

2.Frage
Mit dem system("color "); Befehl kann man die Textfarbe ändern, mein Problem ist, dass ich aber nicht den gesamten Text färben will, sondern nur eine Zeile...

Vielen Dank im Vorraus
Asix


----------



## Marschal (2. Mai 2009)

Zu eins:

```
cout<< varilabe_eins << "Text, bla bla bla" << variable_2 << "bla bla bla"<<endl;
```
mit dem oparator "<<" kanst du immer stings und zeichenfolgen, oder auch variablen anhängen, beliebig oft. das "endl" ist wie ein Zeilen-Umbruch zu verstehen. Jedoch wenn du das "endl" weglässt und einen zweuten cout dranhängst, wird das zweite in eine separate Zeile geschreiben, deshalb empfehle ich dich immer mit einem cout pro zeile zu arbeiten

zu zwei, habe ich eine fertige Problemlösung für dich, doch hab ich jezt keine Zeit das anschaulich und verständlich zu erklären, bin heute um halb 10 wieder da, dan werd ich das mal versuchen schön zu erklären


----------



## Asix (2. Mai 2009)

Wow Danke für deine schnelle Antwort.

Mein Problem mit dem Cout ist ehr dieses:



> cout<<Zahl1<<" + "<<Zahl2<<" = ";
> float ErgebnisUser;
> cin>>ErgebnisUser;
> 
> ...


Selbstverstädlich nicht der ganze Code, nur zum Verständnis
:
Das ist n kleines Kopfrechenprogramm, (mir war eben grade langweilig ) Mein Problem ist, dass das "Richtig" aus dem If oben angehängt werden soll nach dem cin>>ErgebnisUser, da ist ja eig auch kein Zeilenumbruch drin, aber eben durch das Bestätigen des Ergebnises via "Enter" springt der Cursor weiter..


----------



## Marschal (2. Mai 2009)

Zum cout-Problem:
Ja, verstehe. Kenn ich^^ Du willst an eine vorhandene Bildschirm ausgabe eine User eingabe setzen. Das häte ich jezt Spontan auch keine Lösung zu, den cin sezt automatisch einen Umbruch nach der User-Eingabe. werde mich heut Abend noch mal drum kümmern


Zum Farbproblem:
Jede Zeile verschieden färben ist etwas aufwändiger, und wenn du ein Einsteiger bist, auch nicht, bzw. nur schwer zu verstehen, wie und was genau getan wird, deshalb schreibe ich jezt einfach wie du es anzuwenden hast, wenn ich genaueres dazu erklären soll, kann ich das nach Bedarf ja gerne tun


```
#include //deine Includes
...
//Farbe definieren
	WORD SetColor(WORD new_color)
{
	WORD old_color=0;
	HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_SCREEN_BUFFER_INFO csbi;
	GetConsoleScreenBufferInfo(hStdOut,&csbi);
	old_color = csbi.wAttributes;
	SetConsoleTextAttribute(hStdOut,new_color);

	return old_color;
}

...

main()
{

int ...
bool...
//deine Variablen deklaration zu der du noch hnzufügst:
WORD old_color = SetColor(FOREGROUND_GREEN|FOREGROUND_INTENSITY);

...

//Nun zum Einfärben. Vor jede Zeile, die du färben möchtest, musst du folgendes setzen:
SetColor(FOREGROUND_BLUE|FOREGROUND_INTENSITY);
/*Nun wird alles in Blau erscheinen, deshalb musst du entweder bei der nächsten Zeile eine neue Farbe setzen (Parameter: FOREGROUND_BLUE), oder nach der gefärbten Zeile auf die alte Farbe zurücksetzen, in dem du folgendes Hinzufügst:*/
SetColor(old_color);
}
```

so nochmal ein Konkretes Beispiel:

```
#include //deine Includes
...
//Farbe definieren
	WORD SetColor(WORD new_color)
{
	WORD old_color=0;
	HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_SCREEN_BUFFER_INFO csbi;
	GetConsoleScreenBufferInfo(hStdOut,&csbi);
	old_color = csbi.wAttributes;
	SetConsoleTextAttribute(hStdOut,new_color);

	return old_color;
}

...

main()
{
WORD old_color = SetColor(FOREGROUND_GREEN|FOREGROUND_INTENSITY);

string str_1 = "Hallo Welt!";

cout<< str_1; //Farbe: Standart

SetColor(FOREGROUND_BLUE|FOREGROUND_INTENSITY);
cout<< str_1; //Farbe: Gruen
SetColor(FOREGROUND_REDFOREGROUND_INTENSITY);
cout<< str_1; //Farbe: Rot
SetColor(old_color);
cout<< str_1; //Farbe: wieder Standart

...

return (0);
}
```


----------



## Asix (2. Mai 2009)

Jau dann warte ich mit dem 1. Problem natürlich ;-) 
Nur kein Stress.
Danke für die Farb Funktion, darfst mir gerne erklären wie genauer das Funktioniert


----------



## Skini (2. Mai 2009)

Ich hätte da folgende Idee:
Schreibe sämtliche Ausgaben/Eingaben in ein Array, das die Größe des Bildschirmes haben könnte. Dann wird ab und zu der Bildschirm gellert, und du gibst das Array Zeile für Zeile mit Cout aus. Kann natürlich sein dass das noch elganter geht, aber dass hier is ja auch nur ein Vorschlag.
Skini


----------



## Matthias Reitinger (2. Mai 2009)

Hallo,

vielleicht hilft hier die Funktion SetConsoleCursorPosition weiter. Die nächste Ausgabe nach dem Aufruf dieser Funktion sollte an der gesetzten Stelle im Konsolenfenster geschehen.

Grüße, Matthias


----------



## Marschal (2. Mai 2009)

So, da bin ich wieder.^^ Nun hier kamen ja schon Vorschläge zu deinem Problem, weitere hätt ich eigentlich nicht, aber in der Konsole ist das eh nicht so wichtig, wie es aussieht. Es geht rein mehr um die Logic. Die Optik wird erst ab der GUI-Anwendung interessant

Erklären, nungut, versuche es mal^^

Soooo: als erstes schreiben wir uns eine Funktion, die den Datentyp WORD als rückgabe wert erwarten. diese nennen wir "SetColor(WORD new_color)". Und wir sehen auch gleich, dass in den klammern eine Varialble "new_color" angelegt wird, und die Funktion SetColor somit auch beim Aufruf einen Parameter des Types WORD erwarten.
Anlegen des Funktionskopfes:

```
WORD SetColor(WORD new_color)
```
Aufruf der Funktion:

```
SetColor(/*Variable des Datentyps WORD*/)
```

Info: 
	
	
	



```
WORD ist zu vergleichen mit einem "unsigned short" und hat somit die Größe von 16bit. Also ist WORD eine zahl, ohne Vorzeichen:
```

So das zu WORD. Ab hier wird es lustiger

Ich werd es versuchen anhand von Kommentaren zu erklären

```
WORD old_color=0; /*Nochmal eine Variable des Typs WORD anlegen, die später als Speicher unserer "alten" Bildschirmfarbe dienen wird*/

    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); /*So, was ein HANDLE ist, wird schwieriger sein. Also nen HANDLE ist eine Datenstruktur. Nun ja schwierig zu erklären, Auf jeden Fall benötigst du ein solches, um wie z.b. hier auf unser Konsolen-Fenster zuzugreifen.*/
/*So, mit GetStdHandle holst du dir won Windoofs das entsprechende Handle zum Ein/Ausgabe. Also: (standard input, standard output, or standard error)*/
    CONSOLE_SCREEN_BUFFER_INFO csbi; /*CONSOLE_SCREEN_BUFFER_INFO ist eine Struktur, die den Buffer des Konsolenfenster beinhaltet, Somit alles was dein Fenster so anzeigt.*/

    GetConsoleScreenBufferInfo(hStdOut,&csbi); /*Damit verschaffst du dir praktisch zugriff auf dein Fenster-Buffer*/
    old_color = csbi.wAttributes;/*Hier holst du dir eine Variable aus der Fenster-Struktur, und speicherst diese für weitere Zwecke ab*/
    SetConsoleTextAttribute(hStdOut,new_color);/*Und hier wird nun endlich die Farbe an das HANDLE gegeben, und umgesezt*/

    return old_color;
```

Hoffe es ist was mit anzufangen Wenn ich irgendwo falsch liege, dan bitte ich mich zu korregieren, den auch ich will mehr wissen


----------



## devDevil (3. Mai 2009)

http://support.microsoft.com/?scid=kb;en-us;319883&x=18&y=8
http://msdn.microsoft.com/en-us/library/ms683171(VS.85).aspx 

Und nen Handle ist wohl eher ein Zeiger. (void*)


----------



## Marschal (3. Mai 2009)

> Und nen Handle ist wohl eher ein Zeiger. (void*)


Danke dir, war mir nicht sicher


----------



## Asix (3. Mai 2009)

So Danke Leute für eure vielen schnellen Antworten, werd mich mal ransetzen und es ausprobieren.


----------



## SouthernWind (7. Februar 2010)

Dieser Thread ist jetzt zwar schon etwas älter.... aber weil ich genau diese gleichen beiden Probleme habe frisch ich jetzt hier mal etwas auf  

Gibt es zu diesem ersten Problem hier angesprochenen Problem schon irgendeine Lösung?


Asix hat gesagt.:


> Mein Problem mit dem Cout ist ehr dieses:
> Das ist n kleines Kopfrechenprogramm. Mein Problem ist, dass das "Richtig" aus dem If oben angehängt werden soll nach dem cin>>ErgebnisUser, da ist ja eig auch kein Zeilenumbruch drin, aber eben durch das Bestätigen des Ergebnises via "Enter" springt der Cursor weiter..


Hab jetzt auch mal eine Zeit lang versucht und rumgespielt.... aber durch das Enter nach einer cin-Eingabe springt der Cursor nun mal eine Zeile runter....
GIbt es eine Möglichkeit dem Cursor zu sagen "Springe ans Ende der letzten Zeile!"..... oder so?! 

Und zum zweiten Problem mit der Lösung von Marshal


Marschal hat gesagt.:


> Zum Farbproblem:
> Jede Zeile verschieden färben ist etwas aufwändiger, und wenn du ein Einsteiger bist, auch nicht, bzw. nur schwer zu verstehen, wie und was genau getan wird, deshalb schreibe ich jezt einfach wie du es anzuwenden hast, wenn ich genaueres dazu erklären soll, kann ich das nach Bedarf ja gerne tun


Gibt es irgendwo eine Tabelle wo man sehen kann welche Farben es alles für die Konsolenausgabe gibt?
Ich habe z.B.
  FOREGROUND_WHITE
  FOREGROUND_BLACK
  FOREGROUND_SILVER
  FOREGROUND_YELLOW
und noch ein paar ausprobiert, aber die gehen nicht.


Würde mich über jede Hilfe sehr freuen! ;-)


----------



## Marschal (7. Februar 2010)

Hi

Sorry dass ich mich erst jetzt melde, war unterwegs und vom iPhone ist es nicht so dolle eine strukturierte Antwort zu geben.

Zum ersten Problem lautet deine Lösung: SetConsoleCursorPosition Function

laut MSDN Verwendung wie folgt:

```
BOOL WINAPI SetConsoleCursorPosition(
  __in  HANDLE hConsoleOutput, //Handle zu deiner Instanz
  __in  COORD dwCursorPosition //COORD ist eine Struktur, bestehend aus X und Y, somit kannst du den Cursor überall hin setzen
);
```

Zum Zweiten:
Hier alle Attribute (Quelle, wie immer MSDN):

```
Attribute			Meaning
FOREGROUND_BLUE			Text color contains blue.
FOREGROUND_GREEN		Text color contains green.
FOREGROUND_RED			Text color contains red.
FOREGROUND_INTENSITY		Text color is intensified.
BACKGROUND_BLUE			Background color contains blue.
BACKGROUND_GREEN		Background color contains green.
BACKGROUND_RED			Background color contains red.
BACKGROUND_INTENSITY		Background color is intensified.
COMMON_LVB_LEADING_BYTE		Leading byte.
COMMON_LVB_TRAILING_BYTE	Trailing byte.
COMMON_LVB_GRID_HORIZONTAL	Top horizontal.
COMMON_LVB_GRID_LVERTICAL	Left vertical.
COMMON_LVB_GRID_RVERTICAL	Right vertical.
COMMON_LVB_REVERSE_VIDEO	Reverse foreground and background attributes.
COMMON_LVB_UNDERSCORE		Underscore.
```

Hoffe ich konnte dir helfen


----------



## SouthernWind (7. Februar 2010)

Marschal hat gesagt.:


> Hi
> Zum ersten Problem lautet deine Lösung: SetConsoleCursorPosition Function
> 
> laut MSDN Verwendung wie folgt:
> ...



Ich danke Dir für die Antwort!! ;-)

Also damit schon mal zweites Problem gelöst 

Zum ersten nochmal.... ja das SetConsoleCursorPosition hab ich gesehen..... aber bin daraus nicht wirklich schlau geworden....
Soweit ich das verstanden habe kann man damit X-undY-Koordinaten geben wo der Cursor dann hinspringt.....
aber wenn jetzt in einem Programm dieser Punkt wo der Cursor hinspringen soll sich immer änder..... was dann Wie schon bei dem Threadstarter will ich in meinem Programm zu der gegebenen Eingabe in der gleichen Zeile sagen ob richtig oder falsch..... 
Hmmm.... ist sowas überhaupt in der Konsole möglich oder erwarte ich jetzt zu viel von der guten alten Windows-Konsole


----------



## Marschal (8. Februar 2010)

Hi. 

Nun ich weis nicht ob es fertige Funktionen gibt um die letzte cursorposition zu ermitteln, ansonsten kannst du dich doch eine Funktion basteln, die den Cursor jeweils setzt.
Kann nich mal später zu Hause schauen ob's da was gibt.

MfG Marschal


----------



## sheel (8. Februar 2010)

Die Funktion GetConsoleCursorPosition direkt gibts nicht-
dafür aber GetConsoleScreenBufferInfo, das unter anderem die Koordinaten liefert


----------



## SouthernWind (8. Februar 2010)

Marschal hat gesagt.:
			
		

> Hi.
> Nun ich weis nicht ob es fertige Funktionen gibt um die letzte cursorposition zu ermitteln, ansonsten kannst du dich doch eine Funktion basteln, die den Cursor jeweils setzt.
> Kann nich mal später zu Hause schauen ob's da was gibt.
> 
> MfG Marschal


Hmmm......ok werd ich mal schauen ob ich das hinkrieg..... bin halt noch nicht sooo lange dabei mit programmieren, vor allem C++....... ich versuchs!

Wäre super wenn Du etwas schauen kannst wenn Du etwas freie Zeit hast, danke Dir ;-)




			
				sheel hat gesagt.:
			
		

> Die Funktion GetConsoleCursorPosition direkt gibts nicht-
> dafür aber GetConsoleScreenBufferInfo, das unter anderem die Koordinaten liefert


Ich hab mir das GetConsoleScreenBufferInfo mal bei msdn angeschaut...... bin daraus nicht wirklich schlau geworden...... was liefert diese Funktion für einen Wert? 
Hab irgendwie nicht den Eindruck, dass es die Koordinaten der letzten Zeile schickt..... bzw. des letzten Zeichens in der letzten Zeile...... oder
Das Beispiel auf der Seite hab ich auch ausprobiert, aber das funktioniert bei mir nicht so richtig.... also startet zwar und alles.... aber da steht dann "Cannot scroll; the window is too close to the top." Hmmmm...........


----------



## sheel (8. Februar 2010)

Siehe http://msdn.microsoft.com/en-us/library/ms682093(VS.85).aspx
dwCursorPosition


----------



## Marschal (8. Februar 2010)

Hi, ich knüpfe mal an shell an:


```
//laut MSDN
typedef struct _CONSOLE_SCREEN_BUFFER_INFO {
  COORD      dwSize;
  COORD      dwCursorPosition;
  WORD       wAttributes;
  SMALL_RECT srWindow;
  COORD      dwMaximumWindowSize;
} CONSOLE_SCREEN_BUFFER_INFO;
```

hier siehst du, dass die Funktion eine Struktur zurück gibt. In der Struktur hast du verschiedene Member. Unter anderen deine Gesuchte Position des Cursors:

```
COORD      dwCursorPosition;
```
Wie du siehst ist der Typ COORD. COORD ist auch wiederum eine Struktur die die X und Y Coordinaten beinnhaltet.

Ich bin mir nicht ganz sicher welcher Operator für Strukturen verwendet wird, aber Microsoft sagt dir das schon.
Logisch müste es dan wie folgt aussehen um die Position des Cursors heraus zu finden:

```
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;

SHORT oldX = csbiInfo.dwCursorPosition.X;
SHORT oldY = csbiInfo.dwCursorPosition.Y;
```

hab den Code jetzt nicht programmiert. Hoffe du kommst klar, ansonsten hau ichs auch gern noch mal schnell im Compiler durch

MfG Marschal


----------



## SouthernWind (9. Februar 2010)

Ohje....also mit Strukturen hab ich bisher eigentlich noch gar nix gemacht...... nur mit Klassen.... dachte immer Strukturen wären so ne alte C-Geschichte, die von Klassen abgelöst wurden....

Wenn das für Dich wirklich nicht zu viel Arbeit ist, dann.....


Marschal hat gesagt.:


> hab den Code jetzt nicht programmiert. Hoffe du kommst klar, ansonsten hau ichs auch gern noch mal schnell im Compiler durch


...wäre es wirklich super wenn da ein ganz kleines Beispielirgendwas durch den Compiler jagen würdest 
Vielleicht kann ich das dann an einem Beispiel wenn ich sehe wie es funktioniert besser verstehen. Mit Debugger und so......

Danke! MFG


----------



## Marschal (9. Februar 2010)

hi, Hi hab mal was kompiliert


```
//Objekt der Struktur anlegen
	CONSOLE_SCREEN_BUFFER_INFO csbInfo; 

	//GetConsoleScreenBufferInfo(hStdout, &csbiInfo)
	//Mit dem Punkt-Operator durch die Strukturen gehen und durch & die Adressermittlung
	
	short *__w64 x = &csbInfo.dwCursorPosition.X;
	short *__w64 y = &csbInfo.dwCursorPosition.Y;
	
	printf("X: %d | Y: %d",x,y);
```
wenn du ein 32Bit system hast müsstest du einfach nur das "*__w64" wegmachen
So, ich hab dir mal den Zugriff auf die Variblem programmiert. Damit kannst du nun mal rumspielen

Falls noch Fragen sind versuch ich natürlich zu helfen

MfG Marschal


----------



## deepthroat (9. Februar 2010)

Hi.





Marschal hat gesagt.:


> ```
> short *__w64 x = &csbInfo.dwCursorPosition.X;
> short *__w64 y = &csbInfo.dwCursorPosition.Y;
> 
> ...


Warum einfach, wenn's auch komplizierter geht.. 

```
printf("X: %d | Y: %d", csbInfo.dwCursorPosition.X, csbInfo.dwCursorPosition.Y);
```
Gruß


----------



## Marschal (9. Februar 2010)

Nun, viel vereinfacht hast du in deinem Code ja nun auch nicht wirklich

Der Unterschied ist ja nur, das ich die Variablen zum Spieln zwischengespeichert hab


----------



## deepthroat (9. Februar 2010)

Marschal hat gesagt.:


> Nun, viel vereinfacht hast du in deinem Code ja nun auch nicht wirklich


Doch, für Anfänger-Maßstäbe schon.


Marschal hat gesagt.:


> Der Unterschied ist ja nur, das ich die Variablen zum Spieln zwischengespeichert hab


Ja, aber wie?! Wozu verwendest du da Zeiger?

Außerdem ist dein printf-Aufruf falsch, da du eben diese Zeiger übergibst, was sehr wahrscheinlich nicht zum richtigen Ergebnis führt - hast du das denn mal ausprobiert?

```
short x = csbInfo.dwCursorPosition.X;
short y = csbInfo.dwCursorPosition.Y;
printf("X: %d | Y: %d",x,y);
```
Gruß


----------



## Marschal (9. Februar 2010)

Also meins funktioniert, gibt aber die Adresse der Variable zurück. Sie muss also nur noch dereferenziert werden und dann läufts
daher ist deins also simpler, bin ich mit einverstanden

MfG


----------

