adrcnv.c

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


[目次にもどる]