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'; }