
WZ のアドレス帳を XZ でも使おうと、次のプログラムを作りましたが、このプログラムを動かすには、WZ のアドレス帳を EUC に変換して adrbook.euc のファイル名で保存しておかなくてはなりません。
WZ と XZ では、アドレス帳のデータの並びが違っています。
WZ XZ ---------- ---------- Nickname: Name: Name: Name-J: Name-J: Nickname: E-Mail: E-Mail: NiftyId: NiftyId: mailname: mailname: Group: Group:
私の場合、名前はすべて漢字ネーム(Name-J:)に登録してあり、NiftyID も不要ですので、Name-J:, E-Mail:, Group: の三つのデータを次のように、構造体データに格納することにしました。
struct data{
char namej[SIZE];
char email[SIZE];
char group[SIZE];
}adrbook[MAX];
ファイルからメモリーに格納するため次の部分を書きました。n==3 で WZ の漢字ネームを、n==4 で WZ のイーメール・アドレスを、n==7 で WZ のグループを取り出しています。ですから、このプログラムを使うには、WZ で名前はすべて漢字ネームにいれておく必要があります。
while(fgets(buf, SIZE2, workfile)!=NULL){
if(buf[0]=='\n'){
n=0;
sum++;
}
else{
if(n==3){
formdata(buf);
strcpy(adrbook[sum].namej,gdata);
}
if(n==4){
formdata(buf);
strcpy(adrbook[sum].email, gdata);
}
if(n==7){
formdata(buf);
strcpy(adrbook[sum].group, gdata);
}
n++;
}
}
WZ、XZ では、グループデータで、一人の人が二つ以上のグループになっている時、タブを使ってグループ名を区切っていることです。これをそのままソートするとデータの並びが狂ってしまいますので、次のファンクションを使ってタブを '*' に置き換えています。最初に出て来た
if(n==3){
formdata(buf);
strcpy(adrbook[sum].namej,gdata);
}
の formdata(buf) というのが、次のファンクションです。
formdata(char *string)
{
int i, j;
for(i=0; string[i]!='\n'; i++){
if(string[i]==' ')
break;
}
i++;
for(j=0; string[i]!='\n'; i++, j++){
if(string[i]=='\t')
gdata[j]='*';
else
gdata[j]=string[i];
}
gdata[j]='\0';
}
書き込みの時は、'*' をタブに換えなければいけませんが、再変換しているのが、unformdata() です。次はこのプログラムの全体です。コマンドラインプログラムは、やっていることが見えないので不安感を与えかねません。進行状況を示すために、printf(".") という「おまけ」をつけました。
/*
adrcnv.c
Convert from WZ addressbook to XZ addressbook.
*/
#include <stdio.h>
#define MAX 400
#define SIZE 40
#define SIZE2 80
struct data{
char namej[SIZE];
char email[SIZE];
char group[SIZE];
}adrbook[MAX];
int sum;
char gdata[SIZE];
main()
{
FILE *inp, *out;
int i, n;
char buf[SIZE2];
if((inp=fopen("adrbook.euc", "r"))==NULL){
printf("Can't open <adrbook.euc>\n");
exit(0);
}
n=0;
sum=0;
printf("Reading <adrbook.euc>");
while(fgets(buf, SIZE2, inp)!=NULL){
if(buf[0]=='\n'){
n=0;
sum++;
if(sum%10==0) printf(".");
}
else{
if(n==3){
formdata(buf);
strcpy(adrbook[sum].namej,gdata);
}
if(n==4){
formdata(buf);
strcpy(adrbook[sum].email, gdata);
}
if(n==7){
formdata(buf);
strcpy(adrbook[sum].group, gdata);
}
n++;
}
}
if((out=fopen("adrbook.adr", "w"))==NULL){
printf("Can't open <adrbook.adr>\n");
exit(0);
}
printf("\nWriting <adrbook.adr>");
for(i=0; i<sum; i++){
if(i%10==0 && i>0) printf(".");
fprintf(out, "%c<mh>\n", '\b');
fprintf(out, "Name: \n");
fprintf(out, "Name-J: %s\n", adrbook[i].namej);
fprintf(out, "Nickname: \n");
fprintf(out, "E-Mail: %s\n", adrbook[i].email);
fprintf(out, "NiftyId: \n");
fprintf(out, "mailname: 2\n");
unformdata(adrbook[i].group);
fprintf(out, "Group: %s\n", gdata);
fprintf(out, "\n");
}
printf("done\n");
exit(0);
}
formdata(char *string)
{
int i, j;
for(i=0; string[i]!='\n'; i++){
if(string[i]==' ')
break;
}
i++;
for(j=0; string[i]!='\n'; i++, j++){
if(string[i]=='\t')
gdata[j]='*';
else
gdata[j]=string[i];
}
gdata[j]='\0';
}
unformdata(char *string)
{
int i;
for(i=0; string[i]!='\0'; i++){
if(string[i]=='*')
gdata[i]='\t';
else
gdata[i]=string[i];
}
gdata[i]='\0';
}