xFileとトークン
xFile読み込み部分作成中。
自前でテキスト形式のxFileの読み込みを行う場合、トークンごとに文字列を分解して取得する必要がある。
例えばxFileの中身が
Frame SCENE_ROOT {
FrameTransformMatrix {
1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;;
}
・・・
となっている場合、
"Frame" や "{" や "1.000000"などが区切り文字(ここでは半角スペースやカンマなど)で区切られたトークンとなっている。
ということでトークンを取得する関数を作成。
char* XFileUtility::GetToken( FILE* fp ) { static char tmp[512]; int index = 0; char c = 0; for( ;; ) { // 一文字読み込み。 if( fread( &c, 1, 1, fp ) != 1 ) { // ファイルの終端 or 読み込み失敗。 break; } switch( c ){ case '\n': case '\r': case ';': case ',': case ' ': // 半角スペース case '"': if( index != 0 ) { // すでに読み込んだ文字があればここでトークン終了とする。 tmp[index] = '\0'; return tmp; } // 読み込んだ文字がない場合は区切り文字が連続しているとし、次の文字を読み込む。 break; default: // 区切り文字以外なら保存。 tmp[index] = c; index++; break; } } // トークンが読み込まれていれば終端文字を足して返す。 if( index != 0 ) { tmp[index] = '\0'; return tmp; } // 読み込めなかった場合はNULLを返す。 return NULL; }
文字列を取得する分にはこれで大丈夫っぽい。
数値版も合わせて作成。キャストしただけですが・・。
float XFileUtility::GetTokenFloat( FILE* fp ) { char* pToken = GetToken( fp ); return static_cast<float>( atof(pToken) ); } int XFileUtility::GetTokenInt( FILE* fp ) { char* pToken = GetToken( fp ); return static_cast<int>( atoi(pToken) ); }
xFileはこのデータの次はこれがくるという法則が分かりやすいので、トークンから取得する分でもそんなに苦にならない・・・気がする。