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 (cout
ad 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.