第42章 住所録を作ろう その5


今回は、元になるデータファイルのバックアップを取ったり、 ある程度形式を整えて、別ファイルに保存する機能を付け加えます。



メニューでは、「別ファイルに出力」「バックアップ」が増えました。
別ファイルに保存すると

*******************
[氏名] 粂井康孝
[住所] 北海道旭川市
[生年月日] 19XX/05/31
[メモ] メモなし
*******************
[氏名] 粂井志麻
[住所] 大阪府
[生年月日] 198X/04/10
[メモ] メモなし
*******************

と、いうような感じで保存されます。 これをエディタなどで読み込んで印刷すれば ある程度使えますね。

では、プログラムを見てみましょう。

// jusho05.cpp #include <iostream.h> #include <fstream.h> #include <string.h> //memset()で必要 #include <conio.h> // getch()で必要 #include <stdio.h> // sprintf()で必要 #include <process.h> // system()で必要 #define JFILE "jfile.txt" class Jusho { struct _tagdata{ char name[64]; char address[256]; char birth_year[16]; char birth_month[8]; char birth_day[8]; char memo[256]; } data; char searchword[64]; public: Jusho(); int show(char *); int write(); int search(); int edit(); int del(); int fileoutput(); int backup(); }; Jusho::Jusho() { memset(&data, 0, sizeof(data)); }

system関数を使う関係でprocess.hのインクルードが増えました。

Jushoクラスにfileoutput, backupメンバ関数が増えました。

Jusho::show, int Jusho::write, Jusho::search, Jusho::edit, Jusho::del の各メンバ関数に変更はありません。

int Jusho::fileoutput() { ifstream Jin; ofstream Jout; int n, i; char szYesNo[8]; char szBuf[256], szNewFile[64]; FILE *fp; Jin.open(JFILE, (ios::nocreate)); if (Jin.is_open()) { Jin >> n; } else { cout << "元になる住所録データがありません" << endl; return -1; } cout << "新しく作るファイル名-->"; cin >> szNewFile; if (strcmp(JFILE, szNewFile) == 0) { cout << "元になるファイルと同じ名前のファイルは作れません" << endl; Jin.close(); return -1; } fp = fopen(szNewFile, "r"); if (fp != NULL) { fclose(fp); cout << szNewFile << "はすでに存在します" << endl; cout << "上書きしますか(Y/N)-->"; cin >> szYesNo; if (strcmp(szYesNo, "n") == 0 || strcmp(szYesNo, "N")) { Jin.close(); return -1; } } Jout.open(szNewFile, (ios::trunc)); Jout << "*******************" << endl; for (i = 0; i < n; i++) { Jin >> szBuf; Jout << "[氏名] "; Jout << szBuf << endl;//名前 Jin >> szBuf; Jout << "[住所] "; Jout << szBuf << endl;//住所 Jin >> szBuf; Jout << "[生年月日] "; Jout << szBuf;//年 Jout << "/"; Jin >> szBuf; Jout << szBuf;//月 Jout << "/"; Jin >> szBuf; Jout << szBuf << endl;//日 Jin >> szBuf; Jout << "[メモ] "; Jout << szBuf << endl;//メモ Jout << "*******************" << endl; } Jin.close(); Jout.close(); return 0; }

別ファイルに保存するメンバ関数です。

新しく作る別ファイルの名前を問い合わせて、そのファイルが すでに存在するときは注意を促します。 そのファイルが存在するかどうかは、ここではC++らしからぬ方法で 調べています。"r"でfopenして戻り値がNULLでなければ、そのファイルが すでに存在していることになります。

別ファイルでオープンして、データの個数(n)だけ体裁を 整えて書き込みます。

int Jusho::backup() { char szCommand[256], szBackup[64], szYesNo[8]; FILE *fp; cout << "バックアップファイル名-->"; cin >> szBackup; if (strcmp(JFILE, szBackup) == 0) { cout << "元ファイルと同じ名前のバックアップファイルは作れません" <<endl; return -1; } fp = fopen(szBackup, "r"); if (fp != NULL) { fclose(fp); cout << szBackup << " はすでに存在します" << endl; cout << "上書きしますか(Y/N)-->"; cin >> szYesNo; if (strcmp(szYesNo, "n") == 0 || strcmp(szYesNo, "N") == 0) return -1; } strcpy(szCommand, "copy "); strcat(szCommand, JFILE); strcat(szCommand, " "); strcat(szCommand, szBackup); cout << szCommand << endl; system(szCommand); return 0; }

元になるデータファイル(JFILE)のバックアップを取るメンバ関数です。

ここでは、簡単のためにsystem関数を使ってDOSのcopyコマンドを実行しています。 system関数についてはC言語編第19章を参照してください。

int main() { Jusho j; int no, cont = 1; while (cont) { cout << endl; cout << "*******************" << endl; cout << "1.住所録を見る" << endl; cout << "2.書き込む" << endl; cout << "3.検索" << endl; cout << "4.編集" << endl; cout << "5.削除" << endl; cout << "6.別ファイルに出力" << endl; cout << "7.バックアップ" << endl; cout << "0.終了" << endl; cout << "*******************" << endl; cout << "番号選択---"; cin >> no; switch (no) { case 0: cont = 0; break; case 1: j.show(""); break; case 2: j.write(); break; case 3: j.search(); break; case 4: j.edit(); break; case 5: j.del(); break; case 6: j.fileoutput(); break; case 7: j.backup(); break; default: cout << "番号が違います" << endl; break; } } return 0; }

main関数です。

メニューの「6.別ファイルに出力」「7.バックアップ」が増えました。

今回も簡単でした。ここで作る住所録は入力順に並んでいます。 できれば、名前順とか、住所順とかでソートしてあるファイルもできると便利ですね。


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

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