C++ ファイルとストリーム

これまでのところ、私たちは使用してきましたiostream標準ライブラリ、それは提供しますcinとcoutメソッドは、標準入力からストリームを読み取り、標準出力へストリームを書き込むためにそれぞれ使用されます。

このチュートリアルでは、ファイルからストリームを読み取り、ファイルへストリームを書き込む方法を説明します。これには、C++ の別の標準ライブラリを使用する必要があります。fstreamこれは、3つの新しいデータ型を定義します:

データ型 説明
ofstream このデータ型は出力ファイルストリームを表し、ファイルを作成してファイルに情報を書き込むために使用されます。
ifstream このデータ型は入力ファイルストリームを表し、ファイルから情報を読み取るために使用されます。
fstream このデータ型は通常、ファイルストリームを表し、ofstream と ifstream の両方の機能を同時に持ちます。つまり、ファイルを作成し、ファイルに情報を書き込み、ファイルから情報を読み取ることができます。

C++ でファイル処理を行うには、C++ ソースコードファイルにヘッダファイル <iostream> と <fstream> を含める必要があります。

ファイルを開く

ファイルから情報を読み取る、またはファイルに情報を書き込む前に、ファイルを開く必要があります。ofstreamとfstreamオブジェクトは、書き込み操作のためにファイルを開くために使用できます。読み取り操作のためにのみファイルを開く必要がある場合は、使用しますifstreamオブジェクト。

以下は open() 関数の標準構文です。open() 関数は fstream、ifstream、ofstream オブジェクトのメンバです。

void open(const char *filename, ios::openmode mode);

ここで、open()メンバ関数の最初のパラメータは開くファイルの名前と場所を指定し、2番目のパラメータはファイルが開かれるモードを定義します。

モードフラグ 説明
ios::app 追記モード。すべての書き込みはファイルの末尾に追加されます。
ios::ate ファイルを開いた後、ファイルの末尾に位置付けられます。
ios::in 読み取り用にファイルを開きます。
ios::out 書き込み用にファイルを開きます。
ios::trunc ファイルが既に存在する場合、その内容はファイルを開く前に切り詰められ、つまりファイル長が 0 に設定されます。

上記の2つ以上のモードを組み合わせて使用できます。例えば、書き込みモードでファイルを開き、ファイルが既に存在する場合に備えてファイルを切り詰めたい場合は、次の構文を使用できます:

ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc );

同様に、読み書き用にファイルを開きたい場合は、次の構文を使用できます:

ifstream  afile;
afile.open("file.dat", ios::out | ios::in );

ファイルを閉じる

C++ プログラムが終了すると、自動的にすべてのストリームを閉じてフラッシュし、割り当てられたすべてのメモリを解放し、開いているすべてのファイルを閉じます。しかし、プログラマはプログラム終了前に開いているすべてのファイルを閉じるという良い習慣を身につけるべきです。

以下は close() 関数の標準構文です。close() 関数は fstream、ifstream、ofstream オブジェクトのメンバです。

void close();

ファイルへの書き込み

C++ プログラミングでは、ストリーム挿入演算子(<<)を使用してファイルに情報を書き込みます。これは、この演算子を使用して画面に情報を出力するのと同じです。唯一の違いは、ここでは使用するのがofstream 或 fstreamオブジェクトであり、ではなくcoutオブジェクトです。

ファイルの読み取り

C++ プログラミングでは、ストリーム抽出演算子(>>)を使用してファイルから情報を読み取ります。これは、この演算子を使用してキーボードから情報を入力するのと同じです。唯一の違いは、ここでは使用するのがifstream 或 fstreamオブジェクトであり、ではなくcinオブジェクトです。

読み取り & 書き込みの例

次の C++ プログラムは、読み書きモードでファイルを開きます。ユーザーが入力した情報をファイル afile.dat に書き込んだ後、プログラムはファイルから情報を読み取り、それを画面に出力します:

例

#include <fstream> #include <iostream> using namespace std; int main() { char data[100]; // 書き込みモードでファイルを開く ofstream outfile; outfile.open("afile.dat"); cout << "Writing to the file" << endl; cout << "Enter your name: "; cin.getline(data, 100); // ユーザーが入力したデータをファイルに書き込む outfile << data << endl; cout << "Enter your age: "; cin >> data; cin.ignore(); // 再度ユーザーが入力したデータをファイルに書き込む outfile << data << endl; // 開いたファイルを閉じる outfile.close(); // 読み取りモードでファイルを開く ifstream infile; infile.open("afile.dat"); cout << "Reading from the file" << endl; infile >> data; // 画面にデータを書き込む cout << data << endl; // 再度ファイルからデータを読み取り、それを表示する infile >> data; cout << data << endl; // 開いたファイルを閉じる infile.close(); return 0; }

上記のコードがコンパイルされて実行されると、次の入力と出力が生成されます:

$./a.out
Writing to the file
Enter your name: Zara
Enter your age: 9
Reading from the file
Zara
9

上記の例では、cin オブジェクトの付加関数を使用しています。例えば、getline() 関数は外部から1行を読み取り、ignore() 関数は以前の読み取りステートメントが残した余分な文字を無視します。

ファイル位置ポインタ

istreamとostreamどちらも、ファイル位置ポインタを再配置するためのメンバ関数を提供します。これらのメンバ関数には、istream に関するseekg("seek get")と ostream に関するseekp("seek put")。

seekg と seekp のパラメータは通常 long 型です。2番目のパラメータは検索方向を指定するために使用できます。検索方向は次のいずれかです:ios::beg(デフォルトで、ストリームの先頭から位置を指定)、またはios::cur(ストリームの現在位置から位置を指定)、またはios::end(ストリームの末尾から位置を指定)。

ファイル位置ポインタは整数値であり、ファイルの開始位置からポインタの現在位置までのバイト数を指定します。以下は "get" ファイル位置ポインタの位置指定に関する例です:

// fileObject の n 番目のバイトに位置付ける(ios::beg と仮定) fileObject.seekg( n ); // ファイルの読み取りポインタを fileObject の現在位置から後ろに n バイト移動する fileObject.seekg( n, ios::cur ); // ファイルの読み取りポインタを fileObject の末尾から n バイト戻す fileObject.seekg( n, ios::end ); // fileObject の末尾に位置付ける fileObject.seekg( 0, ios::end );
その他の拡張