Condividi tramite


Funzioni membro del flusso di input

Le funzioni membro del flusso di input vengono usate per l'input del disco.

open

Se si usa un flusso di file di input (ifstream), è necessario associare tale flusso a un file disco specifico. È possibile eseguire questa operazione nel costruttore oppure usare la open funzione . In entrambi i casi, gli argomenti sono identici.

In genere si specifica un ios_base::openmode flag quando si apre il file associato a un flusso di input (la modalità predefinita è ios::in). Per un elenco dei openmode flag, vedere ios_base::openmode. I flag possono essere combinati con l'operatore bit per bit "o" (|).

Per leggere un file, usare prima di tutto la fail funzione membro per determinare se esiste:

istream ifile("FILENAME");

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

get

La funzione membro non formattata get funziona come l'operatore >> con due eccezioni. Prima di tutto, la get funzione include spazi vuoti, mentre l'estrattore esclude gli spazi vuoti quando il skipws flag è impostato (impostazione predefinita). In secondo luogo, la get funzione è meno probabile che un flusso di output associato (coutad esempio) venga scaricato.

Una variante della get funzione specifica un indirizzo del buffer e il numero massimo di caratteri da leggere. Questa caratteristica è utile per limitare il numero di caratteri inviati a una variabile specifica, come mostrato in questo esempio:

// 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;
}

Input

1234

Output di esempio

1234

getline

La getline funzione membro è simile alla get funzione . Entrambe le funzioni accettano un terzo argomento che specifica il carattere di terminazione per l'input. Il valore predefinito è il carattere di nuova riga. Entrambe le funzioni riservano un singolo carattere per il carattere di terminazione obbligatorio. Tuttavia, get lascia il carattere di terminazione nel flusso e getline rimuove il carattere di terminazione.

L'esempio seguente specifica un carattere di terminazione per il flusso di input:

// 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;
}

Input

test

read

La read funzione membro legge i byte da un file a un'area di memoria specificata. L'argomento length determina il numero di byte letti. Se non si include tale argomento, la lettura si interrompe quando viene raggiunta la fine fisica del file o, nel caso di un file in modalità testo, quando viene letto un carattere incorporato EOF .

Questo esempio legge un record binario da un file degli stipendi in una struttura:

#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;
   }
}

Il programma presuppone che i record di dati siano formattati esattamente come specificato dalla struttura senza caratteri di ritorno a capo o avanzamento riga terminati.

seekg e tellg

I flussi di file di input mantengono un puntatore interno alla posizione nel file in cui dovrà essere eseguita la successiva lettura di dati. Questo puntatore viene impostato con la funzione seekg, come illustrato di seguito:

#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;
   }
}

Per usare seekg per implementare sistemi di gestione dei dati orientati ai record, moltiplicare le dimensioni dei record a lunghezza fissa per il numero di record per ottenere la posizione dei byte rispetto alla fine del file e quindi utilizzare l'oggetto get per leggere il record.

La funzione membro tellg restituisce la posizione nel file corrente per la lettura. Questo valore è di tipo streampos, un oggetto typedef definito in <iostream>. L'esempio seguente legge un file e visualizza i messaggi che mostrano le posizioni degli spazi.

#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

La close funzione membro chiude il file del disco associato a un flusso di file di input e libera l'handle di file del sistema operativo. Il ifstream distruttore chiude il file, ma è possibile usare la close funzione se è necessario aprire un altro file per lo stesso oggetto flusso.

Vedi anche

Flussi di input