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

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

C言語での置換処理について

引数で指定されたディレクトリ配下のファイル全てに置換処理を行う 処理をC言語で作成したいと考えています。 ディレクトリ配下には、最大で100MB位のファイルが約100件存在する 想定です。 (ファイルのサイズ、件数は実行毎に異なります。) そこで2点ほど教えていただきたいことがあります。 1.基本的に、UNIXコマンドのtrコマンドでで置換するより、C言語で   全てのファイルを開き1行ずつ、「置換文字列のチェック」→   「置換文字列が存在すれば置換」→「ファイル書込み」と行った   ほうが早いものでしょうか?   (trコマンドを実行したところ、10分待っても処理が完了しませんでした。) 2.C言語にてディレクトリ配下のファイル名を取得し、ファイルの   件数分ループさせるにはどのようにすればよいのでしょうか?   execコマンドにて「ls -l test.txt | awk '{print $○}'」   (ファイル名のみ取得)の結果をファイルに出力し、そのファイル   からファイル名を取得し、EOFになるまでループすることで出来る   と思いますが、この方法は一般的でしょうか?   出来れば余計なファイルは、作成したくないと考えています。 ご回答の方、よろしくお願いします。

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

  • ベストアンサー
  • 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

  • C言語中でunixのコマンドを使いたい

    c言語でプログラムを作ってるんですが、カレントディレクトリ名や、ある名前のファイルが存在するかどうかや、あるファイル中にある文字列があるかどうかなどの判定を行いたいんですが、cで一から記述すると長くなりそうなので、pwcやfind、grepといったコマンドをc言語中で実行でると便利だと思ったんですが、そんな事ってできますかね?

  • c言語の実行が分かりません

    C言語のプログラムを実行させる方法が分かりません。 unixでC言語を以下の手順で学習しています。 1 emacs上でファイル名.cというソースファイルを作成。 2 xterm上で gcc ファイル名.c と入力 その後xterm上で後一つコマンドを入力すればいいのですが、そのコマンドを忘れてしまいました。教えていただければ、ありがたいです。

  • テキストファイル内の任意の文字列を置換

    ※http://okwave.jp/qa2627431.html を改めさせて頂きます。 よろしくお願いします。 OS: Windows Server 2003(以下W2K3), Windows 2000 Server(以下W2K) MS-DOSコマンドによるバッチで、あるテキストファイル(.txt)内を検索し、 任意の文字列を見つけたら別の文字列に置換する、という ものを検討中です。 ★目的  1)「Dir /s /a <パス>」の結果として出力されるドライブレターを、   例えば全て「D:\」から全て「E:\」へ変更。   (あくまでも「D:\」を置換するのであって「D」のみは考慮しません。)  2) 1) の結果をFCコマンドで比較。   具体的には、W2K 上のあるディレクトリ配下と   W2K3 上のあるディレクトリ配下を比較し相違点を検出したい。 ★その他問題点  W2K と W2k3 での Dirコマンド結果の仕様に違いがあるようです。   →時刻とファイル名、<DIR>とディレクトリ名の間の半角スペース数。    他、気づいていない違いがある可能性もあります。    ※FCコマンドが半角スペース数の違いを検出するようです)  半角スペースの置換で回避を検討中です。 ★参考にしているバッチ  下記ページのsample.batを参考に検討中です。  置換対象文字列以外は何も変えずに実行してもうまく動きません。  例えば、「指定されたファイルが見つかりません」や結果として  出力されるファイル内容がドライブレターを置き換えたものになってい  なかったりします。  http://www.fpcu.jp/dosvcmd/bbs/log/cat3/cat54/2-0391.html どうぞ、アドバイスのほど、宜しくお願い致します。

  • C言語について

    パソコン系の就職に就きたく、C言語について勉強したいと思い、 本を買い勉強することにしました。 しかし、最初の初歩でつまずいてしまいました。 プログラムがコンパイル出来ないのです… ソースファイルを保存したディレクトリに移動してとかいてあるのですが何を移動するのでしょうか? コマンドプロントを使えません。 助けてください…

  • C言語のプログラムにて二つの処理を並列させる方法はあるのでしょうか?

    C言語の並列処理について調べているのですが、並列処理はfor文などの単調な処理を並列処理にすることで実行を早くするということがわかったのですが、実行ファイル内で同時に二つの違う動作をさせることは可能なのでしょうか?

  • java C言語では[system(**)]

    c言語ではコマンドラインに指定の文字列を入れて実行させるには system(***); をつかいますが javaではどのように書くのでしょうか?・ ご教授お願いします。

  • C言語について

    C言語初心者です。 「かんたんC言語」という書籍で学習しております。 コマンドプロンプトでのプログラムの実行方法がよくわかりません。 教えて頂けないでしょうか?

  • C言語を始めたのですが

    最近C言語を初めています。ソフトとしてCPad for Borland C++compilerを使っています。 初めの一日目はそれで作ったものを実行ボタンで実行できたのですが、 次の日からファイルを開いて実行を押してもそのファイルがある場所(デスクトップなど)が記されているだけて、何もプログラムが実行されません。 なにか押してみても '○○' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 と表示されます。何か原因があるのでしょうか?もしも解消できるかたいれば教えてください。また、他に初心者におすすめなソフトを教えてもらえないでしょうか?今使っているのは今現在インストールできないみたいなのですが、他に使いやすいソフトあれば教えてください。 長くなりましたが、よろしくお願いいたします。

  • C言語を使ってコンボボックスとか作ることができるのか??(初心者)

    こんばんわ プログラミングを最近始めた超初心者です どれくらい初心者かというと、コマンドプロントで「はじめてのC言語」みたいな文字列を表示するプログラムを書いたことがある程度のプログラミング歴です。 で、質問なんですが、C言語の入門書をパラパラと読んでいるのですが、C言語って、実行するときいつもコマンドプロントでしか実行できず、黒画面で白文字のプログラムしかできないような印象を受けるのですが、C言語で作ったプログラム(exeファイル)をダブルクリックしたら、エクセルで言うところのコントロールツールや、ダイヤログボックスが出てくるようなプログラムを作ることはできるのでしょうか??? で、もし、できるのであれば、そういう記事を紹介している本やサイトがあれば教えてほしいのですが、宜しくお願いいたします。

  • 素朴な疑問 (C言語とアセンブラの処理速度の違いについて)

    C言語で作成したプログラムをビルドして実行ファイルを作成するのと、アセンブラ言語(?)をアセンブルして作成した実行ファイルは、どうして処理速度が違うのでしょうか?例えば全く同じ処理を高級言語と低級言語で作成した場合、出来上がったそれぞれの実行ファイルの違いは、コンパイル時に吸収されてしまうわけではないのでしょうか?