1989年開業 技術士 佐伯英子(情報工学部門) 文部科学省登録番号 第22082号 日本技術士会会員 東大阪商工会議所会員

≫サンプルプログラム一覧 

オープンソース/C言語サンプルプログラム 郵便番号検索

●郵便番号を入力して、該当する住所を表示するプログラムです。
●CSV形式のデータを1レコードずつ読み、郵便番号が一致すれば
 住所を表示して終了します。
  ≫ソースファイルのダウンロード: yuubin01.c
●郵便番号データは、郵便局のサイトからダウンロードできます。
 【郵便局】
  http://www.post.japanpost.jp/index.html
 【郵便番号データのダウンロード】
  http://www.post.japanpost.jp/zipcode/dl/oogaki.html
●郵便番号データの再配布が許可されています。
 ダウンロード後解凍してご利用ください。
  ≫全国一括データ(2013.10.31): ken_all.lzh
  ★注意:KEN_ALL.CSVは、表計算ソフトや簡易エディタでは
      すべてを読み込めない場合があります。
【問題】
●最終の郵便番号 9071801 を入力して実行速度を確認してみよう。
●存在しない郵便番号を入力するとどのようになるか考察し、
 実際に確認してみよう。




/****************************/
/*  郵便番号検索            */
/*  郵便番号から住所を表示  */
/****************************/
#include <stdio.h>
#include <string.h>

void  explode(char*,char*);             // 項目を取り出す
char  data[32][128];                    // 1レコード分のデータ

void  main( )
{
    FILE   *fp;
    char    zip[128],buf[512],*cp;
    int     len;

    printf("\n***郵便番号検索***\n");
    printf("\n郵便番号(ハイフンなし): "); fflush(stdout);
    gets(zip);                             // 郵便番号入力
    len=strlen(zip);                       // 郵便番号文字数

    fp=fopen("KEN_ALL.CSV","r");           // 郵便番号ファイル開く
    if ( fp==NULL ) goto END;              // ファイルを開けない

    while ( 1 )
      {
        cp=fgets(buf,256,fp);              // 1レコード読む
        if ( cp==NULL ) break;             // EOF

        explode(",",buf);                  // 項目を取り出す

        if ( memcmp(&data[2][0],zip,len)!=0 )
             continue;                     // 郵便番号がちがう

        printf("\n住所:%s%s%s\n",&data[6][0],&data[7][0],&data[8][0]);
        break;
      }

    fclose(fp);                            // 郵便番号ファイル閉じる

END: ;
}


void  explode(
/*----------------------------------*/
/*  CSVデータから項目を取り出す  */
/*----------------------------------*/
char  *kugiri,  // 区切り文字
char  *buf)     // CSVの1レコード
{
     char  *cp0,*cp;
     int   i=0,len;

     memset(&data[0][0],'\0',32*128);      // データの全文字をNULLに

     cp0=buf;                              // CSVデータの先頭アドレス

     for( i=0; i<31; i++ )
       {
         if ( *cp0==0x22 ) cp0++;          // 最初の"(0x22)を除く
         cp=strstr(cp0,kugiri);            // 区切り文字を検索
         if ( cp==NULL ) break;            // 区切り文字なし

         len=cp-cp0;                       // 項目の文字数
         if ( *(cp-1)==0x22 ) len--;       // 最後の"(0x22)を除く
         if ( len>0 )                      // 項目あり
           {
             memcpy(&data[i][0],cp0,len);  // 項目の文字列をコピー
           }
         cp0=cp+1;                         // 次の文字のアドレス
       }

     strcpy(&data[i][0],cp0);              // 最後の項目をコピー
}
   

※SSL暗号化通信対応

佐伯英子技術士事務所 〒542-0073 大阪市中央区日本橋 1-14-13 サンオフィス日本橋601  E-mail: info@saeki-pe.com