#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//----------------------------------------------------------------------------//
// マクロの定義 //
//----------------------------------------------------------------------------//
#define MAX_DECODE_LENG 50 // _itoa(), _gcvt()の際に使用する配列のインデックスの最大値
#define MAX_DATA 500 // 構造体DATAの計測データの記憶できる個数の最大値
#define INSERT_COMMA( fp ) fprintf( fp, "," ); // コンマの書き出しマクロ
#define INSERT_RETURN( fp ) fprintf( fp, "\n" ); // 改行の書き出しマクロ
// varをファイルに書き出してコンマを挿入するマクロ
#define WRITE_VAR_AND_COMMA( var, fp ) fprintf( fp, var ); \
INSERT_COMMA( fp )
// varをファイルに書き出して改行を挿入するマクロ
#define WRITE_VAR_AND_RETURN( var, fp ) fprintf( fp, var ); \
INSERT_RETURN( fp )
#define WRITE "w" // OutputData_CSVFormat()のファイルの書き込みモード
#define APPEND "a" // 追加書き込み
#define SHOW_WORKING // OutputData_CSVFormat()の動作状況の表示
//----------------------------------------------------------------------------//
// 構造体 DATAの定義 //
//----------------------------------------------------------------------------//
typedef struct {
char* p_strTitle; // 計測のタイトル
char* p_strData1_Name; // 計測データ1の名前
char* p_strData2_Name; // 計測データ2の名前
int nDataCount; // 計測データの個数
int nSampling[MAX_DATA]; // サンプリング数
double dbData1[MAX_DATA]; // データ1
double dbData2[MAX_DATA]; // データ2
} DATA;
//----------------------------------------------------------------------------//
// Name : OutputData_CSVFormat()
// Desc : CSVフォーマットで計測データを出力する
// Parameter
// pFileName : (in) ファイル名(拡張子.csvも必要)
// Data : (in) 計測データ
// p_mode : (in) 書き込みモード
// WRITE または"w"を指定するとファイルが存在すると上書きされる
// APPEND または"a"を指定するとファイルの最後から書き込む
//
// Note : #define SHOW_WORKING で動作状況の表示をする
//----------------------------------------------------------------------------//
void OutputData_CSVFormat( char* pFileName, DATA Data, char* p_mode )
{
FILE* fp = NULL;
char strData[MAX_DECODE_LENG];
char strSampling[MAX_DECODE_LENG];
fp = fopen( pFileName, p_mode );
if( fp == NULL ) {
printf("ファイルオープンの失敗.\n");
exit( 1 );
}
#ifdef SHOW_WORKING
printf( "ファイルをオープンしました.[%s, %s]\n", pFileName, Data.p_strTitle );
#endif
WRITE_VAR_AND_RETURN( Data.p_strTitle, fp ) // タイトルの書き出し
WRITE_VAR_AND_COMMA( "サンプル数", fp ) // "サンプル数"の書き出し
WRITE_VAR_AND_COMMA( Data.p_strData1_Name, fp ) // "Data1の名前の書き出し
WRITE_VAR_AND_RETURN( Data.p_strData2_Name, fp ) // "Data2の名前の書き出し
for( int i = 0; i < Data.nDataCount; i++ ) {
_itoa( Data.nSampling[i], strSampling, 10 );
WRITE_VAR_AND_COMMA( strSampling, fp ); // 試行回数の書き出し
_gcvt( Data.dbData1[i], 10, strData );
WRITE_VAR_AND_COMMA( strData, fp ); // Data1の書き出し
_gcvt( Data.dbData2[i], 10, strData );
WRITE_VAR_AND_RETURN( strData, fp ); // Data2の書き出し
}
INSERT_RETURN( fp ); // 改行の書き出し
INSERT_RETURN( fp ); // 改行の書き出し
fclose( fp );
#ifdef SHOW_WORKING
printf( "ファイルをクローズしました.[%s, %s]\n\n", pFileName, Data.p_strTitle );
#endif
}
|
 |