|
バイナリファイルとテキストファイルへの出力はきちんとできているのですが、
得点・合計得点出力のところでつまづいてしまいます。
どうすればいいでしょうか?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct{ /*出力レイアウト*/
char name[20];
int ten[3];
}RECORD;
void create_bin_file(char *);
void copy_bin_to_csv(char *,char *);
void display_csv_file(char *);
FILE *fpbin, *fpcsv; /*FILE構造体(グローバル変数)*/
void main(int argc, char **argv)
{
if (argc != 3){
printf("コマンドライン引数に誤りがあります。\n");
printf("Usage:a.out filename1 filename2\n");
exit(EXIT_FAILURE);
}
create_bin_file(argv[1]); /* キーボード ⇒ バイナリィファイル */
copy_bin_to_csv(argv[1],argv[2]); /* バイナリィファイル ⇒ CSV(テキスト)ファイル */
display_csv_file(argv[2]); /* CSV(テキスト)ファイル ⇒ ディスプレィ */
}
/*
* キーボードから入力したデータを構造体レコード(バイナリィ)にしてファイル出力する
*/
void create_bin_file(char *filename)
{
RECORD seiseki;
int i;
int ten;
/*ファイルを出力(バイナリィファイル)モードでオープンする(要エラーチェック!)*/
if((fpbin = fopen(filename,"w+b")) == NULL){
printf("error\n");
exit(1);
}
/*gets()で氏名にctrl+z(戻り値=Null)が入力されるまで処理を繰り返す*/
while(printf("name(Ctrl + Z終了) >"),gets(seiseki.name) != NULL){
/*氏名にctrl+z以外が入力された場合、得点1、得点2、得点3を入力する。*/
if(seiseki.name != NULL){
for(i = 0; i < 3;i++){
printf("得点%d >", i + 1);
scanf("%d", &seiseki.ten[i]);
}
}
fprintf(fpbin,"%s %d %d %d ", seiseki.name, seiseki.ten[0],seiseki.ten[1],seiseki.ten[2]);
/*構造体レコードを1件ずつ出力(要エラーチェック!)*/
printf("name:%s 得点1:%d 得点2:%d 得点3:%d\n", seiseki.name, seiseki.ten[0], seiseki.ten[1], seiseki.ten[2]);
rewind(stdin); /* キーボードバッファのクリア*/
}
/*ファイルクローズ*/
fclose(fpbin);
}
/*
* 構造体レコード(バイナリィ)ファイルをCSV(テキスト・カンマセパレート形式)ファイルに変換する
*/
void copy_bin_to_csv(char *infile,char *outfile)
{
RECORD seiseki;
/*ファイルを入力(バイナリィファイル)モードでオープンする(要エラーチェック!)*/
if((fpbin = fopen(infile,"rb")) == NULL){
printf("error\n");
exit(1);
}
/*ファイルを出力(テキストファイル)モードでオープンする(要エラーチェック!)*/
if((fpcsv = fopen(outfile,"w+")) == NULL){
printf("error\n");
exit(1);
}
/*構造体レコードをEOFまで1件ずつ入力(要エラーチェック!)*/
while(fscanf(fpbin,"%s%d%d%d", &seiseki.name[0], &seiseki.ten[0],&seiseki.ten[1],&seiseki.ten[2]) != EOF)
/*入力した構造体のメンバ間に','を挿入しファイルへ出力(要エラーチェック!)*/
fprintf(fpcsv,"%s, %d,%d,%d,\n", seiseki.name, seiseki.ten[0], seiseki.ten[1], seiseki.ten[2]);
/*ファイルクローズ*/
fclose(fpbin);
fclose(fpcsv);
}
/*
* CSV(テキスト・カンマセパレート形式)ファイルをトークンに分けて表示し、合計を計算表示する
*/
void display_csv_file(char *filename)
{
char buf[255];
int i, sum, tokkuten[3];
/*ファイルを入力(テキストファイル)モードでオープンする(要エラーチェック!)*/
if((fpcsv = fopen(filename,"r+")) == NULL){
printf("error\n");
exit(1);
}
/*見出し部表示*/
/*CSVレコードをEOFまで1件ずつ入力(要エラーチェック!)*/
while(fscanf(fpcsv,"%s%d%d%d", &buf[0], &tokkuten[0],&tokkuten[1],&tokkuten[2]) != EOF){
/*名前表示*/
strtok(buf,",");
printf("name:%s ",buf);
/*得点表示&合計計算*/
printf("得点1:%d 得点2:%d 得点3:%d", tokkuten[0],tokkuten[1],tokkuten[2]);
sum = tokkuten[0] + tokkuten[1] + tokkuten[2];
/*合計表示*/
printf(" 合計得点: %d\n", sum);
}
/*ファイルクローズ*/
fclose(fpcsv);
}
|