• 締切済み

C言語でコマンド引数にワイルドカードを使うには?サブディレクトリも探索させるには?

C言語で(下記の環境で) ワイルドカードを使うにはどうしたら良いでしょうか? 現在作成中のプログラムで、program.exe data1012.log とかいう形で処理ができるようになりました。ところで、引数に書いたdata1012.logとかが、300個ぐらいあるとして(あるいは別のdirectoryに更に1000個とか、そういうdirが20個ぐらいあり)これを、program.exe *.logとして、一発で処理させることはできるでしょうか?ワイルドカードの展開と、サブディレクトリの探索どちらかだけでもありがたいです。 どうぞよろしくお願い致します。 環境:Borland C v5.5 無料版, windows2000 (DOS窓), ThinkPadです。

みんなの回答

  • KojiS
  • ベストアンサー率46% (145/312)
回答No.1

 当方無料版ではないので無料版はどうなのかわかりません。  ワイルドカードの展開ですが、ワイルドカードを展開するべきかどうかと言う事も考えなければいけないと思います。  ファイルの検索だけでしたら、ワイルドカードを展開せずとも、ワイルドカードのまま findfirst等で検索出来るでしょう。  ワイルドカードを展開したい場合は、WILDARGS.OBJをリンクするか、自分で展開するかです。  WILDARGS.OBJをリンクすると、ファイルがたくさんあった場合に困ると思います。  自分で展開する場合は、DOSのワイルドカードでしたらある程度簡単なアルゴリズムで可能でしょう。ワイルドカードがどう展開されるか考えてみましょう。  正規表現のようなものや複雑なワイルドカードをやりたい場合は、正規表現ライブラリの様な物を探すと良いかもしれません。  サブディレクトリをたどりたければ、同様にファイル検索するのですが、その時にディレクトリ属性だけを検索するようにすればよいでしょう。  後は、再帰処理にするか、工夫するかです。

harapeko99
質問者

お礼

