レシートCSVメーカ

ある作業を円滑に進めるため,年月日,商品名,価格とメモを,CSVに追記してくプログラムを作った.

効果は,Excelで開いてsum()を入れるときに気がついた.それは,目が疲れにくかったかも,というもの.初めは,TabキーだのEnterだので迷わなくて済む,と考えていた.

デメリットは,IMEオンが Alt+漢字 になること.コマンドプロンプト上だから.

gets()を使っていた部分などを書き直したのが次のコードである.なぜだか,ctype.hまでインクルードしてた.

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

#define TAILWORD "qwerty"
#define CSVFILENAME "qwerty.csv"
#define DATESTRINGSIZE 8

int main(void){

	typedef struct{
		int money;
		char name[BUFSIZ];
		char memo[BUFSIZ];
		char date[DATESTRINGSIZE];
	} item_t;

	item_t item;
	FILE *fp;

	fp = fopen(CSVFILENAME, "at");
	if(!fp){
		puts("ファイルオープンに失敗.終了する");
		exit(1);
	}

	while(1){
		puts("データある?");

		printf("項目: ");
		fgets(item.name, BUFSIZ-1, stdin);
		item.name[strlen(item.name)-1] = '\0';

		printf("金額: ");
		fgets(item.memo, BUFSIZ-1, stdin);
		item.memo[strlen(item.memo)-1] = '\0';
		item.money = atoi(item.memo);

		printf("年月日(YYYYMMDD): ");
		fgets(item.date, DATESTRINGSIZE-1, stdin);
		item.date[strlen(item.date)-1] = '\0';

		printf("メモ: ");
		fgets(item.memo, BUFSIZ-1, stdin);
		item.memo[strlen(item.memo)-1] = '\0';

		if(!strncmp(item.name, TAILWORD, sizeof(TAILWORD))){
			puts("終了処理へ・・・");
			break;
		}else if( item.name[0]=='\0' || item.name[0]=='\n' || strlen(item.date)!=DATESTRINGSIZE){
			puts("何かがおかしかったので無かったことにします");
			printf("終了するときは,項目名を %s としてください\n", TAILWORD);
		}else{
			fprintf(fp, "%c%c%c%c,%c%c,%c%c,%s,%d,%s\n",
				item.date[0], item.date[1], item.date[2], item.date[3],
				item.date[4], item.date[5], item.date[6], item.date[7],
				item.name, item.money, item.memo);
		}
	}

	fclose(fp);

	return 0;
}

code2htmltextの不具合を修正するのに手間取った.