• ベストアンサー

コマンドライン引数の区別【C言語】

コマンドライン引数の区別【C言語】 コマンドラインから二つの引数(ファイル名)を渡すとき、順番が替わっても大丈夫なようにして、それぞれファイルオープンをしたいです。(エラーで”順番が違います”と出力するのはNGです) どうしたら区別できますか。分かる方いらっしゃいましたらご教授願います。 サンプルコードを書いていただけると幸いです。 宜しくお願いします。

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

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.6

コマンドで指定する入力ファイルと出力ファイルの順を自由にするということなら、コマンドラインを明確にする手法としては次のような仕様にする方法があります。 command -i input_file_name -o output_file_name あるいは command -o output_file_name -i input_file_name とコマンドラインを書かせる。 この仕様なら、コマンドライン引数argvを順にみていって、例えばargv[1]が"-i"ならargv[2]には入力ファイル名が入っているし、argv[1]が"-o"ならargv[2]には出力ファイル名が入っている。そういうどちらの場合でも解釈できるコマンドラインオプションの解析をするプログラムを書くだけです。 Cではコマンドライン解析を簡単にする標準ライブラリはなかったと思うので、自作するか、適当なものをネットで見つけてください。 そういうのでなく、二つ並べた名前から一方は入力で一方は出力だと判断するのは、追加情報がなければ一般的に無理です。

bonnnu1126
質問者

お礼

おかげ様で無事解決できました。 ご回答ありがとうございました。

その他の回答 (5)

  • trajaa
  • ベストアンサー率22% (2662/11921)
回答No.5

補足によってようやく意図している事はわかった。 しかし、まだまだ仕様検討の段階で、コード化するのは早計ですね。 Aファイル、Bファイル、それぞれ存在するとき存在しないときにどうするか? 特に出力ファイルが既に存在する場合には、黙って上書きか?追記するのか?それともエラー扱いか?それともファイル名を派生させて新規作成するのか? そもそも、出力ファイル名を入力させること自体が適切か?という考えもある。 何か規則に従ったファイルとして出力しなければならないのなら、その規則でロジック内で自動生成する方法もあるし、規則が明らかなら入力されたファイル名をチェックする事も可能。 何かの課題に単純に答えるだけじゃなくて、どうしたら効率的か?使いやすいか?事前にミスを防げるか? そういう観点で仕様を詰めていければいいね。

bonnnu1126
質問者

お礼

回答者様のおっしゃるとおり、仕様が曖昧な状態でのコード化は早計でした。 仕様を詰めていって解決できました。 ご回答ありがとうございました。

  • TYWalker
  • ベストアンサー率42% (281/661)
回答No.4

2つ引数が与えられて、一方は入力ファイル名、一方は出力ファイル名、どっちが先に引数で渡されるか分からない、ということだから、入力ファイルは必ず存在しますよね。 で、出力ファイルは普通は存在しない(しれっと上書きしちゃうと困る)。 ということで、引数A、Bを渡されたら、それがファイルとして存在するかどうかチェックする。 http://www.tohoho-web.com/lng/199911/99110136.htm A、B両方が存在したら、どっちが入力でどっちが出力かわからないのでエラー。 Aが存在してBが存在しなかったら、Aを入力にして、Bを出力に。 Bが存在してAが存在しなかったら、Bを入力にして、Aを出力に。 A、B両方が存在しなかったらエラー。 これでいいような気がします。 でも、もう一歩考えると、引数は入力ファイル1個でいいんじゃないかな。 存在しなかったらエラー。 存在したらそれを入力にして、出力ファイル名は「out_入力ファイル名」とかで決め打ち。 でも、ここまでのぼくの回答はC言語じゃなくて仕様の問題だな~

bonnnu1126
質問者

お礼

なるほど、そういうやり方もあるんですね! 非常に参考になりました。 ご回答ありがとうございました。

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

「順番が替わっても大丈夫なようにして」ということだから, きっと順番に意味があるんだろう. その「順番の意味」に従って区別すればいい. 「順番の意味」はあなたが秘密にしたいようだから, 自分の胸に聞いてください.

bonnnu1126
質問者

お礼

ご回答ありがとうございます。 私の説明不足でした。。

  • trajaa
  • ベストアンサー率22% (2662/11921)
回答No.2

質問の意図が不明確。 >順番が替わっても大丈夫なように~~~ >どうしたら区別できますか。 というのはどういう事か? 正しい順番か?逆順か?という判断をするロジックは、既に存在するのか?それともそれを答えろと言うことか? 単にファイルを開くだけなら、順番は関係ない筈だが・・・・ 何がどの様に困っているのかさっぱり理解できず。 何か補足してもらえないだろうか?

