In diesem Abschnitt wird die Klasse stdiobuf beschrieben, eine spezialisierte streambuf-Klasse, die sich mit der Ein-/Ausgabestruktur FILE (Operationen auf hoher Ebene) beschäftigt. stdiobuf sollte immer dann eingesetzt werden, wenn Quellcode in C und C++ in einem Programm gemeinsam verwendet wird. Neuerer Quellcode in C++ sollte filebuf-Objekte einsetzen. #include <iostream.h> class stdiobuf : public streambuf { public:
}; class stdiostream : public ios { public:
}; | |||||||||||||||||||
Die auf stdiobuf angewendeten Operationen werden in der zugehörigen FILE-Struktur reflektiert. Ein stdiobuf-Objekt wird im ungepufferten Modus angelegt, wodurch alle Operationen sich sofort auch in der zugehörigen FILE-Struktur auswirken. Aufrufe der Funktionen seekg() und seekp() werden in Aufrufe von fseek() umgewandelt. Die Funktion setbuf() besitzt ihre übliche Bedeutung; wenn hierdurch ein Reservierungsbereich bereitgestellt wird, wird auch die Pufferung wieder aktiviert. Für die folgende Beschreibung wird angenommen, dass
Konstruktorenstdiobuf(FILE * fp) Ein stdiobuf-Objekt wird im ungepufferten Modus angelegt und mit fp verknüpft. stdiostream(FILE * fp) Es wird ein stdiostream-Objekt konstruiert und mit fp verknüpft. stdiobuf-ElementeFILE * fp = std.stdiofile() Der mit stdiobuf verknüpfte Dateizeiger wird geliefert. int l = std.overflow(int c) Wenn die mit dem stdiobuf verknüpfte Datei geschlossen ist oder c=EOF, wird EOF geliefert. Ansonsten wird putc() aufgerufen und sein Returnwert zurückgeliefert. int l = std.pbackfail(int c) Der Wert von ungetc() wird geliefert. streampos sp = std.seekoff(streamoff p, ios::seek_dir d, int l) Der Parameter l wird ignoriert. Der Returnwert von dem entsprechenden fseek()-Aufruf wird zurückgeliefert. int l = std.sync() Wenn die letzte Operation ein Schreibzugriff war, wird fflush() aufgerufen. Der Returnwert von fseek() auf die aktuelle Position wird zurückgeliefert. int l = std.underflow() Wenn die mit dem stdiobuf verknüpfte Datei geschlossen ist oder das Dateiende erreicht ist, wird EOF geliefert. Ansonsten wird das nächste Zeichen zurückgeliefert. stdiostream-Elementstdiobuf * std = sts.rdbuf() Es wird ein Zeiger auf das stdiobuf-Objekt geliefert, das mit sts verknüpft ist. | |||||||||||||||||||
BEISPIEL | Im folgenden Programm wird die Datei #TEMP geöffnet. Daraufhin wird eine Variable vom Typ stdiobuf mit der Datei verknüpft und eine Meldung ausgegeben, ob die Verknüpfung des stdiobuf-Objektes mit der Datei gelungen ist. #include <stdiostream.h>
#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>
int main()
{
FILE *qw;
const char * const name = "#TEMP";
if (!(qw = fopen(name, "w")))
{
cerr << "kann Datei " << name << " nicht oeffnen.\n";
exit(1);
}
stdiobuf s(qw);
FILE *rt = s.stdiofile();
if (rt != qw)
{
cerr << "Fehler in stdiofile().\n";
}
else
{
cerr << "stdiofile() funktioniert korrekt.\n";
}
return 0;
}
Das Ergebnis der Programmausführung ist: stdiofile() funktioniert korrekt. % CCM0998 Verbrauchte CPU-Zeit: 0.0086 Sekunden Das Programm zeigt, dass die Elementfunktion stdiofile() von stdiobuf in diesem Fall das korrekte Ergebnis liefert. | ||||||||||||||||||
SIEHE AUCH | |||||||||||||||||||