Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

istream Formatierte und unformatierte Eingabe

&pagelevel(3)&pagelevel


In diesem Abschnitt werden die istream-Elementfunktionen und verwandte Funktionen zur formatierten und unformatierten Eingabe beschrieben.


#include <iostream.h>

typedef long streamoff, streampos;

class ios
{
public:

enum seek_dir {beg, cur, end};
enum open_mode {in, out, ate, app, trunc, nocreate, noreplace,

bin, tabexp};

/* Flags zur Formatsteuerung */
enum
{

skipws=01,
left=02, right=04, internal=010,
dec=020, oct=040, hex=0100,
showbase=0200, showpoint=0400,
uppercase=01000, showpos=02000,
scientific=04000, fixed=010000,
unitbuf=020000, stdio=040000

};

// siehe ios, dort finden Sie weitere Klassenelemente ...

};

class istream : virtual public ios

{

public:

istream(streambuf*);

virtual
int
istream&
istream&
istream&
istream&
istream&
int
istream&
istream&
istream&
int
int
istream&
istream&
istream&
istream&
istream&
int
streampos
istream&
istream&
istream&
istream&
istream&
istream&
istream&
istream&
istream&
istream&
istream&
istream&
istream&
istream&
istream&

˜istream();
gcount();
get(char* ptr, int len, char delim=’\n’);
get(unsigned char* ptr,int len, char delim=’\n’);
get(unsigned char&);
get(char&);
get(streambuf& sb, char delim =’\n’);
get();
getline(char* ptr, int len, char delim=’\n’);
getline(unsigned char* ptr, int len, char delim=’\n’);
ignore(int len=1,int delim=EOF);
ipfx(int need=0);
peek();
putback(char);
read(char* s, int n);
read(unsigned char* s, int n);
seekg(streampos);
seekg(streamoff, ios::seek_dir);
sync();
tellg();
operator>>(char*);
operator>>(char&);
operator>>(short&);
operator>>(int&);
operator>>(long&);
operator>>(float&);
operator>>(double&);
operator>>(unsigned char*);
operator>>(unsigned char&);
operator>>(unsigned short&);
operator>>(unsigned int&);
operator>>(unsigned long&);
operator>>(streambuf*);
operator>>(istream& (*)(istream&));
operator>>(ios& (*)(ios&));

};

class istream_withassign : public istream

{

public:


istream_withassign();

virtual

˜istream_withassign();

istream_withassign&

operator=(istream&);

istream_withassign&

operator=(streambuf*);

};

extern istream_withassign cin;

istream&
ios&
ios&
ios&

ws(istream&);
dec(ios&);
hex(ios&);
oct(ios&);


istream-Objekte unterstützen die Interpretation von Zeichen, die aus einem assoziierten streambufObjekt entnommen werden. Dieser Vorgang wird üblicherweise als Eingabe  oder Extraktionsoperation bezeichnet.

Für die folgenden Beschreibungen wird angenommen, dass

  • ins ein istream-Objekt ist.
  • sb vom Typ streambuf* ist.

Konstruktoren und Zuweisung

istream(streambuf* sb)

Die ios-Statusvariablen werden initialisiert, und der Puffer sb wird mit istream verknüpft.

istream_withassign()

Es erfolgt keine Initialisierung. Das istream_withassign-Objekt ist nicht verwendbar, solange es nicht durch eine Zuweisung initialisiert wurde.

istream_withassign inswa;
streambuf * sb;
inswa=sb

sb wird mit inswa verknüpft, und der gesamte Status von inswa wird initialisiert.

istream_withassign inswa;
inswa=ins

ins.rdbuf() wird mit inswa verknüpft und der gesamte Status von inswa initialisiert.

Eingabepräfixfunktion

int i = ins.ipfx(int need)

Wenn der Fehlerstatus von ins ungleich 0 ist, wird direkt der Wert 0 geliefert. Falls notwendig (auch dann wenn der Fehlerstatus ungleich 0 ist), wird jedes mit ins verknüpfte ios-Objekt geleert (siehe Beschreibung von ios::tie() im Abschnitt zu ios).Das "Leeren" wird als notwendig erachtet, wenn entweder need==0 ist oder wenn weniger als need Zeichen direkt verfügbar sind. Wenn ios::skipws in ins.flags() gesetzt und need gleich 0 ist, wird führender Zwischenraum aus ins extrahiert.

