Thread View: de.comp.lang.c++
6 messages
6 total messages
Started by Sebastian Hentschel
Tue, 13 Feb 1996 22:10
IOSTREAM.H
Author: Sebastian Hentschel
Date: Tue, 13 Feb 1996 22:10
Date: Tue, 13 Feb 1996 22:10
64 lines
1229 bytes
1229 bytes
/*
Halloechen
Ich habe da folgende Frage.
Was verursacht eigentlich die Methode cout.put genau?
Schreibt sie das angegebene Zeichen aufden Bildschirm?
Oder, schreibt sie nur das Zeichen in einen Buffer in
cout der dann später(mit cout oder beim Programmende
oder bei dem nächsten Zugriff auf die Standart EIN bzw.
AUSGABE) ausgegeben wird.
Da ich nicht über diverse Büchersammlungen verfüge,
kann ich leider nicht nachsehen.
Vielleicht weiß ja jemand von euch bescheid,
Mein C++-Kursleiter wußte auf anhieb keine Erklärung.
*/
#include <iostream.h>
#include <conio.h>
#define EXAMPLE1
//#define EXAMPLE2
#ifdef EXAMPLE1
void main(void)
{
char Buchstabe;
cout << "\nBuchstabe : ";
cin >> Buchstabe;
cout.put(Buchstabe);
getch();
}
#endif
#ifdef EXAMPLE2
void main(void)
{
char Buchstabe;
cout << "\nBuchstabe : ";
cin >> Buchstabe;
cout.put(Buchstabe);
cout << Buchstabe;
getch();
}
#endif
Re: IOSTREAM.H
Author: Jochen Diener
Date: Thu, 15 Feb 1996 00:00
Date: Thu, 15 Feb 1996 00:00
128 lines
5677 bytes
5677 bytes
pyro@gumption.ruhr.de schrieb in der Mail vom 13.02.96
zum Thema "IOSTREAM.H":
pyro@gumption.ruhr.de schrieb in der Mail vom 13.02.96
zum Thema "IOSTREAM.H":
> Da ich nicht über diverse Büchersammlungen verfüge,
> kann ich leider nicht nachsehen.
Du brauchst keine Buechersammlung. Nur die Onlinehilfe, den Stroustrup und
die Draft. Zumindest den Stroustrup solltest du dir kaufen, auch wenn du ihn
jetzt am Anfang noch nicht voll nutzen kannst ist er allein schon wegen des
ARM das Geld wert (denke auch immer an den ANSI-Draft wenn du das ARM
liest).
> Mein C++-Kursleiter wußte auf anhieb keine Erklärung.
Das Problem ist nicht so einfach beantwortbar, aber sicherlich haette dein
Kursleiter eine oder mehrere Loesungsansaetzte liefern muessen. Oder macht
er selbst den Kurs erst zum ersten mal _mit_ ?
Streams:
#include <iostream.h>
#include <conio.h>
//#define EXAMPLE1
#define EXAMPLE2
#ifdef EXAMPLE1
void main(void)
{
char Buchstabe;
cout << "\nBuchstabe : ";
cin >> Buchstabe;
cout.put(Buchstabe);
// getch(); // Buchstabe erst nach Return ausgegeben da keiner
// genau sagen kann was da so passiert, weil du C und
// C++ mixt. Sollte man generell nie tun.
cin.get(); // Kaum macht mans richtig, schon gehts :-)
}
#endif
#ifdef EXAMPLE2
void main(void)
{
char Buchstabe;
cout << "\nBuchstabe : ";
cin >> Buchstabe;
cout.put(Buchstabe);
cout << Buchstabe; // es wird korrekterweise zweimal Buchstabe
// ausgegeben
// getch();
cin.get();
}
#endif
Zwar sollten die C-printf()-Familie mit den C++-Stream-I/O
gemeinsam verwendet werden koennen, da C und C++ oft gemischt werden, jedoch
wuerde ich mich nicht darauf verlassen. Denn es gibt auch einen ANSI-C
Standard der schon von den C-Compilern nie so ganz unterstuetzt wurde.
Auf obiges Problem angewandt. Wer welchen Puffer wie liest und wann ist
Implementierungssache und deshalb nicht vorhersagbar, deshalb solltest
Du getchar() druch cin.get() ersetze.
Genrell ist nur festgelegt dass cout.put() in den Ausgabesteam schreibt, der
Rest ist dann Sache des streams.
Noch etwas Background, schoene gruesse an den Kursleiter.
cout ist ein Objekt der Klasse ostream_withassign, und wird waehrend der
Initialisierung mit der Standard-Ausgabe verbunden. Der Unterschied zu cerr
und clog liegt in der internen Arbeitsweise. Bei cerr (Fehlerausgaben) ist
sichergestellt, dass bei einer Ausgabe ueber cerr kein Speicher vom Heap
geholt wird, so dass cerr auch bei Heapueberlauf funktioniert. Ferner sind
cerr und clog ungepuffert, d.h. auszugebende Daten werden ohne Zwischen-
speicherung an das Ziel weitergegeben.
Eine Pufferung erfolgt hauptsaechlich aus Performance Gruenden in
groesseren Einheiten, welche in den Streams zwischengepuffert werden. Bei
Eintreten bestimmter Bedingungen (z.B: Puffer voll) wird dieser dann ganz
weggeschrieben. Hierbei kann die Puffergroesse varieren, so dass es bei
verschiedenen Compilern und Systemen zu unterschiedlichen Zeitpunkten zur
Ausgabe des Puffers kommen kann.
Die Aufagabe der Pufferdatenblockverwaltung uebernehmen Ableitungen der
abstraken streambuf Klasse (z.B. stdiobuf <stdio.h>).
Die Standardstreams cin und cout sind verbunden (tied), so dass sichergestellt
ist, dass alle an cout uebergebenen Zeichen auch tatsaechlich auf
dem Bidschirm ausgegeben werden, bevor eine Eingabe ueber cin oder Ausgabe
ueber clog, cerr durchgefuehrt wird (Erklaerung fuer oben).
Dieses Verhalten koennte natuerlich auch von Compiler und System abhaengig
sein, so dass man es immer testen sollte (Anm. von jemand der portable
Programme schreibt und weis, dass alles anders ist wie es sein sollte).
Vielleicht baut ihr am besten im Kurs ein Arrayklasse die ihr ueber euren
eigenen stream ausgebt, dann kannst du es.
Ein Beispiel, das das Problem vielleicht noch etwas verdeutlicht und zum
Testen animieren soll:
ofstream myOut(0); //stdout
istream myIn(1); //stdin
int dummy;
myOut << endl << "Hallo";
myIn >> dummy;
myOut << "Dummy=" << dummy << endl;
Bei Programmstart ist der Bildschirm leer weil "Hallo" noch im Puffer von
myOut steht, obwohl myIn schon auf Daten von der Tastatur wartet. Erst am
Programmende (Destruktor aufruf) wird der Puffer ausgegeben.
Loesung:
a) explizit leeren mit
myOut << endl << "Hallo" << flush;
b) Eine tie zwischen myIn und myOut
myIn.tie(&myOut);
So und nun probieren und testen...
Falls du eine Anspruchvolle Anwendung fuer deine eigene Streamklasse suchst,
ueberlege dir mal wie du eine Streamklasse aufbauen wuerdest die Objekte
(einfache Datentypen, Beaume, Listen, bel. Klassen) persistent abspeichert
(denke auch an virtuelle Funktionen und Pointerstrukturen) und als Schmankerl
diese noch binaerkompatibel, zum Datenaustausch zwischen verschiedenen
Betriebssystemen, abspeichern kann....
Hoffe dein Kopf qualmt nicht zu sehr, bis dann
Jochen
--
Es gibt keine Probleme nur Loesungen! Nur werden die meist zu Problemen...:-)
Mail: j.diener@hit.handshake.de
Re: IOSTREAM.H
Author: Dietmar Kuehl
Date: Thu, 15 Feb 1996 02:26
Date: Thu, 15 Feb 1996 02:26
53 lines
2458 bytes
2458 bytes
Hi,
Sebastian Hentschel (pyro@gumption.ruhr.de) wrote:
: Ich habe da folgende Frage.
: Was verursacht eigentlich die Methode cout.put genau?
: Schreibt sie das angegebene Zeichen aufden Bildschirm?
: Oder, schreibt sie nur das Zeichen in einen Buffer in
: cout der dann später(mit cout oder beim Programmende
: oder bei dem nächsten Zugriff auf die Standart EIN bzw.
: AUSGABE) ausgegeben wird.
'ostream::put(char)' schreibt das entsprechende Zeichen in einen Buffer
(ein Objekt einer Klasse, die von 'streambuf' abgeleitet ist). Fuer
'cout' bedeutet das, dass das Zeichen bis zum naechsten 'sync()' dort
verweilt und NICHT ausgegeben wird. Ein 'sync()' passiert allerdings
recht oft, z.B. zum Zeilenende. Man kann den Buffer explizit mit der
externen Repraesentation synchronisieren, indem man 'ostream::flush()'
aufruft bzw. indem man 'flush' in den Stream schreibt:
cout.put('a');
cout.flush();
cout.put('b');
cout << flush;
Fuer eine genau Beschreibung dessen, was vor sich geht, empfehle ich
"The (Draft) Standard C++ Library", P.J.Plauger, Prentice Hall. Das
Buch passt leider nicht mehr genau zum DWP, aber beschreibt fuer weite
Teile der (zukuenftigen) ISO C++ Standard Library die relevanten
Mechanismen. Gute C++ Kenntnisse sind allerdings schon notwendig, um
das Buch locker lesen zu koennen...
: Da ich nicht über diverse Büchersammlungen verfüge,
: kann ich leider nicht nachsehen.
Das kann sich ja aendern...
: Mein C++-Kursleiter wußte auf anhieb keine Erklärung.
Hat euch der Kursleiter sowas wie unten beigebracht?
: #ifdef EXAMPLE1
: void main(void)
^^^^
Es gibt nur zwei portable Deklarationen von 'main()':
int main();
int main(int ac, char *av[]);
Alles andere sind nicht portable Erweiterungen. Insbesondere liefert
'main()' immer einen 'int'.
--
dietmar.kuehl@uni-konstanz.de
http://www.informatik.uni-konstanz.de/~kuehl
I am a realistic optimist - that's why I appear to be slightly pessimistic
Re: IOSTREAM.H
Author: Dietmar Kuehl
Date: Fri, 16 Feb 1996 18:40
Date: Fri, 16 Feb 1996 18:40
37 lines
2075 bytes
2075 bytes
Hi,
Jochen Diener (j.diener@hit.handshake.de) wrote:
: Noch etwas Background, schoene gruesse an den Kursleiter.
: cout ist ein Objekt der Klasse ostream_withassign, und wird waehrend der
^^^^^^^^^^^^^^^^^^
Diese Klasse gibt es nach dem DWP nicht mehr. Wenn man einen Stream
umleiten will, dann muss man, mit einer Standard konformen
Implementation von IOstreams 'rdbuf()' verwenden:
void f(ostream &rep)
{
cout.rdbuf(rep.rdbuf());
}
: Vielleicht baut ihr am besten im Kurs ein Arrayklasse die ihr ueber euren
: eigenen stream ausgebt, dann kannst du es.
Da die Implementation einer (guten, sicheren) Arrayklasse weit entfernt
von einfach ist, wuerde ich davon abraten, eine Arrayklasse in einem
C++-Kurs zu implementieren. Ausserdem braucht man fuer eine sinnvolle
Arrayklasse einige "advanced C++ features" wie 'raw-memory' anlegen,
'placement new' und explizite Destruktoraufrufe.
: Ein Beispiel, das das Problem vielleicht noch etwas verdeutlicht und zum
: Testen animieren soll:
: ofstream myOut(0); //stdout
: istream myIn(1); //stdin
... ist nicht portabel: Es gibt fuer 'ofstream()' nach DWP keinen
Konstruktor, der einen 'int' als Argument bekommt. Und 'myIn' soll
vermutlich ein Objekt der Klasse 'ifstream' sein... Aber auch das ist
unportable, funktioniert aber wenigstens mit einigen Libraries.
--
dietmar.kuehl@uni-konstanz.de
http://www.informatik.uni-konstanz.de/~kuehl
I am a realistic optimist - that's why I appear to be slightly pessimistic
Re: IOSTREAM.H
Author: Jochen Diener
Date: Mon, 19 Feb 1996 00:00
Date: Mon, 19 Feb 1996 00:00
50 lines
3062 bytes
3062 bytes
kuehl@uzwil.informatik.uni-konstanz.de schrieb in der Mail vom 16.02.96
zum Thema "Re: IOSTREAM.H":
> : cout ist ein Objekt der Klasse ostream_withassign, und wird waehrend der
> ^^^^^^^^^^^^^^^^^^
> Diese Klasse gibt es nach dem DWP nicht mehr. Wenn man einen Stream
> umleiten will, dann muss man, mit einer Standard konformen
> Implementation von IOstreams 'rdbuf()' verwenden:
>
> void f(ostream &rep)
> {
> cout.rdbuf(rep.rdbuf());
> }
Du hast natuerlich recht, aber eigentlich wollte ich nur mal schnell
noch ein Beispiel in die Tastatur hacken, das zum Probieren animieren
sollte.
> : Vielleicht baut ihr am besten im Kurs ein Arrayklasse die ihr ueber euren
> : eigenen stream ausgebt, dann kannst du es.
> Da die Implementation einer (guten, sicheren) Arrayklasse weit entfernt
^^^^^^^^^^^^^^^^^
> von einfach ist, wuerde ich davon abraten, eine Arrayklasse in einem
> C++-Kurs zu implementieren. Ausserdem braucht man fuer eine sinnvolle
> Arrayklasse einige "advanced C++ features" wie 'raw-memory' anlegen,
> 'placement new' und explizite Destruktoraufrufe.
Natuerlich soll er keine kommerzielle Version schreiben und dann
Klassenbibliotheken wie der LEDA Konkurrenz machen oder gar eine
portable Garbage Collection implementieren.
Aber eine einfache Implementierung macht IMHO viele Probleme klar die bei
einer kommerziellen Implementierung auftreten und koennen so im
Kurs mit einem hoffentlich kompetenten Kursleiter diskutiert werden,
anstatt alleine zu Hause mit ein paar Buechern zu kapitulieren...
> ... ist nicht portabel: Es gibt fuer 'ofstream()' nach DWP keinen
> Konstruktor, der einen 'int' als Argument bekommt. Und 'myIn' soll
> vermutlich ein Objekt der Klasse 'ifstream' sein... Aber auch das ist
> unportable, funktioniert aber wenigstens mit einigen Libraries.
Abgesehen davon, dass es nur ein schnell getipptes Beispiel war sollte
man sich darueber im klaren sein, dass nicht immer alle Compiler alle
Features und Bibliotheksfunktionen implementiert haben, geschweige denn,
dass sie so funktionieren wie sie sollten. Aus diesem Grunde ist man
auch oft gezwungen mit zusaetzlichen Layern zu arbeiten und manchmal
Dinge zu implementieren die evtl. sogar auf nur einem Compiler laufen.
Trotzdem ist dein Hinweis natuerlich angebracht.
Bis dann
Jochen
--
Mail: j.diener@hit.handshake.de
Re: IOSTREAM.H
Author: Nico Josuttis
Date: Thu, 22 Feb 1996 13:08
Date: Thu, 22 Feb 1996 13:08
33 lines
1796 bytes
1796 bytes
In article <312299dd.0@news.uni-konstanz.de>, Dietmar Kuehl <dietmar.kuehl@uni-konstanz.de> wrote: >... >Fuer eine genau Beschreibung dessen, was vor sich geht, empfehle ich >"The (Draft) Standard C++ Library", P.J.Plauger, Prentice Hall. Das >Buch passt leider nicht mehr genau zum DWP, aber beschreibt fuer weite >Teile der (zukuenftigen) ISO C++ Standard Library die relevanten >Mechanismen. Gute C++ Kenntnisse sind allerdings schon notwendig, um >das Buch locker lesen zu koennen... Oh nein, dieses Buch wird dem Anspruch "beschreibt fuer weite Teile der (zukuenftigen) ISO C++ Standard Library die relevanten Mechanismen" nach meiner Meinung wirklich nicht gerecht. Wenn schon ein Buch zu dem Problem, dann das von Bernd Eggink bei Hanser erschienene zur I/O--Stream-Bibliothek. Ansonsten wird sicher bald etwas kommen ... >: Da ich nicht über diverse Büchersammlungen verfüge, >: kann ich leider nicht nachsehen. > >Das kann sich ja aendern... > >: Mein C++-Kursleiter wußte auf anhieb keine Erklärung. > Vielleicht solte sich zumindest Dein Kursleiter mal ein paar geeignete Buecher ansehen. Schoenen Gruss von mir, ich haette da ein paar Tips. Tschau -- Nico address: BREDEX GmbH, Nicolai Josuttis email: nico@bredex.de Fallersleber-Tor-Wall 23 phone: +49 531 24330-0 D-38100 Braunschweig fax: +49 531 24330-99 Germany
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads