Členské funkce vstupního datového proudu
Členské funkce vstupního datového proudu se používají pro vstup disku.
open
Pokud používáte vstupní datový proud souboru (ifstream
), musíte tento datový proud přidružit ke konkrétnímu souboru disku. Můžete to udělat v konstruktoru nebo můžete použít open
funkci. V obou případech jsou argumenty stejné.
Obecně platí, že příznak ios_base::openmode
při otevření souboru přidruženého ke vstupnímu streamu (výchozí režim je ios::in
). Seznam openmode
příznaků najdete v tématu ios_base::openmode
. Příznaky lze kombinovat s bitovým operátorem "or" (|
).
Pokud chcete přečíst soubor, nejprve pomocí fail
členské funkce určete, jestli existuje:
istream ifile("FILENAME");
if (ifile.fail())
// The file does not exist ...
get
Neformátovaná get
členová funkce funguje jako >>
operátor se dvěma výjimkami. Nejprve funkce get
obsahuje prázdné znaky, zatímco extraktor při nastavení příznaku skipws
(výchozí) vyloučí prázdné znaky. Za druhé, funkce je méně pravděpodobné, get
že způsobí vyprázdnění vázaného výstupního streamu (cout
například).
Varianta get
funkce určuje adresu vyrovnávací paměti a maximální počet znaků, které se mají přečíst. To je užitečné pro omezení počtu znaků odeslaných do konkrétní proměnné, jak ukazuje tento příklad:
// 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;
}
Vstup
1234
Ukázkový výstup
1234
getline
Členová getline
funkce je podobná get
funkci. Obě funkce umožňují třetí argument, který určuje ukončovací znak pro vstup. Výchozí hodnota je znak nového řádku. Obě funkce si zarezervují jeden znak pro požadovaný ukončovací znak. get
Ukončovací znak však ponechá v datovém proudu a getline
odebere ukončující znak.
Následující příklad určuje ukončovací znak vstupního datového proudu:
// 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;
}
Vstup
test
read
Členová read
funkce čte bajty ze souboru do zadané oblasti paměti. Argument délka určuje počet přečtených bajtů. Pokud tento argument nezahrnete, čtení se zastaví při dosažení fyzického konce souboru nebo v případě souboru v textovém režimu při čtení vloženého EOF
znaku.
Tento příklad načte binární záznam ze souboru mzdy do struktury:
#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;
}
}
Program předpokládá, že datové záznamy jsou formátovány přesně tak, jak je specifikuje struktura bez ukončující znaky návratu na začátek řádku nebo odřádkování.
seekg
a tellg
Datové proudy vstupních souborů udržují interní ukazatel na pozici v souboru, kde se mají data číst dál. Tento ukazatel nastavíte pomocí seekg
funkce, jak je znázorněno tady:
#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;
}
}
Chcete-li použít seekg
k implementaci systémů správy dat orientovaných na záznamy, vynásobte velikost záznamu s pevnou délkou číslem záznamu, abyste získali pozici bajtu vzhledem ke konci souboru, a pak použijte get
objekt ke čtení záznamu.
Členová tellg
funkce vrátí aktuální pozici souboru pro čtení. Tato hodnota je typu streampos
, definována typedef
v <iostream>
. Následující příklad přečte soubor a zobrazí zprávy zobrazující pozice mezer.
#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
Členová close
funkce zavře diskový soubor přidružený ke vstupnímu datovému proudu souboru a uvolní popisovač souboru operačního systému. Destruktor ifstream
zavře soubor za vás, ale funkci můžete použít close
, pokud potřebujete otevřít jiný soubor pro stejný objekt streamu.