ipfx() liefert den Wert 0, wenn ein Fehler beim Überspringen des Zwischenraumes auftritt. Im anderen Fall wird ein Wert ungleich 0 zurückgegeben.

Die Funktionen für die formatierte Eingabe rufen ipfx(0) auf, während die Funktionen fürdie unformatierte Eingabe den Aufruf ipfx(1) verwenden (siehe unten).

Funktionen für die formatierte Eingabe (Extraktoren)

istream ins; ins>>x

ipfx(0) wird aufgerufen. Wenn das Ergebnis ungleich 0 ist, werden Zeichen aus ins extrahiert und entsprechend dem Typ von x umgewandelt. Der umgewandelte Wert wird in x gespeichert. Ein Fehler wird gemeldet, indem der Fehlerstatus von insgesetzt wird. Bei gesetztem ios::failbit entsprachen die in ins enthaltenen Zeichen nicht dem geforderten Typ. Ein gesetztes ios::badbit zeigt an, daß die Zeichenextraktion fehlgeschlagen ist. Es wird immer ins geliefert.

Die Einzelheiten der Umwandlung hängen von den Werten der Formatstatusflags und Variablen (siehe ios ) von ins und vom Typ von x ab. Extraktoren sind für die folgenden Typen definiert; die Umwandlungsregeln werden hier ebenfalls beschrieben.

x kann einer der folgenden Datentypen sein:

char*, unsigned char*

Die Zeichen werden in dem Feld abgelegt, auf das x zeigt, bis in ins ein Zwischenraumzeichen auftritt. Das beendende Zwischenraumzeichen verbleibt in ins. Wennins.width() ungleich 0 ist, wird der resultierende Wert als Größenangabe für das Feld verwendet, und es werden nicht mehr als ins.width()-1 Zeichen extrahiert. Ein beendendes Nullzeichen (0) wird immer gespeichert (auch wenn aufgrund des Fehlerstatus von ins keine anderen Operationen vorgenommen werden). ins.width() wird auf 0 zurückgesetzt.

char&, unsigned char&

Ein Zeichen wird extrahiert und in x gespeichert.

short&, unsigned short&,
int&, unsigned int&,
long&, unsigned long&

Die Zeichen werden extrahiert und in einen Ganzzahlwert umgewandelt. Die Umwandlung erfolgt entsprechend den Formatflags von ins. Die umgewandelten Zeichen werden in x gespeichert. Das erste Zeichen kann ein Vorzeichen (+ oder -) sein. Hiernach wird die Umwandlung entweder oktal, dezimal oder hexadezimal ausgeführt, abhängig davon ob ios::oct, ios::dec oder ios::hex in ins.flags() gesetzt ist. Die Umwandlung wird durch das erste Zeichen beendet, das keine Ziffer ist.Oktale Ziffern sind die Zeichen 0 bis 7, dezimale Ziffern setzen sich aus den oktalen Ziffern plus den Zeichen 8 und 9 zusammen, und hexadezimale Ziffern bestehen aus den dezimalen Ziffern zuzüglich der Buchstaben a bis f (entweder in Klein- oder Großschreibung). Wenn keine Konvertierungsbasis in den Formatflags gesetzt ist, wird die Zahl entsprechend den lexikalischen Konventionen von C++ interpretiert: Es wird eine hexadezimale Umwandlung vorgenommen, wenn die ersten Zeichen (nach einem optionalen Vorzeichen) 0x oder 0X sind. Ist das erste Zeichen 0,wird eine oktale Umwandlung ausgeführt. In allen anderen Fällen kommt es zu einer dezimalen Umwandlung. ios::failbit wird gesetzt, wenn keine Ziffern verfügbar

sind (die Ziffer 0 in 0x oder 0X bei einer Hexadezimalumwandlung zählt hierbei nicht als Ziffer).

float&, double&

Die Zeichen werden entsprechend der Syntax von C++ für float- oder double-Werte umgewandelt und das Ergebnis in x gespeichert. ios::failbit wird gesetzt,wenn in ins keine Ziffern verfügbar sind oder wenn die Angabe nicht mit einer korrekt gebildeten Gleitkommazahl beginnt.

