ファイル入出力を使うにはfstreamライブラリを使います。
入力用にはifstreamクラス、出力用にはofstreamクラスを使います。
まず、ファイルをオープンして・・
ostream fout; fout.open(ファイル名,(必要が有ればオープンモード)); fout << 出力内容; fout.close();これで、書き込み完了です。
読み込みも同様にして・・
ifstream fin; fin.open(ファイル名,(必要が有ればオープンモード)); fin >> str; fin.close();と、こんな感じになります。 これはすでに第28章で述べました。
STL(Standard Template Library)でも、従来型のC++でも全く同じです。
では、サンプルを見てみましょう。
// file01.cpp #include <iostream> #include <fstream> #include <string> #include <map> using namespace std; int main() { int i, n; char szBuf[8]; string name, address, fname, str; ofstream fout; ifstream fin; map<string, string> m; pair<string, string> p; cout << "ファイル名---"; cin >> fname; cout << "入力終了はendと入力" << endl; while (1) { cout << "氏名--- "; cin >> name; if (name == "end") break; cout << "住所--- "; cin >> address; p.first = name; p.second = address; m.insert(p); } fout.open(fname.c_str()); if (!fout.is_open()) { cout << "ファイルをオープンできません" << endl; return -1; } n = (int)m.size(); sprintf(szBuf, "%d", n); fout << szBuf << endl; map<string, string>::iterator itr; itr = m.begin(); for (i = 0; i < n; i++) { fout << itr->first; fout << endl; fout << itr->second; fout << endl; itr++; } fout.close(); fin.open(fname.c_str()); if (!fin.is_open()) { cout << "ファイルをオープンできません" << endl; return -2; } fin >> str; cout << endl; cout << "***住所一覧***" << endl; for (i = 0; i < n; i++) { fin >> str; cout << "[氏名] " << str << endl; fin >> str; cout << "[住所] " << str << endl; cout << endl; } fin.close(); return 0; }順番に見ていけばわかりますね。
ファイルオープン時にちょっとした注意が必要です。
ファイル名をstringクラスのオブジェクトに格納したとき これをそのまま
fin.open(fname);
などとすることはできません。
引数のファイル名は通常の文字列でなくてはいけません。
そこでstringクラスのc_strメンバ関数を使います。
最初からファイル名を普通の文字列で取得しておけば簡単かもしれません。
次にデータ数をファイルに書き込んでいます。
読み込みの時、これを見てその分だけ読み込めばよいので楽だからです。
eofメンバ関数を使えばよりスマートなプログラムになりそうですが ちょっと不都合もあるので、ここではデータ数をファイルの最初に書き込む方式をとりました。
次は、反復子を使って次々にデータをファイルに書き込んでいます。
書き込むデータ数はnです。
データを書き終わったらファイルを閉じます。
続いて、ファイルの読み込みです。
データの数だけ読み出して終わりです。
簡単ですね。
実行結果を見てみましょう。
さて、読み出しはファイルの先頭から順に行っていますが 入力した順番とは異なります。
mapクラスではデータはキーによって並び替えられるからです。
Update Aug/11/2003 By Y.Kumei