入力ストリームのメンバー関数
入力ストリームのメンバー関数は、ディスク入力に使用します。
open
入力ファイル ストリーム (ifstream
) を使用している場合は、そのストリームを特定のディスク ファイルに関連付ける必要があります。 これを行うには、コンストラクターで行うか、open
関数を使用することができます。 いずれの場合も、引数は同じです。
入力ストリームに関連付けられているファイルを開く場合、通常は ios_base::openmode
フラグを指定します (既定のモードは ios::in
です)。 openmode
フラグの一覧については、「ios_base::openmode
」を参照してください。 フラグは、ビットごとの "OR" (|
) 演算子と組み合わせることができます。
ファイルを読み取るには、まず fail
メンバー関数を使用して、そのファイルが存在するかどうかを調べます。
istream ifile("FILENAME");
if (ifile.fail())
// The file does not exist ...
get
書式設定されていない get
メンバー関数は、>>
演算子のように機能しますが、例外が 2 つあります。 1 番目は、get
関数には空白文字が含まれますが、抽出では、skipws
フラグが設定されている場合 (既定) に空白が除外される点です。 2 番目は、get
関数では、関連付けられた出力ストリーム (cout
など) がフラッシュされる可能性が低い点です。
get
関数の一種は、バッファー アドレスと読み取る文字の最大数を指定します。 これは、次の例のように、特定の変数に送信される文字数を制限する場合に役立ちます。
// 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;
}
入力
1234
出力例
1234
getline
getline
メンバー関数は、get
関数に似ています。 両方の関数で、入力の終端文字を指定する 3 番目の引数を使用できます。 既定値は改行文字です。 両方の関数は、必須の終端文字用に 1 つの文字を予約します。 ただし、get
は終端文字をストリームに残し、getline
は終端文字を削除します。
次の例では、入力ストリームの終端文字を指定します。
// 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;
}
入力
test
read
read
メンバー関数は、メモリの指定した領域に対するファイルからのバイト数を読み取ります。 length 引数は、読み取られるバイト数を決定します。 この引数を含めないと、ファイルの物理的な末尾に達した場合、またはテキストモードのファイルでは埋め込まれた EOF
文字が読み取られた場合に、読み取りが停止します。
この例では、給与ファイルからのバイナリ レコードを構造体に読み取ります。
#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;
}
}
プログラムでは、データ レコードが、構造体で指定されているとおりに、終端文字キャリッジ リターンや改行文字を含まずに正確に書式設定されていることが想定されます。
seekg
および tellg
入力ファイル ストリームは、データを次に読み取るファイル内の位置を指す内部ポインターを保持します。 次に示すように、seekg
関数を使用してこのポインターを設定します。
#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
を使用してレコード指向のデータ管理システムを実装するには、固定長のレコード サイズを、ファイルの末尾を基準にしたバイト位置を取得するレコード番号で乗算してから、get
オブジェクトを使用してレコードを読み取ります。
tellg
メンバー関数は、読み取るファイルの現在の位置を返します。 この値の型は streampos
(<iostream>
で定義されている typedef
) です。 次の例では、ファイルを読み取り、スペースの位置を示すメッセージを表示します。
#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
close
メンバー関数は、入力ファイル ストリームに関連付けられているディスク ファイルを閉じ、オペレーティング システム ファイル ハンドルを解放します。 ifstream
デストラクターによってファイルが閉じられますが、同じストリーム オブジェクトの別のファイルを開く必要がある場合は close
関数を使用できます。