ファイル内の文字列の検索

[戻る]
たけと 2004/01/28(水) 01:09:02
WindowsXp,VC++6.0で開発しています。

あるファイルXXX.txtがあるとします。
このファイルに"aaa"という文字列が含まれている
かどうか判断したいのですが、どんな方法がありますか。
CFileで一定バイトごと文字列を取得して、CStringのFindOneOfを使って
"aaa"を調べていく以外に方法はありますか?

よろしくお願いいたします。

tib 2004/01/28(水) 09:12:34
> CFileで一定バイトごと...以外に方法はありますか?
なぜそれ以外の方法を探しているのかが解らないのでイマイチ答えづらいのですが、

CString::FindOneOf()の他にもstd::basic_string::find()を使うとか、
http://www.boost.org/ などを探れば正規表現までサポートしたライブラリがみつかりま
すが、「ファイルを開く → メモリに一部または全部を展開する → キーワードを検索す
る」という流れ自体は普遍だと思います。

謎の怪鳥 2004/01/28(水) 14:45:50
メモリマップドファイルを使用して
ファイルの内容を、仮想メモリ上に
マッピングするといいのではないでしょうか?

でマッピングができたら、strstr関数や
CString::FindOneOfといった文字列検索関数が
使用可能なので、メモリ上での文字列検索と同じような
イメージで処理が可能です。

メモリマップドファイルについては、
CreateFileMapping(),MapViewOfFile()といった
APIのリファレンスを参照して下さい。

==

たけと 2004/01/29(木) 22:38:13
回答ありがとうございます。
やりたいことは、ディレクトリのファイルの中身をすべて検索して、
特定の文字列が含まれるファイル一覧を取得するということです。
grepに似ていると思いますが、こういう場合は普通メモリマップドファイル
を使用するのですか?

wood 2004/01/30(金) 07:46:41
助言
この手の掲示板(不特定多数を相手にする)の場合
「一般的」・「普通」と言う回答を求めても、あなたの価値観とは違う回答が
帰ってくるのは当たり前のこと、として受け止めたほうがいいですよ

回答者の、利用環境や目的によってさまざまに変化するためです
まず自分の実現したいことに対する「一案」いただける場だと思って利用してください
また、質問者の努力の結果が見られないものは
途中で放置される可能性が大きいので注意しましょう

つまりあなたが一度実現したことを高速処理にしたい質問なのであれば
ソース提示し、その上で質問したほうが良いと思います
何をしたいのか回答者にも伝わりやすいと思います

謎の怪鳥 2004/01/30(金) 20:03:19
改行位置をちょっと変えました。

>grepに似ていると思いますが、
>こういう場合は普通メモリマップドファイル
>を使用するのですか?

普通かどうかはわかりません。
そんな手段もある、という手段の一つを
示したにしか過ぎません。

私が思いつく他の方法としては、

(1) ファイルの内容をメモリ上に全部読み込んでしまい、
    メモリ上で検索する。
 利点)
  ・ロジックが比較的単純
  ・メモリ上だけで走査を行なうので高速。
 欠点)
  ・メモリ上にのりきらない巨大なファイルには使えない。

(2) メモリ上に2KBなり4KBなりのバッファを用意しておき、
    その単位でファイルを細切れに読み込み、バッファの中を
    検索する。
 利点)
  ・ファイルサイズに依存しないので、
    どんなファイルでも検索が出来る。
 欠点)
  ・バッファサイズを超えた文字列は検索できない。
  ・検索対象がバッファを跨る形でファイル読み込みが
    行なわれる場合があるので、そのための配慮が必要。

メモリマップドファイルについても、仮想メモリ上
32ビットアドレスしかありませんので、
2Gバイトを超えるファイルの検索を行なう場合には、
上記(2)と同じような配慮が必要になります。

元祖トスポ 2004/01/30(金) 20:29:40
横槍失礼します

(2)の方法の場合、検索対象がバッファをまたがるようなケースを考慮せねばなりません
し、検索文字列がバッファより大きなサイズになる場合(そんなレアケースに対応しな
くても良さそうですが)はもう一工夫必要だと思います。
テキストファイルだと分かりきっているのであれば、改行文字まで読み込むような仕様
の方がいいかも知れませんが、この辺は検索対象の文字列の特性やファイル次第で色々
なロジックを考えなければならないと思います。

tib 2004/01/30(金) 21:19:00
で、結局たけとさんとしては何を訊きたいのでしょうか。
最初に私が書いた事ですが、あなたが既に実現した機能の何が不満で質問しているのですか?

実現方式によるパフォーマンスの違いを調べたいのですか、プログラミング上想定してい
なかったようなレアケースへの対応ですか、自作したプログラムがバグっていて方針転換
したいのですか、それとも単なる「向学のため」ですか?

別に「向学のため」を否定しているわけではありません。ただ、それならそうと明言した
方が「こんな方法もある」といろんなアイディアを出してもらえると思うのです。

最初の質問を見て私は「画期的なアルゴリズムもしくは既に機能を実装したお手軽ライブ
ラリを知りたいのかな?」と解釈してあのようにレスしました。

古いスレッドには追加発言できません。