C++ファイルI/O完全マスター:fstreamによる読み書き
これまで、標準入力からの読み取りに cin、標準出力への書き込みに cout メソッドを提供する iostream 標準ライブラリを使用してきました。
このチュートリアルでは、ファイルからの読み書き方法を学びます。これには fstream という別の標準C++ライブラリが必要で、以下の3つの新しいデータ型を定義します:
| No. | データ型と説明 |
|---|---|
| 1 | ofstream 出力ファイルストリームを表し、ファイルの作成とファイルへの情報書き込みに使用。 |
| 2 | ifstream 入力ファイルストリームを表し、ファイルからの情報読み取りに使用。 |
| 3 | fstream 一般的なファイルストリームを表し、ofstreamとifstreamの両方の機能を持ち、ファイルの作成、書き込み、読み取りが可能。 |
C++でファイル処理を行うには、ヘッダーファイル <iostream> と <fstream> をC++ソースファイルにインクルードする必要があります。
ファイルのオープン
ファイルから読み取るか書き込むには、まずファイルを開く必要があります。ofstream または fstream オブジェクトを使用して書き込み用にファイルを開きます。読み取り専用でファイルを開くには ifstream オブジェクトを使用します。
open() 関数の標準構文(fstream、ifstream、ofstream オブジェクトのメンバ):
void open(const char *filename, ios::openmode mode);
第1引数は開くファイルの名前と場所を指定し、第2引数の open() メンバ関数はファイルを開くモードを定義します。
| No. | モードフラグと説明 |
|---|---|
| 1 | ios::app 追加モード。そのファイルへのすべての出力が末尾に追加される。 |
| 2 | ios::ate 出力用にファイルを開き、読み書き制御をファイルの末尾に移動。 |
| 3 | ios::in 読み取り用にファイルを開く。 |
| 4 | ios::out 書き込み用にファイルを開く。 |
| 5 | ios::trunc ファイルが既に存在する場合、開く前に内容を切り詰める。 |
これらの値を2つ以上 OR で組み合わせることができます。例えば、書き込みモードでファイルを開き、既存の場合は切り詰める場合:
ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc );
同様に、読み書き両用でファイルを開くには:
fstream afile;
afile.open("file.dat", ios::out | ios::in );
ファイルのクローズ
C++プログラムが終了すると、自動的にすべてのストリームがフラッシュされ、割り当てられたメモリが解放され、開いているすべてのファイルがクローズされます。しかし、プログラマーがプログラム終了前にすべての開いているファイルをクローズするのは常に良い習慣です。
close() 関数の標準構文(fstream、ifstream、ofstream オブジェクトのメンバ):
void close();
ファイルへの書き込み
C++プログラミングでは、画面への出力に使用するストリーム挿入演算子 (<<) を、プログラムからファイルへ情報を書き込むのに使用します。唯一の違いは、cout オブジェクトの代わりに ofstream または fstream オブジェクトを使用することです。
ファイルからの読み取り
ファイルから情報をプログラムに読み取るには、キーボードからの入力に使用するストリーム抽出演算子 (>>) を使用します。唯一の違いは、cin オブジェクトの代わりに ifstream または fstream オブジェクトを使用することです。
読み書きの例
以下のC++プログラムは、読み書きモードでファイルを開きます。ユーザーが入力した情報を afile.dat というファイルに書き込んだ後、ファイルから情報を読み取り、画面に出力します:
Live Demo#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() 関数、前の読み取り文で残った余分な文字を無視する 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 );
C言語
- ミルファイル(平ヤスリ)完全ガイド:木工・金工の必須工具
- C++構造体とクラス:組み込み開発者のための実践ガイド
- C++変数・リテラル・定数完全ガイド:基礎から実践まで
- C++クラスとオブジェクト完全ガイド:オブジェクト指向プログラミングの実践
- C++メモリ管理の極意:newとdeleteのエキスパート活用法
- C++フレンド関数とフレンドクラス:アクセス制御のマスター
- C言語 ファイル入出力: fopen, fprintf, fread, fseek をマスターする
- C言語ヘッダーファイルの理解:種類、使い方、ベストプラクティス
- C++日付と時刻の完全ガイド:ctimeライブラリの活用
- C++オーバーロード完全マスター:関数と演算子のオーバーロード
- Pythonディレクトリ・ファイル操作マスター:作成、移動、一覧、リネーム、削除