第82章 multimapで住所録を作る


今回は、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にデータを挿入する関数です。

さて、今回のプログラムではいろいろ不満がありますね。 改良してみてください。


[C++Index] [総合Index] [Previous Chapter] [Next Chapter]

Update Aug/09/2004 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。