プログラム高速化について
http://oshiete1.goo.ne.jp/qa5810041.html
で質問させていただいた者です。
ソースは下ので動いているのですが、北海道近辺の郵便番号を調べようとするとすぐに結果が返ってくるのですが、
沖縄県辺りですと少し時間がかかってしまいます。(わずかな差ですが…)
恐らく、上から1個ずつしらみつぶしに調べているのでそのような結果になっているのはわかるのですが…
これを高速化するにはwhile文をいじる必要があると思うのですが、どのようにしたら良いでしょうか?
以下がプログラムになります。
ken_all.csvの場所:http://www.post.japanpost.jp/zipcode/dl/kogaki.html
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define NAME "ken_all.csv"
#define SIZE 1024
#define setstr(x,z) {strcpy(x,strtok(z,",\""));}
struct tb{ //構造体設定
char dummy[SIZE]; //全国地方公共団体コード
char old_num[SIZE]; //旧郵便番号
char now_num[SIZE]; //現在の郵便番号
char kana1[SIZE]; //都道府県名(カナ)
char kana2[SIZE]; //市区町村名(カナ)
char kana3[SIZE]; //町域名(カナ)
char kanji1[SIZE]; //都道府県名(漢字)
char kanji2[SIZE]; //市区町村名(漢字)
char kanji3[SIZE]; //町域名(漢字)
};
int main(int argc, char *argv[]) {
struct tb line;
FILE *fp;
char *address, buff[SIZE], string_buff[SIZE];
int flag;
clock_t start,end;
start = clock();
if(argc == 1){
printf("引数を指定してください\n");
}
if(argc > 2){
printf("引数が多すぎます、引数は1つにしてください。\n");
return -1;
}
if((fp=fopen(NAME,"r"))==NULL){
printf("ファイル%sが開けません\n",NAME);
return -1;
}
flag=0;
address = argv[1];
while(fgets(buff,SIZE,fp) != NULL){
//各項目の設定
strcpy(line.dummy,strtok(buff,",\""));
strcpy(line.old_num,strtok(NULL,",\""));
strcpy(line.now_num,strtok(NULL,",\""));
strcpy(line.kana1,strtok(NULL,",\""));
strcpy(line.kana2,strtok(NULL,",\""));
strcpy(line.kana3,strtok(NULL,",\""));
strcpy(line.kanji1,strtok(NULL,",\""));
strcpy(line.kanji2,strtok(NULL,",\""));
strcpy(line.kanji3,strtok(NULL,",\""));
//文字の連結
strcpy(string_buff,line.kanji1);
strcat(string_buff,line.kanji2);
strcat(string_buff,line.kanji3);
//住所の比較
if(strcmp(string_buff,address)==0){
printf("〒%s \n",line.now_num);
flag=1;
break;
}
//郵便番号の比較
if(strcmp(line.now_num,address)==0){
printf("%s \n",string_buff);
flag=1;
break;
}
}
fclose(fp);
if(flag==0 && atoi(argv[1]) == 0){
printf("「%s」に該当する郵便番号はありませんでした\n",address);
}
if(flag==0 && atoi(argv[1]) != 0){
printf("「%s」に該当する住所はありませんでした\n",address);
}
end = clock();
printf("%.30f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC);
return 0;
}
お礼
回答していただいた通りに修正したところ、期待通りの動作が確認できました。 素早い回答と解説、ありがとうございました。