• ベストアンサー

文字列置換のアルゴリズムを教えてください。(Windowsプログラミング)

はじめまして。まだプログラミングを始めて間もない学生です。 現在Windowsプログラミングを学習しています。 学校で課題を出されたのですが、どうしても分からないので教えてください。 ある50MB程のテキストファイルがあります。それにはたくさんの個人情報が含まれており、 個人情報保護の観点から個人を特定できなくする必要があります。 そこで、以下のように8桁の患者IDを"*"(アスタリスク)に置換をしなければならないのですが、 その実現方法が分かりません。 ・"<受信歴>患者ID:"に続く0バイト目から8バイトを"*"に置換する。  例えば、「2005/01/01 09:00:00 <受診歴>患者ID:0000001234 内科受診」の行を 「2005/01/01 09:00:00 <受診歴>患者ID:********** 内科受診」とする必要があります。 ファイル内にはこのような該当箇所がたくさんあります。 簡単なウィンドウを作り、そこに配置したボタンを押下することによって指定ファイルが読み込まれ、 置換された新規ファイルが作成されるといった具合です。 ご教授の程、よろしくお願い致します。 <環境> ・OS:Windows2000 ・開発環境:VC++ 6.0 ・できればWin32APIを用いて。標準関数を用いてもよい。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.12

★??? ・課題の仕様は分かりました。 >そして、またまた追加で申し訳ないのですが、一行に同じタイプの置換該当箇所が二箇所以上あった場合、 >現在のソースでは初めの一箇所しか置換できないと思うのですが、どのように修正することで解決できるでしょうか。 >いろいろと試してはいるのですが、なかなか上手く行きません。  ↑  処理のアルゴリズムを整理すべきです。  ここがはっきりしていないと試行錯誤しても無意味です。時間が勿体無いです。 >何だか一番に最初ご質問させて頂いたことよりどんどん要求が高くなってきてしまい、 >申し訳ない気持ちであるのと同時に、自分能力では手に負えない領域に突入してしまった感がありますが、 >最後まで頑張りたいと思います。  ↑  回答No.1~No.11 までをよく読み、提示したソースがなぜそれで上手くいき、自力で作ったソースでは  上手くいかなかったり、無駄に2回ファイルを読んでいたりするかを比較して下さい。  よく読み理解すれば二箇所以上の置換も自力で解決できるはずです。  決して手に負えない領域に突入してはいないはずです。 >P.S. 全角アスタリスクへの置換、上手くできました。紹介していただいた関数のサンプルは、 >今からじっくり読んで理解したいと思います。 >ありがとうございました。  ↑  応援します。頑張って下さい。  上手く出来たらソースを見せてくれると嬉しいです。  それではこれが最後のアドバイスとなることを祈っています。 ・以上。

kenkenpo
質問者

補足

返信が遅くなってしまい、すみませんでした。 週末忙しかったため、メモリを動的に確保する部分にはまだ手を付けられていないのですが、 それ以外はなんとか思うような動きをするようになりました。 検索文字列のパターンが増えた場合にも対応できるように、検索&置き換えの機能を関数化しました。 完成版のソースを載せられるように、頑張ります。 いつも、親身なアドバイス本当にありがとうございます。

その他の回答 (11)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★アドバイス ・最初にファイルの入出力はどんな方法で行っていますか?  C言語のランタイムライブラリの fopen、fclose 系ですか?  それとも Win32 API の CreateFile、CloseHandle 系ですか?  MFC は使っているの? ・あと CUI、GUI プログラムのどちらですか?  CUI はコマンドプロンプトで実行するタイプです。  GUI はウインドウが出るタイプです。 ・以上。補足要求します。→下の『参考URL』もどうぞ。Win32 API でのファイル操作。

参考URL:
http://wisdom.sakura.ne.jp/system/winapi/win32/win111.html
kenkenpo
質問者

補足

早速のご回答ありがとうございます。 ・現在、ファイル入出力はWin32APIのCreateFile、CloseHandleで行っています。 置換の部分がどうしても分らないので、ただ読み込んで、新規ファイルを作成し書き込みをするところまでしか至ってません。 C言語のランタイムライブラリを使用した方が効率が良いのであれば、そちらの使用も考えています。 MFCは使用しません。 ・GUIプログラムです。といっても、ウィンドウに1つボタンがついているだけです。 処理の進行状況はメッセージボックスで表示するようにしています。 case WM_COMMAND: switch(LOWORD(wp)){ case ID_BUTTON: hFile = CreateFile(・・・・ といった具合です。 ・重ねての質問で申し訳ないのですが、やはり50MB程度のファイルを読み込むときは、 GetFileSize→GlobalAlloc→GlobalLockと行った流れでは問題でしょうか? MSDNによると、VirtualAllocを使用したほうが良いとのことですが、引数の設定の仕方などがあまりよく分らないもので・・・ ・できれば、処理速度も考慮に入れたいです。 お手数お掛けしますが、ご教授の程よろしくお願い致します。

関連するQ&A