Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
19.11.2001, 23:32
Tomz



ok, zwei ganz kurze fragen, die mir den umstieg von c auf c++ erleichtern sollen (nur wenn sie beantwortet werden)

1. Wie kann ich in c++ formatieren im stil von zb
printf("%4i ist %-14",x,s);
ich habe keine ahnung, wie man das mit dem cout lösen soll

2. wie kann ich effizient ein einzelnes ascii zeichen ausgeben?
ich meine etwa so:
cout << 223 << endl;
nur dann soll er mir das zeichen ausgeben, welches die zahl im ascii system darstellt.
ich weiss, wie man es mit einer funktion lösen .könnte, doch für was das rad neu erfinden...
thnx for help

--

...denn das atombrot wird nicht ruhen bis es den letzten erwischt hat...

zum Seitenanfang zum Seitenende Profil || Suche
001
20.11.2001, 08:10
gerk



1.ich weiß nicht iwe das mit dme formatiern gaeht, aber afaik geht printf auch unter c++ mit den entsprchenden lib's.

--

„Und da wir uns ja seit heute etwas näher gekommen sind, kann ich nur sagen: Mir hilft da immer Norther volle Lautstärke (so wie jetzt), sodass die ganzen unrasierten, Wasserpfeife rauchenden, alternativen Wichsstudenten aus ihren, aus Bananenschalen und Abfall gebastelten, Sitzkissen fliegen.“

zum Seitenanfang zum Seitenende Profil || Suche
002
20.11.2001, 08:20
Zeeke



1. Warum willst du überhaupt cout benutzen? Bleib doch beim guten printf()...

2. cout << (char) 223 << endl;

--

zum Seitenanfang zum Seitenende Profil || Suche
003
20.11.2001, 08:38
gerk



man ich sollte weniger tippfehler machen *grrr*

@dr. zeeke: mit () bekommt man man den ascii von 223?

--

„Und da wir uns ja seit heute etwas näher gekommen sind, kann ich nur sagen: Mir hilft da immer Norther volle Lautstärke (so wie jetzt), sodass die ganzen unrasierten, Wasserpfeife rauchenden, alternativen Wichsstudenten aus ihren, aus Bananenschalen und Abfall gebastelten, Sitzkissen fliegen.“

zum Seitenanfang zum Seitenende Profil || Suche
004
20.11.2001, 11:36
TheTinySteini



Nein, die Klammern allein machen es nicht, das char dazwischen ist schon wichtig =)
Damit wird halt die Zahl 223 als char behandelt (gecastet), fertich!

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
005
20.11.2001, 13:47
Kriz



zu 1.)

Als erstes weiß ich nicht, was %-14 bewirken soll, da der Formatierungstyp fehlt. Ich gehe mal davon aus, daß da ebenfalls i stehen soll (%-14i). Drösel ich mal dein printf() auf:

%4i bedeutet also einen Integerwert mit mindestens 4 auszugebenden Zeichen. Ist die Breite des Integerwerts kleiner als 4 Zeichen, werden dementsprechend (4 - Breite) mal Leerzeichen vorangestellt. Das schafft man in C++ so:Quellcode:cout << setw(4) << x;Das Makro setw(Breite) stammt aus <iomanip.h>.

%-14i bedeutet einen Integerwert linksbündig (-) mit 14 Feldbreiten auszugeben. In C++ geht das so:Quellcode:cout << setiosflags(ios::left) << setw(14) << s << resetiosflags(ios::left);Die C-Funktion printf("%4i ist %-14i",x,s); wird in C++ dann so dargestellt:Quellcode:#include <iostream.h>
#include <iomanip.h>

...
cout << setw(4) << x << " ist " << setiosflags(ios::left) << setw(14) << s << resetiosflags(ios::left);
cout << ends; // Kann nie schaden =)
...
Das resetiosflags(flag) muß man setzen, falls die Formatierung nur begrenzt sein soll wie zum Beispiel in HTML <h1>...</h1>. Welche Vorgehensweise man bevorzugt, bleibt natürlich jedem selber überlassen. Manche sehen in printf(); den kürzeren Weg, andere in cout den komfortableren Weg...

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)


Dieser Beitrag wurde am 20.11.2001 um 13:48 von Kriz bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
006
20.11.2001, 13:49
Zeeke



Zitat:
Kriz postete
Welche Vorgehensweise man bevorzugt, bleibt natürlich jedem selber überlassen. Manche sehen in printf(); den kürzeren Weg, andere in cout den komfortableren Weg...
Also ich sehe ehrlich gesagt in printf() den kürzeren und komfortableren Weg..

--

zum Seitenanfang zum Seitenende Profil || Suche
007
20.11.2001, 13:52
Kriz



