Freigeben über


Eingabestream-Memberfunktionen

Eingabestream-Memberfunktionen werden für Datenträgereingaben verwendet.

open

Wenn Sie einen Eingabedateidatenstrom (ifstream) verwenden, müssen Sie diesen Datenstrom einer bestimmten Datenträgerdatei zuordnen. Sie können dies im Konstruktor tun, oder Sie können die open Funktion verwenden. In beiden Fällen sind die Argumente gleich.

Sie geben im Allgemeinen ein ios_base::openmode Flag an, wenn Sie die datei öffnen, die einem Eingabedatenstrom zugeordnet ist (der Standardmodus ist ios::in). Eine Liste der openmode Flags finden Sie unter ios_base::openmode. Die Flags können mit dem bitweisen Operator "oder" (|) kombiniert werden.

Verwenden Sie zum Lesen einer Datei zuerst die fail Memberfunktion, um zu bestimmen, ob sie vorhanden ist:

istream ifile("FILENAME");

if (ifile.fail())
// The file does not exist ...

get

Die unformatierte get Memberfunktion funktioniert wie der >> Operator mit zwei Ausnahmen. Zunächst enthält die get Funktion Leerzeichen, während der Extraktor Leerzeichen ausschließt, wenn das skipws Flag festgelegt ist (Standard). Zweitens ist die get Funktion weniger wahrscheinlich, dass ein gebundener Ausgabedatenstrom (coutz. B.) geleert wird.

Eine Variation der get Funktion gibt eine Pufferadresse und die maximale Anzahl der zu lesenden Zeichen an. Dies hilft dabei, die Anzahl der Zeichen einzuschränken, die zu einer bestimmten Variable gesendet werden, wie dieses Beispiel zeigt:

// ioo_get_function.cpp
// compile with: /EHsc
// Type up to 24 characters and a terminating character.
// Any remaining characters can be extracted later.
#include <iostream>
using namespace std;

int main()
{
   char line[25];
   cout << " Type a line terminated by carriage return\n>";
   cin.get( line, 25 );
   cout << line << endl;
}

Eingabe

1234

Beispielausgabe

1234

getline

Die getline Memberfunktion ähnelt der get Funktion. Beide Funktionen ermöglichen ein drittes Argument, das abschließende Zeichen für die Eingabe angibt. Der Standardwert ist das Zeilenumbruchzeichen. Beide Funktionen reservieren ein Zeichen für das benötigte abschließende Zeichen. get Belässt jedoch das Endzeichen im Datenstrom und getline entfernt das endende Zeichen.

Im folgenden Beispiel wird ein abschließendes Zeichen für den Eingabestream angegeben:

// getline_func.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

int main( )
{
   char line[100];
   cout << " Type a line terminated by 't'" << endl;
   cin.getline( line, 100, 't' );
   cout << line;
}

Eingabe

test

read

Die read Memberfunktion liest Bytes aus einer Datei in einen angegebenen Speicherbereich. Das Längenargument bestimmt die Anzahl gelesener Bytes. Wenn Sie dieses Argument nicht einschließen, stoppt das Lesen, wenn das physische Ende der Datei erreicht wird, oder im Fall einer Textmodusdatei, wenn ein eingebettetes EOF Zeichen gelesen wird.

Dieses Beispiel liest einen binären Datensatz aus einer Lohnabrechnungsdatei in eine Struktur:

#include <fstream>
#include <iostream>
using namespace std;

int main()
{
   struct
   {
      double salary;
      char name[23];
   } employee;

   ifstream is( "payroll" );
   if( is ) {  // ios::operator void*()
      is.read( (char *) &employee, sizeof( employee ) );
      cout << employee.name << ' ' << employee.salary << endl;
   }
   else {
      cout << "ERROR: Cannot open file 'payroll'." << endl;
   }
}

Das Programm geht davon aus, dass die Datensätze genau so formatiert sind, wie sie durch die Struktur angegeben sind, ohne die Wagenrücklauf- oder Zeilenvorschubzeichen zu beenden.

seekg und tellg

Eingabedatei-Streams behalten einen internen Zeiger auf der Position in der Datei, in der Daten als Nächstes gelesen werden. Legen Sie diesen Zeiger mit der seekg-Funktion fest, wie hier gezeigt:

#include <iostream>
#include <fstream>
using namespace std;

int main( )
{
   char ch;

   ifstream tfile( "payroll" );
   if( tfile ) {
      tfile.seekg( 8 );        // Seek 8 bytes in (past salary)
      while ( tfile.good() ) { // EOF or failure stops the reading
         tfile.get( ch );
         if( !ch ) break;      // quit on null
         cout << ch;
      }
   }
   else {
      cout << "ERROR: Cannot open file 'payroll'." << endl;
   }
}

seekg Um datensatzorientierte Datenverwaltungssysteme zu implementieren, multiplizieren Sie die Datensatzgröße mit fester Länge mit der Datensatznummer, um die Byteposition relativ zum Ende der Datei abzurufen, und verwenden Sie dann das get Objekt, um den Datensatz zu lesen.

Die tellg-Memberfunktion gibt die aktuelle Dateiposition zum Lesen zurück. Dieser Wert ist vom Typ streampos, ein typedef definiert in <iostream>. Das folgende Beispiel liest eine Datei und zeigt Meldungen an, die die Positionen der Leerzeichen zeigen.

#include <fstream>
#include <iostream>
using namespace std;

int main( )
{
   char ch;
   ifstream tfile( "payroll" );
   if( tfile ) {
       while ( tfile.good( ) ) {
          streampos here = tfile.tellg();
          tfile.get( ch );
          if ( ch == ' ' )
             cout << "\nPosition " << here << " is a space";
       }
   }
   else {
      cout << "ERROR: Cannot open file 'payroll'." << endl;
   }
}

close

Die close Memberfunktion schließt die Datenträgerdatei, die einem Eingabedateidatenstrom zugeordnet ist, und gibt das Betriebssystemdateihandle frei. Der ifstream Destruktor schließt die Datei für Sie, aber Sie können die close Funktion verwenden, wenn Sie eine andere Datei für dasselbe Streamobjekt öffnen müssen.

Siehe auch

Input Streams (Eingabestreams)