bonnnu1126
質問者

お礼

ご回答ありがとうございます。 すみません、私の説明不足でした。。 コマンドライン引数の順番が入れ替わっても、ちゃんとそれぞれ判別できるようにしたいのです。 実行モジュール A(出力ファイル) B(入力ファイル) AとBが入れ替わっても、Aは出力用のファイルで、Bは入力用のファイルと判別したいです。 [-o]のようなオプションを付ければ判別できると聞いたのですが、どうコードを書いていいのかわかりません。。

  • TYWalker
  • ベストアンサー率42% (281/661)
回答No.1

えっと、引数を2個得て(それぞれA、Bとする)、ファイルAを開いて、ファイルBを開くのではダメですかね。 引数の個数はチェックせざるを得ないと思うんですけど。。 引数を渡す: http://www.stackasterisk.jp/tech/program/c01_07.jsp ファイルを読む: http://www.stackasterisk.jp/tech/program/c01_08.jsp たぶんこれが分からないんじゃないですよね?

bonnnu1126
質問者

お礼

ご回答ありがとうございます。 すみません、私の説明が足りませんでした。 コマンドライン引数の順番が入れ替わっても、ちゃんとそれぞれ判別できるようにしたいのです。 実行モジュール A(出力ファイル) B(入力ファイル) AとBが入れ替わっても、Aは出力用のファイルで、Bは入力用のファイルと判別したいです。