Hinweis

skipws sollte während der Extraktion numerischer Werte gesetzt bleiben. Anderenfalls kann ein Fehler auftreten.

Typ und Name der Extraktionsoperationen wurde gewählt, um eine komfortable Syntax für Folgen von Eingabeoperationen bereitzustellen. Das Operator-Overloading in C++ermöglicht die Deklaration von Extraktionsfunktionen für benutzerdefinierte Klassen. Die Operationen können die gleiche Syntax wie die hier beschriebenen Elementfunktionen aufweisen.

ins>>sb

Wenn ios.ipfx(0) einen Wert ungleich 0 liefert, werden Zeichen aus ios extrahiert undin sb eingefügt. Die Extraktion wird beendet, wenn das Dateiende EOF erreicht ist. Es wird immer ins zurückgegeben.

Funktionen für die unformatierte Eingabe

Diese Funktionen rufen ipfx(1) auf und werden nur weiter abgearbeitet, wenn das Ergebnis des Aufrufs ungleich 0 ist:

istream * insp=&ins.get(char * ptr, int len, char delim)

Es werden Zeichen extrahiert und in einem Byte-Feld, das bei ptr beginnt und lenbyte lang ist, gespeichert. Die Extraktion wird beendet, wenn das Zeichen delim gefunden wird (delim wird in ins belassen und nicht gespeichert), wenn in ins keine weiteren Zeichen vorliegen oder wenn im Feld nur noch ein freies Byte verbleibt. get() speichert immer ein abschließendes Nullzeichen, auch wenn aufgrund des Fehlerstatus keine Zeichen aus ins entnommen wurden. ios::failbit wird nur gesetzt, wenn get() das Ende der Datei erreicht, bevor ein Zeichen gespeichert wurde.

istream * insp=&ins.get(char & c)

Es wird ein einzelnes Zeichen extrahiert und in c gespeichert.

istream * insp=&ins.get(streambuf & sb, char delim)

Zeichen werden aus ins.rdbuf() extrahiert und in sb gespeichert. Der Vorgang wirdbeendet, wenn das Dateiende erreicht ist, ein Speicherversuch in sb fehlschlägt oderdas Zeichen delim (verbleibt in ins) gefunden wird. ios::failbit wird gesetzt, wenn die Funktion wegen eines fehlerhaften Speicherversuches in sb abgebrochen wird.

int i=ins.get()

Ein Zeichen wird extrahiert und geliefert. i ist EOF, wenn bei der Zeichenextraktion das Dateiende erreicht wird. ios::failbit wird nie gesetzt.

istream * insp=&ins.getline(char * ptr, int len, int delim)

Diese Funktion entspricht der Funktion ins.get(char * ptr, int len, char delim) mit der Ausnahme, dass auch das beendende delim-Zeichen aus ins entnommen wird.Wenn delim nach der Extraktion von genau len Zeichen auftritt, wird die Beendigung für das vollständig gefüllte Feld ausgeführt, und delim verbleibt in ins.

istream * insp=&ins.ignore(int n, char d)

Es werden bis zu n Zeichen extrahiert und verworfen. Die Extraktion wird vorzeitig beendet, wenn das Zeichen d entnommen wird oder das Ende der Datei erreicht ist.Wenn d gleich EOF ist, kann hierdurch niemals eine Beendigung hervorgerufen werden.

istream * insp=&ins.read(char * ptr, int n)

Es werden n Zeichen extrahiert und in dem bei ptr beginnenden Feld abgelegt. Beim Erreichen des Dateiendes vor der Extraktion von n Zeichen speichert read den bislang extrahierten Teil und setzt ios::failbit. Die Anzahl der extrahierten Zeichen kann über ins.gcount() bestimmt werden.

Weitere Elementfunktionen

int i=ins.gcount()

Es wird die Anzahl der Zeichen, die von der letzten Funktion für unformatierte Eingabe extrahiert wurden, geliefert. Funktionen für die formatierte Eingabe können Funktionen für die unformatierte Eingabe aufrufen und dadurch den gelieferten Wert ändern.

int i=ins.peek()

