🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: de.comp.lang.c++
6 messages
6 total messages Started by Sebastian Hentschel Tue, 13 Feb 1996 22:10
IOSTREAM.H
#1667
Author: Sebastian Hentschel
Date: Tue, 13 Feb 1996 22:10
64 lines
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
#1670
Author: Jochen Diener
Date: Thu, 15 Feb 1996 00:00
128 lines
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
#1641
Author: Dietmar Kuehl
Date: Thu, 15 Feb 1996 02:26
53 lines
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
#1644
Author: Dietmar Kuehl
Date: Fri, 16 Feb 1996 18:40
37 lines
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
#1575
Author: Jochen Diener
Date: Mon, 19 Feb 1996 00:00
50 lines
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
#1601
Author: Nico Josuttis
Date: Thu, 22 Feb 1996 13:08
33 lines
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