関連するQ&A

  • 【C言語】コマンドライン引数の標準入出力

    【C言語】コマンドライン引数の標準入出力 コマンドライン引数で、ファイル名を3つ渡します。-aの次のコマンドライン引数が、出力ファイル名です。 <<例>> ・実行モジュール -a 出力ファイル名 -b ファイル名 -c ファイル名 ・実行モジュール -c ファイル名 -a 出力ファイル名 -b ファイル名 もし出力ファイルが指定されなかった場合に、標準入出力を使いたいのですが、どうしたらいいかわかりません。 下記がソースの一部です。これをどう改造したらよいでしょうか。 分かる方いらっしゃいましたらご回答いただけると幸いです。 宜しくお願いします。 //出力ファイルを取得、書き込みモードでオープン for(j=1;j<argc-1;j++){ if(strcmp(argv[j],"-o")==0){ if((fo = fopen(argv[j+1],"w"))==NULL){ printf("open error!!\n"); exit(1); } } } while(fgets(buf,sizeof(buf),fp)!= NULL){ if(strstr(buf,"keyword")!= NULL){ //出力ファイルに出力 fprintf(fo,"%d:%s",line,buf); } }

  • コマンドライン引数について

    コマンドライン引数について opencvのサンプルを試しているのですが、困っています。 xcodeでビルドするとビルドは問題ないのですが、実行できない状態のものがあります。実行できないものは「デバックは正常に終了しました」や「ステータス255で終了しました」と出てしまいます。 前回の質問でコマンドライン引数が問題ではないか?とアドバイス頂き、色々と調べたのですが、main関数がコマンドライン引数をとることは理解出来たところで止まっています…。引数の指定の方法がわからず、Terminalから指定しようとexeファイルを開けて入力しようとしてみるのですが「プロセスは完了しました」と出てしまい、入力することができません… このやり方があっているかわからず、混乱しています。もし、検討違いのことを言っていたらすみません。 誰か引数の指定方法についてご存知であれば、アドバイス頂けないでしょうか? よろしくお願い致します。

  • コマンドライン引数って・・・?

    java言語を勉強中です。 コマンドライン引数って何ですか? 検索しても本を読んでもイマイチ理解できません…。 どこの部分に、どの様な形式で記入すればいいのでしょう? またその記入によって何が実行されるのですか? すいませんが、全くの初心者なので分かりやすく説明して 頂けませんか? 宜しくお願いします。

    • ベストアンサー
    • Java
  • コマンドライン引数

    1~10の整数のコマンドライン引数を受け取り、それと等しい英語及び受け取った引数の数を表示するプログラムを作りたいのですがわかりません。 引数がない場合、1~10以外の整数の場合はエラーメッセージを表示させてプログラムを終了するようにしたいです。 出力する英語の文字列は String 配列に格納するようにします。 実行結果です。 % java englishNum 2 3 1 Two Three One length : 3 % java EnglishNum No Parameter! % java EnglishNum 30 Only 1-10!

    • ベストアンサー
    • Java
  • VB6で、C言語の(argv,argc)みたいな、コマンドライン引数を実現する方法は?

    Microsoft-VisualBasic6でプログラミングしてます。 外部から(不特定の)ファイル名を指定して、 VBモジュールを起動して処理をしたいのですが、 C言語でいう、(argv,argc)みたいなものを使って(いわゆるコマンドライン引数)、 VBプログラミングする方法を教えて下さい。 <実行例>  ・(モジュール名) (任意のファイル名)   vbmodule.exe sample-a.cvs

  • コマンドライン引数の使い方

    [プロジェクトプロパティ]の[実行可能ファイルの作成]のコマンドライン引数の設定方法、使い方がよくわかりません。VBのヘルプを見てもいまいちです。具体的な利用例を使って教えて下さい。

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

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

  • コマンドライン引数の疑問

    Java勉強中のひよっこです。コマンドライン引数の合計を 求めるプログラムを組んだのですが、整数にマイナス記号を付けた 計算は、ちゃんと実行されるのに、プラス記号だとエラーが発生します。これは、何故なのでしょう??どうすればプラス記号を付けても 実行できるのでしょうか?どなたかご教授お願い致します。

  • コマンドプロンプトにおけるコマンドライン引数の展開

    こんにちは。 コマンドプロンプトにおける、コマンドライン引数の展開のされ方について、質問させて下さい。 具体的に言うと、二重引用符で囲まれたコマンドライン引数が、 どのようにして各コマンドに渡されるのかを詳しく知りたいと思っています。 まずコマンドプロンプトが、コマンドラインの特殊文字を展開し、 それらが各コマンドに渡される事は知っています。 特に、2つの二重引用符で囲まれた文字列に含まれる特殊文字は普通の文字として扱われる事、 二重引用符は「\」によってエスケープできる事は知っています。 これらを理解した上で、以下のような事を試しました。 まず、以下のような、1.cというCプログラムを作成し、ビルドしました。 ____________________ #include <stdio.h> int main(int argc,char *argv[]) { int i; for(i=1; i<=9; i++) if(argv[i]) printf("argv[%d]=「%s」\n", i, argv[i]); return 0; } ____________________ 次に以下のようなバッチスクリプトを作成しました。 ____________________ @echo off echo %%~1:「%~1」 echo %%~2:「%~2」 echo %%~3:「%~3」 ____________________ その後、以下のようにして同じコマンドライン引数を、これらのプログラムに渡すと、 以下のような結果になりました。 ____________________ C:\Users\kei >1.exe "\"ab c\"" de argv[1]=「"ab c"」 argv[2]=「de」 C:\Users\kei >1.bat "\"ab c\"" de %~1:「\"ab」 %~2:「c\""」 %~3:「de」 ____________________ なぜ両者の出力結果に、違いが出るのかが分からず困っています。 コマンドプロンプロの仕様だと、1.exeの出力は予想通りだったのですが、 1.batの出力では、コマンドライン引数がスペースで区切られていると、 それらを二重引用符で囲んでも、1つの引数としてみなしてくれませんでした。 これだけでは不十分だと思い、以下のように、 Windowsコマンドではない、ダウンロードしてきたlessと Windowsコマンドであるtypeで、同じ事を試しました。 ____________________ C:\Users\kei >less "\"ab c\"" fa ab c: No such file or directory fa: No such file or directory C:\Users\kei >type "\"ab c\"" fa 指定されたファイルが見つかりません。 処理中にエラーが発生しました: \ab パラメータが間違っています。 ____________________ この結果をみると、lessでは1.exeと同じようにコマンドラインが解釈され、 moreでは1.batと同じようにコマンドラインが解釈されているようです。 こういった事実は 「まずコマンドプロンプトが、コマンドラインの特殊文字を展開し、 それらが各コマンドに渡される」 というコマンドプロンプトの仕様と矛盾しているので、頭が混乱しています。 こういった問題について、何か御存じの方がいらっしゃれば、情報提供をお願い致します。 長くなりましたが、よろしくお願い致します。

  • VBでコマンドラインから引数を受け取る方法・・・

    【Visual Basic6.0】 VBでバッチプログラムを作ろうと思っております。 それで、コマンドライン引数を受け取る方法は あるのでしょうか? C言語でいうargv[]のような類なのは存在するのでしょうか?? よろしくお願いいたします。

専門家に質問してみよう