ありがとうございます。ご回答の意味がわかるまでweb検索で色々調べました。 (1) findfirst(), findnext()なる関数が #include<dir.h>で使用可能になることが、ある海外サイトのC関数の説明で、わかりました。(手持ちの処理系で実施したら動作しました)。大変便利だと感激しています。サブディレクトリ検索もできるオプションがあるようです。サブディレクトリ検索各dirに移って全*.logに対して実施する、方法で今は対処しています。 (2)あと、lib/wildargs.objも無料版にも見つかりました。どうやってリンクするか、リンクした後どうやって使うのか等方法がまだわかりません。よってこちらはまだ試していません。対象ファイル数が多すぎる場合、確かにご指摘どおり、上記の,findfirst()関数を用いたほうが問題が生じなさそうで簡便に思えました。 最初は、ご回答のレベルが、非常に高く感じられすぎて、わからなかったです。が、ご回答のkeywordを元にいろいろ調査した結果、良くわかるようになりました。敷居が高くて怖い感じだったC言語にこれまでよりも少し親近感がもてるようになりました。 ありがとうございました。今後ともよろしくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • (C言語等で)既存ファイル群の属性(作成日時)を取り出すには?ファイル名変更するには?

    どうしたら良いでしょうか。いろいろと質問ばかりで恐縮ですが、皆様どうぞよろしくお願い致します。実験で収集された多く(いくつかのdirにある)3000個ぐらいデータの処理を開始したいのですが、その前に、採取時期によってやや不統一さがあるデータファイル名を、年月日時.logなどで統一しようかと思いました。が、初心者のため、どうしたら良いか困ってしまいました。 C言語でなくてもそういうツールがあるという情報でもありがたいですが、ファイルの作成日付とか最終変更日付のMSDOS的?情報を採取して、ファイル名にできるとうれしいです。 どうぞよろしくお願い致します。 環境:Borland C v5.5無料版、windows 2000(DOS窓), thinkpad

  • ディレクトリ探索プログラム

    ディレクトリを探索していき、ファイル一覧を表示していくような機能が欲しいのですが、自分でプログラムしたくてもどのように始めればよいのかわからず困っています。後々プログラミングの勉強にも使いたいですのでサンプルのプログラムなどがあれば見せていただきたいです。 できれば C もしくは C++ が希望です。 具体的な内容としましては、 『パソコンのCドライブなどから始めて、その中にあるディレクトリとファイル一覧を表示して、ディレクトリが存在すればその中に入り、またファイルとディレクトリの一覧を表示する。それを繰り返して行き、一番下まで行ったら、ひとつ上の階層に戻り同じことを繰り返す』 という感じです。再帰的なプログラムだと助かりますが、他にもよい方法があれば教えていただきたいです。 宜しくお願いします。

  • C言語のコンパイラ操作について教えてください。

    Borland社が提供していますBorland C++ Compilerというものを使わせていただいてるのですが、初心者の私には難しいのです。 コマンドプロントというのでしょうか・・ C:\Document and Settings\xxxx> と、出てきたので C:\Document and Settings\xxxx>\borland\BCC55\bin と入力しましたら C:\borland\BCC55\bin> に変わりました。 普通にインクルードのプログラムから始められる画面にするにはここからどうすればよろしいのでしょうか?? C:\borland\BCC55\bin>dir と、入力しましたら、何だかbcc32.cfgとかilink32.cfg とか、他にたくさんのデータが表示されました。 どうしたらよろしいのでしょう、よろしくお願いいたします。質問が足りないときは補足させていただきます。

  • C言語でのコマンドライン引数の内部での処理のされ方

    C言語でint main(int argc, char *argv[])とメイン関数を宣言します。 2番目の引数はC言語の文法的にいうと文字列へのポインタの配列だとおもいますが、一般的な関数でこの引数に値を渡すとすると、以下のように宣言されたポインタ配列を渡すことになるとおもいます。 ・宣言 char *pa[]; ・関数への渡し func(pa); 話が元に戻りますが、main関数でもらう場合は、プログラム外部から与えられた引数は(正確に言うとアドレス)、メモリ上ではC言語で書かれたexeファイルの外から実行時にプログラムファイルのメモリ上にコピーされるのでしょうか? 自分でもうまく表現できないのですが、 ・コマンドプロンプトで引数を与えて実行         ↓ ・プログラムファイルのメモリ上に引数がロードされる ということでいいんでしょうか? 自分でもなんだかうまく表現できないので、お暇な方でよろしいので、気が向いた人、回答ください。 よろしくお願いします。

  • Win2000 DOS窓 C言語で COM1入力バイナリを読み込み表示したい

    どうしたら良いでしょうか。 ThinkPad, Windows2000, DOS窓, Borland C v5.5.1 無料版 COM1の読込みのみ(書き出し無し) dataは、バイナリ形式で、約120Byte/秒(時に121Byte/秒だったり若干変動します)で入ってくる垂れ流し方式。一連のデータの先頭であることは、header (0x10 0x03 0x10 0x75という4バイト)の存在で識別します。 このようにCOM1から入力されてくる情報の一部をシンプルにDOS窓で表示するプログラムを作成したいのです。どんな感じのプログラムを打てばいいのか分かりません。もしわかる人がいましたら教えてください、できればプログラム付で教えてもらえればうれしいです。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=106550 に関連質問と回答がありましたが、UNIXの例でしたので私には使えないので、windows2000のDOS窓、borland C v5.5.1で、動く例を教えて頂けますると、うれしいです。 よろしくお願い致します。

  • C++ で DIR コマンド

    MS-DOSプロンプトで dir と入力すれば、フォルダ内の 様子がMS-DOSプロンプトに表示されるけど、 C++ で、MS-DOSプロンプトで dir と入力したのと同じ 様にするにはどういうプログラムを作ればいいのですか? 別の言い方で書くと、実行すればMS-DOSプロンプトが 起動し、dir と入力されて dirコマンドが実行される というファイルを作るソースが知りたいんです。 dirコマンドが実行される対象となるディレクトリは どこでもいいんです。 C++ のプログラムでも、ディレクトリ構造を出力することが 出来ると思うんだけど、MS-DOSプロンプトでやってみたいんです。 どうしてそんなことがしたいのかというと、C++ が難しそうだから という理由なんです。 例えば、ファイルコピーを自動化するプログラムを作る時、 C++ のプログラムの出力をMS-DOSプロンプトへ渡す方法を知っていれば、 MS-DOSプロンプトでのコピーは copy コピー元 コピー先 という簡単な書式だから、ファイルコピーを自動化するプログラムも 簡単に作れそうだなと思ったんです。

  • 実行結果をコマンドライン引数として渡す方法について

    test1.cはコマンドラインから引数をとり処理するプログラム test2.cは「Hello!」と出力するプログラム。 これらのプログラムをコンパイルして、次のような引数の渡し方をしてHello!と表示したいのですがうまくいきません。 実際の結果 ----------------------------------------- $ ./test1.exe ./test2.exe ($はプロンプト) $ ./test2.exe $ ----------------------------------------- 期待する結果 ----------------------------------------- $ ./test1.exe ./test2.exe $ Hello! $ ----------------------------------------- ここでプログラムの仕様を示しておきます。 プログラム1(test1.c)の中身 -------------------------------------- #include <stdio.h> main(int argc, char *argv[]){ printf("%s\n", argv[1]); } -------------------------------------- プログラム2(test2.c)の中身 -------------------------------------- #include <stdio.h> main(){printf("Hello!\n");} -------------------------------------- よろしくお願いします!

  • 自作C言語プログラムでアプリケーションエラーでwindows2000が言うエラーログはどこにありますか?

    windows2000で、Borland C v5.5 無料版でプログラム開発中です。 C言語内に組み込んだワイルドカード処理ルーチンで同一dirにある複数ファイルを処理します。100個ぐらいあるファイルのうち、60個ぐらい目のファイルまで行くとこけます。該当ファイルが特に悪いというよりファイルを開いたり閉じたりしすぎのような印象を持ちます。理由はまだわかりません。開いたファイルは処理が終わると閉じています。よって開きっぱなしのファイルが多すぎる、ということもないと思うのです。 OS(win2k)は以下のポップアップウインドウをポップアップし、プログラムは終了します。 「アプリケーションエラー:エラーが発生したため501.exeを終了します。プログラムをもう一度開始する必要があります。エラーログを作成しています。OK」 で、このwin2kのポップアップウインドウに書かれている”エラーログ”は、はどこに記録されているか教えてください。よろしくお願いします。

  • C言語 探索に関して

    C言語探索プログラムについて質問です。 #include <stdio.h> #define MAXSIZE 100 void swapData(int *x, int *y){ int tmp; tmp = *x; *x = *y; *y = tmp; } void simpleSort(int data[], int first, int last) { int i, j; for(i = first; i < last; i++){ for(j = i+1; j <= last; j++){ if(data[i] > data[j]) { swapData(&data[i], &data[j]); } } } } int ArrayBinarySearch(int data[], int n, int x) { int left = 0, right = n - 1, center; while(left <= right){ center = (left + right)/2; if(data[center]=x){ return center; }else if(x > data[center]){ left = center + 1; }else if(x < data[center]){ right = center - 1; } } return -1; } int main(int argc, char *argv[]) { int data[MAXSIZE]; int i, x; FILE *fp; scanf("%d", &x); fp = fopen(argv[1], "r"); for(i = 0; i < MAXSIZE; i++) { if (fscanf(fp,"%d", &data[i]) == EOF) break; } simpleSort(data, 0, i-1); printf("%d", ArrayBinarySearch(data, i, x )); return 0; } 数値が書かれたファイルを読み込んでソートした後に二分探索を行うプログラムをつくったのですが、うまく動きません。 どこがおかしいか教えてください。 お願いいたします。 ちなみに関数ArrayBinarySearchは目的の値が見つかれば配列中でのインデックスを、見つからない場合は-1を返す関数にしているつもりです。

  • 猫でもわかるC言語を買って

    タイトルのとおりで、それで、付録のCDからbccを入れて、setbcc.exeを使い、環境設定や、bcc32.cfgとilink32.cfgを作成して再起動し、その後、BCC Dev~も取り込み、BCC Devのコンパイラも参照からbcc.exeに設定しました。 そして、新規作成でデスクトップにプロジェクトを作成し、その中にsample.cという名前.拡張子でCファイルを作成し、Hello World!のプログラムで保存し、いざメイクをすると、 > C:\borland\bcc55\Bin\make.exe -fDebug\sample.mak TARGET MAKE Version 5.2 Copyright (c) 1987, 2000 Borland Fatal: 'C:\borland\bcc55\Bin\sample.c' does not exist - don't know how to make it Make End !! (Elapsed time 0:00.094) となります。そして、実行ができません。 たぶん手順の何かやり忘れているからでしょうが、自分にはさっぱりわかりません。 もし、思い当たる問題点があればぜひ教えてください。 これができなくて本書のほうの第2章から進められなくて困ってます。 書き忘れなどあるかもしれませんが、よろしくお願いします。