Da cout zu den Streams gehört (und printf() nicht), ist cout im Nachhinein wesentlich komfortabler als das simple printf()! Das merkt man spätestens bei komplexen I/O-Prozessen...

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
008
20.11.2001, 14:55
Tomz



thnx @ kriz und die anderen. das hab ich gesucht. ich dachte schon, ich müsste bei c bleiben...

--

...denn das atombrot wird nicht ruhen bis es den letzten erwischt hat...

zum Seitenanfang zum Seitenende Profil || Suche
009
20.11.2001, 16:35
Prefect



Zitat:

Da cout zu den Streams gehört (und printf() nicht), ist cout im Nachhinein wesentlich komfortabler als das simple printf()! Das merkt man spätestens bei komplexen I/O-Prozessen...

Rufe aus der Menge: Beispiel! Beispiel! Beispiel!

:P

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
010
20.11.2001, 16:59
Kriz



Bissu jeck? Ich bastel doch mal hier nicht eben ein komplexes Streamverarbeitungsprogramm :)

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
011
20.11.2001, 20:02
gerk



@ttt: ja das mit dem char war schon klar, ich meinte iegtnlich, ob die klammern das verursachen.
@ thread: hat außer mir schon jmd was von
puts gehört:
Quellcode:
int main ()
{
puts ("Hallo Welt!");
endl;
}

--

„Und da wir uns ja seit heute etwas näher gekommen sind, kann ich nur sagen: Mir hilft da immer Norther volle Lautstärke (so wie jetzt), sodass die ganzen unrasierten, Wasserpfeife rauchenden, alternativen Wichsstudenten aus ihren, aus Bananenschalen und Abfall gebastelten, Sitzkissen fliegen.“

zum Seitenanfang zum Seitenende Profil || Suche
012
20.11.2001, 20:31
Zeeke



Jo klar schonmal von puts gehört, aber afaik kann man doch da einfach nur einfachen Text in den stdout schieben... also noch viel simpler als printf.. eigentlich ist puts fast gar nicht zu gebrauchen würde ich sagen...

--

zum Seitenanfang zum Seitenende Profil || Suche
013
20.11.2001, 21:12
Another1



klar ist es zu gebrauchen, printf macht es nur evtl ein wenig überflüssig.
puts is aber auf jeden fall schneller ... falls es jemand drauf anlegt :P

also: "überflüssig" != unbrauchbar;

--

Another1

...relaxing..atm =)
... und Schweiz suckt!

zum Seitenanfang zum Seitenende Profil || Suche
014
21.11.2001, 10:15
Archangel



außerdem fügt puts noch ein \n an..
(wen's interessiert... *g*)

btw: cout sux0rt :p
außerdem, falls du ne function schreibst, die eine unbestimmte zahl an parametern hat (z.B.: void error(const char *fmt, ...)), geht das AFAIK nit mit cout (besser gesagt: cerr oder wie das heißt...), da musst du schon vfprintf(stderr, fmt, ap) nehmen...

--

Mar 01 01:10:13 <voice> jo
Mar 01 01:10:40 <voice> bis dann ^^
Mar 01 01:11:20 <Archangel> jo
**** ENDING LOGGING AT Tue Mar 1 01:58:13 2005


Dieser Beitrag wurde am 21.11.2001 um 10:16 von Archangel bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
015
21.11.2001, 10:51
Kriz



Archangel... Archangel... Archangel...
Was hat die variable Parameterliste mit cerr oder cout am Hut?

Wie? Nix? Ja sowas aber auch... :p

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
016
21.11.2001, 12:01
Archangel



ne, aber wenn du ne eigene funktion schreibst, der eine unbestimmte zahl an argumenten übergeben wird, benutzt du dann in der funktion cout oder vprintf ? :p

--

Mar 01 01:10:13 <voice> jo
Mar 01 01:10:40 <voice> bis dann ^^
Mar 01 01:11:20 <Archangel> jo
**** ENDING LOGGING AT Tue Mar 1 01:58:13 2005

zum Seitenanfang zum Seitenende Profil || Suche
017
21.11.2001, 15:02
Kriz



vprintf() ist nur ein Hilfsmittel für stdout. Also man kann das auch durchaus mit cout realisieren, wenn man nicht faul ist =)

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
018
21.11.2001, 15:30
Archangel



WENN *g*

--

Mar 01 01:10:13 <voice> jo
Mar 01 01:10:40 <voice> bis dann ^^
Mar 01 01:11:20 <Archangel> jo
**** ENDING LOGGING AT Tue Mar 1 01:58:13 2005

