[Python] 281 C言語実行ファイルの併用

前回記事で試みたCモジュールの導入は残念ながらうまくいきませんでしたが、次にPythonコードからターミナルコマンドでC言語実行ファイルを走らせてみたところ、こちらの方は難なく成功しました。

Pythonだけで処理するよりも10倍以上の速さです。

ファイルを介してデータのやり取りをするのであれば、この方法で問題ありません。

C言語のコードを書くのは初心者ゆえかなりしんどいものの、その凄まじい実力を知ってしまったら使わずにはいられないです。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
	FILE *fp; // 誕生年競走馬リスト
	int horseID[9]; // 1 horseID
	char horse_name[50]; // 2 検索馬名
	char horse_name0[50]; // 3 馬名
	char status[10]; // 4 稼働
	char gender[10]; // 5 性別
	char hair[10]; // 6 毛色
	char birthday[50]; // 7 生年月日
	char trainer[50]; // 8 調教師
	char owner[50]; // 9 馬主
	char info[100]; // 10 募集情報
	char breeder[50]; // 11 生産者
	char area[50]; // 12 産地
	char price[50]; // 13 セリ取引価格
	char prize_money[50]; // 14 獲得賞金
	char result[50]; // 15 通算成績
	char winning_race[100]; // 16 主な勝鞍
	char relatives[100]; // 17 近親馬

	char horse_name_in[50]; // 検索馬名
	FILE *fp2; // 入力ファイル
	FILE *fp3; // 出力ファイル

	char buf[2000]; // fgets用
	char buf2[200]; // 検索馬名用

	int i=0;
	int strcmp(const char *s1, const char *s2);

	char fname[100];
	char fname2[] = "path_horse.txt"; // 誕生年競走馬リストのパスと競走馬名
	char fname3[] = "horseID.csv"; // 検索結果

	fp2 = fopen(fname2, "r");
	while(fgets(buf2,200, fp2) != NULL ) {
		sscanf(buf2,"%[^,],%s",fname,horse_name_in);

		fp = fopen(fname, "r");

		if(fp == NULL) {
		printf("%s file not open!\n", fname);
		return -1;
		}

		while(fgets( buf,2000, fp ) != NULL ) {
			sscanf(buf, " %9s, %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %s",horseID,horse_name,horse_name0,status,gender,hair,birthday,trainer,owner,info,breeder,area,price,prize_money,result,winning_race,relatives ) ;

			if (i != 0){
				if (strcmp(horse_name,horse_name_in)==0){
					fp3 = fopen(fname3, "a");
					fprintf(fp3, "%s,%9s\n", horse_name,horseID);
					fclose(fp3);
					break;
				}
			}
			i ++ ;
		}
		fp3 = fopen(fname3, "a");
        // ヒットしなかった馬名には仮番号100000000を付ける
		fprintf(fp3, "%s,100000000\n", horse_name_in);
		fclose(fp3);
		fclose(fp);
	}
	fclose(fp2);
	printf("C言語実行しました");
}