2009年03月19日

拡張子の取得と文字処理への道筋

いろいろな足固めを視野に入れつつファイルアクセス関連をやっているのだが
「拡張子の取得」を効率的にやる事について考えてみた。
WindowsであればPathFindExtensionあたりを使えばいい話なのだがない。
regexかpcreを使う正規表現での切り出しがUNIXユーザーなら好きそうだろうけれど
どう考えたってコスト高だ。取り敢えずCの標準関数を中心に検討してみた。
今まで自分で組んだやり方は


regex="jpg$";

と後方マッチを指定してpcre_exeを使うperl互換の正規表現の方法で
これはこれで詰めたいが前後の処理が多く汎用性が高すぎてもったいない。

もう一つは文字列を「.jpg」をlongとして文字列長の後ろと比較する方法
一応マスクを使って「.c」あたりもためした。
多分最速で3文字拡張子の場合はいいと思うけれど現実問題として「grade」など長い物があり
ある程度の汎用性を考えるとうんざりしてくる。
ピンポイントで使うべきだろう。

とりあえず上の二つの手法はどちらも正解だが偏っている。

「ファイル名から拡張子を切り出す命令はないか」

という事でCの文字列命令を調べてみた。
位置だし命令として似た命令で
strchrとindex、後ろからみるstrrchrとrindexという命令があった。
*char型のポインタ返すので

char *a="Etb.jpg"
ext=strrchr(a,'.');

とできる。indexとrindexは全く同内容に見えるが言及が少ない。

ext++

とすると探索した「.」の次になるので「jpg」だけにできる。

つまり

strcasecmp(strrchr(a,'.'),".jpg");

で.jpgかどうかわかるわけで「.JPG」でもこれで一致するわけだ。
後腐れのなさと速度と記述性からいくとこの辺が妥当なところではなかろうか。

nullが前提なので後方系のものはnullまでいって最後のアドレスをかえしているのだと思われる。

他に「文字群の一つが一致したら場所を返す」strpbrkとポジションを返すstrspn
文字列が一致した場所を返すstrstrなどがあるが
使う場合は再帰的にポインタを進める必要がありそうだ。

urlや時間文字列の分解にはstrpbrkあたりが使えそうだが
splitに使えそうなstrsepは使い勝手が悪そうに感じた。

glibでもこの手の関数を探したのだがCの関数をラップしたものが多く
辛うじて開放命令とセットのg_strsplitとg_strfreevのセットがつかえそうなくらいだった。
微妙に使えそうなものもあるのだが
結局のところ文字列スキャンしながらどうにかする関数を自分で作るのと比べて
そんなにメリットはなさそうだ。


ラベル:拡張子
posted by Xo_ox at 23:11| Comment(0) | C | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。