zum Seitenanfang zum Seitenende Profil || Suche
019
22.11.2001, 14:30
Prefect



Dann müßte man aber das Rad neu erfinden, und genau das will C++ doch eigentlich vermeiden. Oder?

Du bist mir übrigens immer noch ein Beispiel schuldig.
Da du dazu wahrscheinlich aber eh nicht in der Lage bist, will ich dir mal meinen Standpunkt erklären. Wahrscheinlich werden so Argumente kommen a la:
Ich hab extrem komplexes Objekt O, das sich immer in einem bestimmten String darstellt. Du argumentierst jetzt natürlich, man sollte da sowas verwenden:

cout << "Das Objekt ist: " << O;

Leider ist dieser Code ziemlich unübersichtlich und sozusagen losgetreten von jeglicher venünftiger Syntax. Das folgende ist ja wohl viel deutlicher:
printf("Das Objekt ist: ");
object_print(O); // oder von mir aus auch O->print()

Denn da weiß man, was der Computer eigentlich macht. Das <<-Konstrukt ist was für so Sprachen wie Basic oder Java oder so von mir aus, aber nichts für eine _reine_ Programmiersprache.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
020
22.11.2001, 15:54
Tron



ich bevorzuge cout und konsorten, da hat man typensicherheit

int lala = 0;
printf("ein kleiner test: %s", lala);
(%s steht doch fuer string?)

und schon malt printf die interrupt-vektor-tabelle auf den bildschirm :D

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
021
22.11.2001, 18:34
Kriz



Prefect, in aller Ehre, aber was du jetzt da von dir gegeben hast, ist irgendwie Schwachsinn! Das Ausgabemakro cout erfüllt viele wichtige Dinge, die C nichtmal im Ansatz richtig beherrscht. Mal davon ausgegangen, daß cout je nach Zuführungsstream den Datentyp korrekt erkennt und absichert, ist die globalisierte Verwendung von I/O-Streams bei allen Kategorien von Streams (File, stdout, stdin usw.) ein mittlerweile unentbehrliches und zeitsparendes Hilfsmittel geworden. Es fördert die Übersichtlichkeit innerhalb von Quelltexten weitaus mehr als printf und seine Derivate! Beispiel? Ok:
Quellcode:printf("blablabla...hsisdk...ksdksjkd..%d..khgjdfhgj"
......."%s....dumdidum...hjfjdfjd...%c"
usw. über etliche Zeilen
......."hsfhsgff..fgkjdfg...%f........", x, y, z, floatvar);

Das sieht in meinen geschulten Augen nicht sehr übersichtlich aus (wie ich aus leidvollen Codeanalysen von C Programmen selber erfahren mußte)! Das hier hat irgendwie was Elegantes und Sinnigeres an sich:
Quellcode:cout << "blablabla...hsisdk...ksdksjkd.."
.....<< x
.....<< "..khgjdfhgj"
.....<< y
.....<< "....dumdidum...hjfjdfjd..."
.....<< z
.....<<
usw.
.....<< "hsfhsgff..fgkjdfg..."
.....<< floatvar
.....<< "........";

Aber da du ja anscheinend unbelehrbar zu sein scheinst, will ich dir den Spaß an deinen printf's nicht verwehren. Btw: Deine unqualifizierte Bemerkung anfangs habe ich wohlwollend überlesen, ich finde, daß haben wir untereinander nicht nötig, oder?

Nun aber zu dem Problem mit der variablen Parameterliste und cout. Was zum Henker soll daran schwer sein, die va_list direkt in der entsprechenden Funktion/Methode durch cout an stdout ausgeben zu lassen? Ob ich nun die formatierte Ausgabe vprintf() überlasse (und nicht sicher sein kann, ob das auch alles so klappt - hrhr) oder ob ich die Sache via cout und seinen Manipulatoren "manuell" (und sicherer) steuer, ist doch nun wirklich gehüpft wie gesprungen! Tatsache ist, daß C++ diesen Aspekt (nämlich die variable Parameterliste) eben C überläßt und seinen Funktionen. Aber damit erfinde ich das Rad nicht neu, sondern mache das vorhandene Rad eben sicherer und stabiler.

Und nun laßt mich bloß in Ruhe mit diesem Müll, es gibt wirklich wichtigere Dinge als sich über die Vorgehensweise bei diesen Dingen zu beschäftigen :p

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
022
22.11.2001, 20:08
Archangel



lol, man kann sich aber auch aufregen..

btw:
printf("blablabla...hsisdk...ksdksjkd..%d..khgjdfhgj"
......."%s....dumdidum...hjfjdfjd...%c"
usw. über etliche Zeilen
......."hsfhsgff..fgkjdfg...%f........", x, y, z, floatvar);

