では、さっそくプログラムを見てみましょう。
// multimap04.cpp #define FNAME "mydata.txt" #include <iostream> #include <map> #include <string> #include <fstream> int mywrite(); int myread(); int myinput(); using namespace std; multimap<string, string>mp; int main() { char ret[16]; int selno; while (1) { cout << "*** MENU ***" << endl; cout << "1.書き込み" << endl; cout << "2.読み出し" << endl; cout << "3.データ入力" << endl; cout << "0.終了" << endl; cout << "*************" << endl; cout << "選択 --- "; cin >> ret; if (ret[0] == '0') break; ret[1] = '\0'; selno = atoi(ret); switch (selno) { case 1: mywrite(); break; case 2: myread(); break; case 3: myinput(); break; default: cout << "不正な入力です" << endl; continue; } } return 0; }main関数ではメニューを表示して、ユーザーの選択により、各関数を呼び出しています。
int mywrite() { ofstream file_out; int data_no, n; multimap<string, string>::iterator itr; data_no = (int)mp.size(); if (data_no == 0) { cout << "保存すべきデータがありません" << endl; return -1; } cout << data_no << "個のデータを書き込みます" << endl; file_out.open(FNAME, ios_base::trunc); file_out << (int)mp.size() << endl; itr = mp.begin(); for (n = 0; n < data_no; n++) { file_out << itr->first << endl; file_out << itr->second << endl; itr++; } file_out.close(); return 0; }ファイルにデータを書き込む関数です。
データがない場合は、その旨表示して帰ります。 データがある場合は、FNAMEをオープンして書き込みます。 最初に、データの個数を書き込んでいます 次にデータを書き込みます。 この時、反復子を利用しています。 また、ファイルはオープンすると切り詰められて、今回書き込むデータのみとなる点に注意してください。
int myread() { ifstream file_in; pair<string, string>p; string data, sno; multimap<string, string>::iterator itr; int i, no; file_in.open(FNAME); if (!file_in.is_open()) { cout << "ファイルのオープンに失敗しました" << endl; return -1; } getline(file_in, sno); no = atoi(sno.c_str()); for (i = 0; i < no; i++) { getline(file_in, data); p.first = data; cout << data << "---"; getline(file_in, data); p.second = data; cout << data << endl; mp.insert(p); } file_in.close(); return 0; }ファイルからデータを読み出す関数です。
最初にデータの個数を読み出して、その分だけgetline関数で読み出しています。読み出すと同時に画面表示とmultimapにデータを挿入しています。
int myinput() { char name[32], jusho[128], yn[8]; pair<string, string>p; while (1) { cout << "氏名--- "; cin >> name; cout << "住所--- "; cin >> jusho; p.first = name; p.second = jusho; mp.insert(p); cout << "続けますか(y/n)--- "; cin >> yn; if (yn[0] == 'y' || yn[0] == 'Y') continue; else break; } return 0; }multimapにデータを挿入する関数です。
さて、今回のプログラムではいろいろ不満がありますね。 改良してみてください。
Update Aug/09/2004 By Y.Kumei