Zu Beginn der Funktionsausführung wird ins.ipfx(1) aufgerufen. Wenn der Aufruf den Wert 0 liefert oder das Dateiende von ins erreicht ist, wird EOF zurückgegeben. Im anderen Fall wird das nächste Zeichen geliefert, ohne es dabei zu extrahieren.

istream * insp=ins.putback(char c)

Es wird versucht, den Zeiger get von ins.rdbuf() zurückzuschieben, um das Zeichenc erst zu einem späteren Zeitpunkt zu lesen. c muß das Zeichen vor dem Zeiger sein.(Sofern keine andere Operation auf ins.rdbuf() angewendet wurde, ist c das letzte aus ins entnommene Zeichen.) Ist dies nicht der Fall, so ist das Verhalten der Funktion nicht definiert. putback() kann fehlschlagen (in diesem Fall wird der Fehlerstatus gesetzt). Obwohl es sich um eine Elementfunktion von istream handelt, entnimmt putback() niemals Zeichen, so daß auch kein Aufruf von ipfx() ausgeführt wird. Wenn der Fehlerstatus ungleich 0 ist, gibt die Funktion die Kontrolle ohne weitere Operationen zurück.

int i=ins.sync()

Die internen Datenstrukturen und die externe Zeichenquelle werden synchronisiert. Die virtuelle Funktion ins.rdbuf()->sync() wird aufgerufen, so daß die Details des Funktionsaufrufs von der abgeleiteten Klasse abhängig sind. Beim Auftreten eines Fehlers wird EOF geliefert.

ins>>manip

Diese Zeile entspricht manip(ins). Syntaktisch weist die Zeile zwar das Erscheinungsbild einer Extraktoroperation auf, in semantischer Hinsicht wird aber eine beliebige Operation (statt der Umwandlung einer Zeichenfolge und Speicherung des Ergebnisses in manip) ausgeführt. Der vordefinierte Manipulator ws wird im folgenden noch beschrieben.

Elementfunktionen für die Positionierung

istream& insp=ins.seekg(streamoff off, ios::seek_dir dir)

Der Zeiger get von ins.rdbuf() wird neu positioniert. Weitere Erläuterungen zur Positionierung finden Sie im Abschnitt zu sbufpub .

istream& insp=ins.seekg(streampos pos)

Der Zeiger get von ins.rdbuf() wird neu positioniert. Im Abschnitt zu sbufpub finden Sie eine Erläuterung der Positionierung.

streampos pos=ins.tellg()

Die aktuelle Position des Zeigers get von ios.rdbuf() wird geliefert. Eine Erläuterung der Positionierung finden Sie im Abschnitt zu sbufpub .

Manipulatoren

ins>>ws

Zwischenraumzeichen werden extrahiert.

ins>>dec

Das Formatflag für die Konvertierungsbasis wird auf 10 gesetzt. Weitere Informationen finden Sie im Abschnitt zu ios .

ins>>hex

Das Formatflag für die Konvertierungsbasis wird auf 16 gesetzt.Weitere Informationen finden Sie im Abschnitt zu ios .

ins>>oct

Das Formatflag für die Konvertierungsbasis wird auf 8 gesetzt. Weitere Informationen finden Sie im Abschnitt zu ios .

BEISPIEL

Das folgende Programm liest eine Textzeile ein, die daraufhin in umgekehrter Reihenfolge ausgegeben wird.

#include <iostream.h>
const int N = 80;
char a[ N];                /* Textpuffer */
int main()
{
  int i;
  cout << " Bitte eine Textzeile eingeben :\n";
  cin.unsetf(ios::skipws);
  cin.getline(text, N);      /* holt höchstens N Zeichen */
  i = cin.gcount() - 1;
  while (i)
  {
    cout << text [--i];      /* Gibt Textzeile in umgekehrter */
                             /* Reihenfolge aus */
  }
  return 0;                  /* Rückgabe bei erfolgreicher Ausführung */
}

Das Ergebnis der Programmausführung ist:

Bitte eine Textzeile eingeben :
EIN
NIE
%  CCM0998 Verbrauchte CPU-Zeit: 0.0024 Sekunden

BESONDERHEITEN 


Bei der Umwandlung von Ganzzahlen erfolgt keine Überlaufprüfung.

SIEHE AUCH


ios, manipsbufpub