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はこのデータの次はこれがくるという法則が分かりやすいので、トークンから取得する分でもそんなに苦にならない・・・気がする。