文字列の読み取り – プログラミング – Home

通知
すべてクリア

文字列の読み取り


cos
 cos
(@cos)
ゲスト
結合: 16年前
投稿: 2
Topic starter  

こんにちわ
ファイルの読み取りクラスを作ろうと思い実装していますが
トークンの取得の仕方で困っています。

まずファイルを開く関数で
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,;\")といったように無効文字を指定しています。
このままだと欲しいトークンを取得できないのですがどうしたらいいのかわかりませ
ん。
よろしくお願いします。


引用解決済
トピックタグ
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 18年前
投稿: 178
 

> Separatorには_T( \t\r\n,;\")といったように無効文字を指定しています。

_tcscspn()を使ったらよいのではないでしょうか?
見つからなかった場合の動作には注意が必要かも知れませんけど。

あるいは_tcstok()を使うとか。
# 元の文字列が破壊されるかも知れませんけど。


返信引用
cos
 cos
(@cos)
ゲスト
結合: 16年前
投稿: 2
Topic starter  

_tcscspn()は使用したいのですが一行コメント(//)や長文コメント(/*~*/)なんかにも
使用したいのでやはりtcschrを使いたいんです。


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

> このままだと欲しいトークンを取得できないのですが
ここの所を具体的にどういう問題があるのかを説明出来ますか?
説明がうまく出来れば、おのずから解決方法が見えてくるのではないでしょうか。

# 対象がC言語ソースファイルならば、
# >Separatorには_T( \t\r\n,;\")といったように無効文字を指定しています。
# はまずいような気が... ';', '\'が消えちゃうよね。


返信引用
wclrp ( 'o')
 wclrp ( 'o')
(@wclrp ( 'o'))
ゲスト
結合: 18年前
投稿: 287
 

本格的なトークンなのかな。

俺の知っている方法だと一文字一文字チェックする方法。
疑似言語的には以下のような感じ

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コメント();

どっかからソース見つけて参考にした方がいいな


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました