Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

stdiobuf Spezialisierung von iostream auf stdio-FILE-Objekte

&pagelevel(3)&pagelevel


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>
#include <stdiostream.h>
#include <stdio.h>

class stdiobuf : public streambuf

{

public:


stdiobuf(FILE* f);

FILE *

stdiofile();

virtual

virtual int
virtual int

˜stdiobuf();

overflow(int c=EOF);
pbackfail(int c);

virtual streampos


seekoff(streamoff, ios::seek_dir, int);

virtual
virtual int

int sync();
underflow();

};

class stdiostream : public ios

{

public:


stdiostream(FILE*);


˜stdiostream();

stdiobuf *

rdbuf();

};



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

  • std vom Typ stdiobuf ist.
  • sts vom Typ stdiostream ist.
  • fp vom Typ FILE * ist.

Konstruktoren

stdiobuf(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-Elemente

FILE * 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-Element

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


filebufistream, ostream, sbufpub