こんにちわ
ファイルの読み取りクラスを作ろうと思い実装していますが
トークンの取得の仕方で困っています。
まずファイルを開く関数で
BOOL MyFile::Open(ファイル名)
{
//ファイルを開く
FILE* file = __tfopen( ファイル名, _T( rb ) );
//ファイルサイズを調べコピー
fseek( file , 0, SEEK_END );
int size = ftell( file );
fseek( file , 0, SEEK_SET );
Buffer = new TCHAR[ size + 1 ];
fread( Buffer , size , 1 , file );
Buffer[ size ] = _T( '\0' );
fclose( file );
//バッファの位置を格納
Pointer = Buffer;
}
とファイルを開き、バッファに格納しています
そしてトークンの取得で
LPCTSTR MyFile::GetToken()
{
while( *Pointer )
{
if( _tcschr( Separator , Pointer[ 0 ] ) == NULL ) Pointer ++;
else
{
int size = 0;
// 文字数を取得
while( _tcschr( Separator , Pointer[ size ] ) != NULL ) size ++;
// トークンを新たに作成
Token = debug_new TCHAR[ size + 1 ];
// トークンを設定
_tcsncpy( Token , Pointer , sizeof( TCHAR ) * size );
Token[ size ] = _T( '\0' );
// ポインタを進める
Pointer += size;
return Token;
}
}
}
としています。
Separatorには_T( \t\r\n,;\")といったように無効文字を指定しています。
このままだと欲しいトークンを取得できないのですがどうしたらいいのかわかりませ
ん。
よろしくお願いします。
> Separatorには_T( \t\r\n,;\")といったように無効文字を指定しています。
_tcscspn()を使ったらよいのではないでしょうか?
見つからなかった場合の動作には注意が必要かも知れませんけど。
あるいは_tcstok()を使うとか。
# 元の文字列が破壊されるかも知れませんけど。
_tcscspn()は使用したいのですが一行コメント(//)や長文コメント(/*~*/)なんかにも
使用したいのでやはりtcschrを使いたいんです。
> このままだと欲しいトークンを取得できないのですが
ここの所を具体的にどういう問題があるのかを説明出来ますか?
説明がうまく出来れば、おのずから解決方法が見えてくるのではないでしょうか。
# 対象がC言語ソースファイルならば、
# >Separatorには_T( \t\r\n,;\")といったように無効文字を指定しています。
# はまずいような気が... ';', '\'が消えちゃうよね。
本格的なトークンなのかな。
俺の知っている方法だと一文字一文字チェックする方法。
疑似言語的には以下のような感じ
int MyFile::GetToken()
{
token = ";
if(eofチェック) { type=eof; return; }
if(Pointer[0]が'0-9.'のどれか) return GetToken数値();
if(Pointer[0]が'/')
if(Pointer[1]が'/') {
token = //;
type = COMMENT;
Pointer += token.GetLength();
return;
}
if(Pointer[1]が'*') return GetTokenコメント();
どっかからソース見つけて参考にした方がいいな