• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語での置換処理について)

C言語でのファイルの置換処理について

このQ&Aのポイント
  • C言語でのファイルの置換処理について質問があります。引数で指定されたディレクトリ配下のファイル全てに置換処理を行いたいと考えています。
  • 具体的には、ディレクトリ配下に存在するファイルを開き、1行ずつ置換文字列のチェックを行い、置換が必要ならば置換処理を行い、最終的にファイルを書き込む方法を知りたいです。
  • また、ディレクトリ配下のファイル名を取得し、ファイルの件数分ループさせる方法についても教えていただけると助かります。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

「速度」は、大して変わらない。作り方が下手だと、Cの方が遅い。 と思います。 ・コマンドは、プログラムに詳しい人が、効率等も考慮した上で作ったものです。 ソースコードはCやC++で書かれたものがほとんどです。 新たにCで作ったところで、同レベルのものにしかなりません。 下手すれば効率の悪いアルゴリズムにより遅くなります。 ・複数のコマンドを実行するとき、プロセス生成というオーバーヘッドがかかります。 その点では、一つのプロセスで全部やるようなCのプログラムを作る、というのは有利になります。 しかし、最近のコンピュータの性能、そして今回やりたい処理が「CPUやメモリに比べてとても遅い」ファイル操作だということを考慮すると、このオーバーヘッドによる影響は少ないと予想されます。 また、配布を考えた場合、バイナリの実行ファイルだと、構成の違う装置で実行できない場合があります。 これを防ぐにはソースコードでの配布が必要でしょう。 シェルスクリプトや、Perlスクリプトでは、環境の違いに対しての影響が少ないです

OMEGA_3210_50
質問者

お礼

お礼が遅れてしまい申し訳ありませんでした。 sedを使用し、ツールとして求められている性能を 満たすことが出来ました。 また、sedが使用できるため汎用的に使用できる シェルスクリプトでの開発を行いました。 様々なアドバイスありがとうございました。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

#2 でも書かれているように, この例だと実行時間のほとんどは「ファイルの読み書き」に費やされます. そのことを念頭に置くと ・頑張って書けば C で書く方が速い (逆に言えば「頑張らないと勝てない」) ・ただしその違いはほとんど無視できる程度 (どうがんばっても「ファイルの読み書きに費やす時間」は変わらないので) だと思います. 「プロセスの生成にかかる時間」も, Perl 等なら変わらないと思っていいでしょう (1つのプロセスで全ファイルに対して置換すればいいだけ). ちなみに「C言語にてディレクトリ配下のファイル名を取得し、ファイルの件数分ループさせる」のは Unix なら dirent.h を #include して opendir/readdir/closedir が常套手段, かな.

OMEGA_3210_50
質問者

お礼

ご回答ありがとうございます。 やはりツールとC言語で作成したプログラム とではそんなに性能が変わらないようですね。 「opendir/readdir/closedir」は、初めて知った 関数です。 今後使用させていただきます。 ありがとうございました。

  • ninoue
  • ベストアンサー率52% (1288/2437)
回答No.3

質問に書かれている機能は、Windowsシステム上ではプログラマ等に一番よく使われている秀丸エディタの標準組み込みコマンドで簡単に実行出来ます。 grep機能、grepして置換の機能等があります。 キー割り当てをしておけばワンアクションでgrepして置換の機能が呼び出せます。 検索/置換文字列の指定、検索するフォルダの指定、サブフォルダの指定等が可能です。 数百MBの複数の大容量ファイルでも高速に処理可能です。 シェアウェアですが、フル機能版のダウンロードテスト実行が可能です。 (数十年前から使っていますが最新版もそのまま使用でき、結局自分の場合年間使用料は50円?程度にしかならない計算です) サポート会議室やユーザー作成のマクロ等も便利に使えます。 http://www.forest.impress.co.jp/library/software/hidemaru/ http://www.maruo.co.jp/hidesoft/2/indexg.html http://hide.maruo.co.jp/lib/macro/index.html 先ずは対応ディレクトリ以下のファイルを別の場所にコピーしてテスト実行をしてみて下さい。 次のように辿って指定し、実行出来ます。 その他 コマンド一覧 検索系 grepして置換

OMEGA_3210_50
質問者

お礼

ご回答ありがとうございます。 なるほど。エディタでの対応は、考えていませんでした。 ただ、Windows上の開発ですとLINUX、Windows間の データ移動が発生するため今回は見送らせていただきます。 すみません。 今後参考にさせていただきたいと思います。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

少なくとも、今この程度の質問をしているあなたがCのプログラムを完成させるより、 trコマンド等で処理した方が、「早く」終わるでしょう。 trコマンドは 「文字A」 を 「文字B」 へ変換するコマンドです。 tr ABC abc < file1 で file1の Aをaに、Bをbに、Cをcに、変換します。 入力ファイルは標準入力で指定するしかありません。 http://linuxjm.sourceforge.jp/html/GNU_textutils/man1/tr.1.html 「10分かかっても終らない」とは tr abcABC fie1 等と、ファイル名が置換パターンとして認識されるようなコマンドラインで実行しているのではないでしょうか? そのため、標準入力が端末からの入力となり、キーボードでの入力を待っている状態ではないでしょうか? また、置換というと「文字列A」 を「文字列B」へ変更するようなことです。 tr の「文字から文字へ」という変換が、あなたがやりたいことなのでしょうか? 「文字列から文字列へ」の変換なら、trではできません。 sed の方が一般的でしょう。 「日本語」での置換となると、少しやっかいです。 特にShift_JISはやっかいです。 Perl,php等のマルチバイトに対応したスクリプト言語を使うのがよいでしょう。 ディレクトリ配下にあるファイルを探すには、 find コマンドが定番です。 特に, -file , -exec と組合せて、「指定したディレクトリ配下にある特定のファイル名のファイルに対して、特定のコマンドを実行する」というコマンドを実行できます。

OMEGA_3210_50
質問者

お礼

ご回答ありがとうございました。 申し訳ありません。 お恥ずかしい限りです。 したい事は、上記でいわれている「文字列A」 を「文字列B」に 変換する置換です。trコマンドを使用する事がそもそも間違いでした。 また、「find」の使用が定番であるということも勉強になりました。 今回作成しようとしているプログラムは今後ツールとして提供しようとしているものなので、UNIXコマンドとC言語のプログラムでの置換どちらの方が処理が早いのかが気になり質問させていただきました。

関連するQ&A