klar is das unübersichtlich, aber ich sehen von der übersichtlichkeit von:

printf("blablabla...hsisdk...ksdksjkd..%d..khgjdfhgj", x);
printf(".......%s....dumdidum...hjfjdfjd...%c", y, z);
printf(.....);
printf("hsfhsgff..fgkjdfg...%f.......", floatvar);

keine größeren Unterschiede zu deinem cout code...

aber..
wer gibt schon solche strings aus? ;)

[edit]
ok, brauchst es nich zu beachten, wenns dich so aufregt..

--

Mar 01 01:10:13 <voice> jo
Mar 01 01:10:40 <voice> bis dann ^^
Mar 01 01:11:20 <Archangel> jo
**** ENDING LOGGING AT Tue Mar 1 01:58:13 2005


Dieser Beitrag wurde am 22.11.2001 um 20:08 von Archangel bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
023
22.11.2001, 23:04
Kriz



Löl

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
024
23.11.2001, 14:29
Prefect



Hmm.
Folgendes: Bei dem IRC-Bot, den ich zur Zeit programmiere, habe ich ein simples aber effektives Log-System einprogrammiert, was mir ermöglicht, Log-Messages einfach so auszugeben:

Quellcode:
log(MAIN_LOG, LOG_WARN, "Blablah: %s", string);

Die Funktion log() erstellt mir dann eine Zeile in einer Logdatei die in etwa so aussieht:
[23.11.2001 13:59] (warn) Blablah: Der übergebene String

So weit, so gut.
Die Funktion log() hat natürlich eine variable Parameterliste, und intern wird die Ausgabe über eine va_list und vfprintf() geregelt. Das Ganze braucht (wenn man mal die Timestamp und so wegläßt) vielleicht 5 Zeilen.

Wenn man das ganze jetzt OOP-mässig mit Streams handelt hat man eigentlich
nur drei Möglichkeiten:

1. Die beste Möglichkeit wäre es, wenn die Streams eine Funktion format() mitbringen würden, mir der sich vprintf()-mässige Ausgaben regeln lassen (haben sie das?).

2. Man könnte den Formatstring eigenhändig parsen und dementsprechend die Argumente nach und nach in <<-Manier an den String übergeben. Allerdings erfindet man das Rad neu (genau das, was OOP ja vermeiden will), oder

3. Man reserviert einen temporären Puffer, in den man per vsnprintf() den Parameter formatiert. Den Puffer übergibt man dann in <<-Manier an den Stream.

Die einzige Lösung, die <<-Overloads vernünftig verwendet ist #3. Leider hat diese Lösung einen Bug: Wenn die Zeile zu lang wird, gehen Zeichen am Ende verloren.

Natürlich könnte man das Problem nun aber auch anders gehen. Denkbar wäre vielleicht ein Design a la:

main_log << LOG_WARN << "Blablah: " << string << end_of_log_line;

Die Frage ist, was für einen Typ hat main_log? Es wäre für mich nur sehr schwer möglich, main_log eine Ableitung einer Streamsklasse zu machen. Das liegt an mehreren Dingen, unter anderem:
- Log-Meldungen müssen evtl. dupliziert werden (z.B. in die Konsole _und_ in eine Logfile)
- Zwei verschiedene Logarten müssen in die gleiche Datei umgeleitet werden, wobei allerdings jedes Log eine unterschiedliche Logmask (also geloggte Meldungslevel) verwenden.

Unter diesen Voraussetzungen hat eine solche <<-Implementierung folgende Nachteile:
A. Ich müßte praktisch alle <<-Overloads erneut deklarieren (hatten wir das Rad nicht schonmal?)
B. Ich erhalte eine unintuitive Benutzung der LOG_xxx-Konstanten, denn eine Übergabe von LOG_WARN bringt sowohl die Timestamp als auch das (warn) in den Stream
C. Die Welt geht unter, sobald jemand einmal das end_of_log_line vergißt.

Ich darf dich darauf hinweisen, daß dieses Beispiel ja wohl alles andere als an den Haaren herbei gezogen wurde, während dein Chaosstring von oben doch als ein sehr seltsames Beispiel anmutet.

Übrigens habe ich generell nichts gegen Operator-Overloads wenn ich denn mal C++ programmiere, aber ich bin nunmal der Ansicht, daß << bitte ein Shift-Left-Operator bleiben sollte.

Ein Argument für die <<-Methode ist übrigens, daß sie ein kleines Bißchen schneller ist als printf() (zumindest wenn sie ordentlich implementiert wurde). Dafür erzeugt sie aber auch einen sehr viel größeren Code als ein Aufruf von printf().

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche