今回は、multimapを使って、簡単な住所録を作ってみます。
では、さっそくプログラムを見てみましょう。
// 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