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 | |||||||||||||||||||