• ベストアンサー

VC++でコンソールアプリのパスの対応の問題

今、VC++でコンソールアプリをやっていますが、アプリのイメージとして sample.exe -f C:\a.txt -d のコマンドで、C:\a.txtのファイルを削除し、 sample.exe -f C:\a.txt -s で、ファイルをコンソールに表示するようにしたいですが、問題は指定されたパスの問題ですが、内部でファイルのfopenとか、removeとは、C:\\a.txtしないといけないようですが、 コマンドから入力したパスに対する処理は、どうすればよろしいでしょうか?よろしくお願いします。

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

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.4

メイン関数を int main(int argc,char *argv[]) { 中身 } と書いた場合、実行時に sample.exe -f C:\a.txt -d とコマンドラインから打つとmain関数に来た時に argcは「4」 argv[0]は「sample.exe」 argv[1]は「-f」 argv[2]は「C:\a.txt」 argv[3]は「-d」 となっています。 プログラムは以下のようになります。 void usage(char *ExeName) {  printf("Usage:%s -f <Filename> <Mode>\n",ExeName);  printf("\tMode\t-d Delete <Filename>\n");  printf("\t\t-s Show <Filename>\n"); } int main(int argc,char *argv[])  FILE *fp;  char *ExeName = NULL;  char *FileName = NULL;  int DeleteMode = 0;  int ShowMode = 0;  ExeName = *argv;  if (argc == 1) {   usage(ExeName);   return 255;  }  while(--argc) {   argv++;   switch (**argv) {   case '-':    switch(*(++(*argv))) {    case 'f':     if(--argc) {      argv++;      FileName = *argv;     } else {      printf("-fの次に「ファイル名」がありません\n);      usage(ExeName);      return 255;     }     break;    case 'd':     if (!ShowMode) {      DeleteMode = 1;     } else {      printf("-sと-dは同時に指定できません\n);      usage(ExeName);      return 255;     }     break;    case 's':     if (!DeleteMode) {      ShowMode = 1;     } else {      printf("-sと-dは同時に指定できません\n);      usage(ExeName);      return 255;     }     break;    default:     usage(ExeName);     return 255;    }   }  }  if (!FileName) {   printf("「-f ファイル名」がありません\n);   usage(ExeName);   return 255;  }  if (DeleteMode) {   remove(FileName);  } else if (ShowMode) {   fp = fopen(FileName,"rt");   ファイルの中身の表示処理   fclose(fp);  }  return 0; }

その他の回答 (4)

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.5

注意。 当方の回答のプログラムは、 sample.exe -f C:\a.txt のように-sも-dも無い時 sample.exe -fC:\a.txt -d のように-fとファイル名を空白で区切らない時 には、エラー処理していません(usageを表示しないで処理を進めてしまう)ので、厳密なチェックが必要な場合は判定文を追加して下さい。

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.3

質問の意図がよくわかっていないので はずしていたらごめんなさい。 コマンドから"C:\a.txt"と入力されたらどうなるのか? (プログラムで\を補う必要があるのか?) ということですね? 答えは、必要ありません。 そもそもどういう場合に\\と重ねる必要があるのか? これはCにとっては超基本的な問題です。 本来Cでプログラムを書く前に知っていなければなりません。 ですから、こんな場所で質問するのもおかしいとおもうのですが... ( 1+1の答えは幾つですか?と尋ねるようなものです) Cでは\で開始される特別な文字コードが存在します 例えば   '\n' 改行   '\0' 文字列終端 などです。(他にもあります) これらは表面上(人間が読むと)2文字ですが メモリ上は1バイトのコードとして格納されます。 そして  '\\' は¥1文字のコード1バイトが格納されます これは、コンパイラがソースを解釈して 文字列をメモリに格納するの規則です コマンドラインから入力された場合は すでにメモリの中に格納されていますので \を補う必要はありません

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

そのままでいいですよ 『C:\\a.txt』などと記述するのは Cのソースに文字リテラル(定数)として記述する際の約束です 『\』が特別な意味を持つので 『\』自体を現すのに『\\』という書き方をします コマンドラインからの入力を受け取った argvなどには C:\a.txt などは そのまま取得できます fopen( argv[2], "rt" ); といった具合に使うことが可能です スペースなどを含むパスの場合パスの前後に『"』を付け加えましょう sample.exe -f "C:\Program files\a.txt" -d といった具合にします

  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.1

そのまま何も加工せず処理すればいいです。 プログラム中で、" " で囲まれた文字列の中で\を表すのに\\と書くだけで、データとしては\が1つです。

ikutame
質問者

補足

詳しく説明していただけないでしょうか? よろしくお願いします。

関連するQ&A

  • Visual C++ コンソールアプリ

    YYMMDDHHMMSS.txtという形式の日時ファイル名のtxtが 実行ファイル直下のtxtフォルダに複数個あり、 getsとsscanfでYYYYMMDD形式で入力を待ち、 日付が該当したらfopenで開きたいのですが どのように指定すればいいのでしょうか? 060125234805.txt 060126101240.txt 060126181124.txt と複数のファイルがあり、20060126と入力した場合に 該当する日付の2つのファイルの中身を画面に表示させたいのです。 時間の早いものから表示して、矢印キーで画面を切り替えようと考えています。 Visual C++ 6.0 コンソールアプリです。

  • コンソールアプリのFileIOフック

    環境はWin7ProfessionalとVC++2010Expressです。 市販のコンソールアプリ(A.exeとします)があります。ソースコードはありません。 実行させ,標準入力から使用する入力ファイル名の拡張子を除く部分を入力すると,その入力ファイルから必要な情報を読み取り,計算が行われます。 今は手持ちのC++プログラム(B.exeとします。ソースコードもあります。)の中でCreateProcessを用いて,A.exeを実行させています。 このときA.exeの中では,入力ファイルを開いて,ファイルの中身を読むといった作業が行われているはずですが,これをディスク上のファイルから読むのではなく,メモリから読ませたいと思っています。つまりB.exeの中でA.exeを起動される部分の前にいったんファイル出力をして,そのファイルをA.exeの入力ファイルとしているのを,何とかファイルの入出力を行わないでA.exeを実行させたいのです。 A.exeはループの中で実行させるため,FileIOにかかる時間がバカになりません。 このようなことは可能なのでしょうか? 参考になるWebSite等を紹介していただけたら幸いです。

  • VC++(VS)でコンソールアプリ(複数ファイルからなる)を作成したい

    マイクロソフト社のVC++(Visual Studio 2008)で コンソールアプリケーションを作成しようとしております。 ファイルは複数ファイルからなり、 mainprogram.cpp -> 実行ファイル(mainprogram.exe) subprogram1.cpp -> オブジェクトファイル(subprogram1.obj) subprogram2.cpp -> オブジェクトファイル(subprogram2.obj) ・・・以下続く のように 1)サブプログラムをobjファイルとしてコンパイル 2)メインプログラムをコンパイルしてobjファイルとリンクし、   実行ファイルを作成する というような作業を行いたいと考えております。 以前はLinuxの環境でg++、makeを利用して このような構成のコンソールアプリケーションを作成しておりました。 が、VCに移行するに当り、どのようにプロジェクトファイル等を 構成して良いか分からず、出だしでつまづいております。 VCにもコマンドラインでコンパイルする方法 (cl, nmakeを使うんでしょうか。。。)があるみたいですが、 これらの手法について書かれている 書籍、サイト等を探すことが出来ないでおります。 VCに関して、このような使用法に対する解説がなされている書籍、 もしくはサイト等をお教え願えませんでしょうか? 宜しくお願い申し上げます。

  • VC、コンソールアプリ結果のウインドウサイズ

    OSはwindows2000proSP2、VC6スタンダードで コンソールアプリケーションを作っています。 アプリを実行すると、結果がコマンドプロンプトに出てきますが、 コマンドプロンプトのウインドウサイズ幅が小さく、 変なところで折り返って表示されてしまい、見栄えが悪くなってしまいます。 そこで、実行結果が出力されるコマンドプロンプトのウインドウサイズを 変更したいのですが、どう設定したらよいかわかりません。 どうしたらウインドウサイズを変更できるのでしょうか?

  • Pathの記述の仕方

    以下のようなパスの記述をしても問題ないでしょうか? /aaa/bbb/ccc/.../.../bbb/ccc/config.txt 理由としては、以下のシェルのようにconfigファイルを読み込むのに dirnameコマンドを使用して取得するためです。 このコマンドは、コマンドラインから実行する場合と、JOBNETなどの別プロセス(実行ディレクトリは別ディレクトリ)から実行される可能性があります。 Sample.csh #!/bin/csh set SHELL_PATH = `dirname $0` set APP_ROOT = ${SHELL_PATH}"/../.." setenv SERVER_INFO_FILE ${APP_ROOT}"/aaa/bbb/config.txt sample.exe ご回答宜しくお願い致します。

  • コンソールアプリ エンターを押さないと戻ってこない

    VisualStudio2005でコンパイルしたコンソールアプリですが、実行後、エンターを押さないとコマンドが戻ってきません。 何か対策でもあるのでしょうか? MSのC言語特有に何かがあるのでしょうか?

  • パスの省略形を作成するには

    よく、長いパスを表示するときに「c:\...\tmp\name.txt」のように、パス名の途中を「\...\」で省略して表示しますが、この省略形のパスを作成するAPI、サンプル等がありましたら、教えて頂けませんでしょうか。 WindowsNT4でVC++6.0を使って開発しております。

  • コンソールアプリの起動パラメータ について

    ・環境   XP, Borland C++ Compiler 5.5 ・使用言語   C++ コンソールアプリを作成しています。 コンパイルして出来上がったEXEのアイコンに、何かファイルを ドラッグ&ドロップすると、そのファイルがパラメータとなって EXEが起動されると思うのですが、ここで疑問があります。 (1)最大パラメータ数というのはどこかに規定されているのでしょうか。 (2)複数のファイルをドラッグ&ドロップした時に、EXEに渡される順番というのはどのように決定されるのでしょうか。 よろしくお願い致します。

  • VC++6.0 PRINTF.Cのパスを…

    VC++6.0でデバッグするときに、 F10キー(ステップオーバー)や F11キー(ステップイン)実行していると、突然 「 PRINTF.Cのパスを入力してください。」と言うファイルウィンドウが表示されます。 また他に「SETBUF.Cのパス…」とか「CRT.Cのパス…」 などと聞いてくるときもあります。 なんだか分らないのでキャンセルボタンを押すと、こんどは混合ウィンドウが表示されて、そこにカーソルが移ってしまいます。(混合ウィンドウには、printfの内部ルーチン?みたいなものが表示されます。) しかたないので、その後はF5キーとブレークポイントを使った デバッグでしのいでるのですが、これではどうも不自由です。「PRINTF.Cのパスを入力…」は、いったいどうしたら表示されないようになるのでしょうか? 放っておいた6.0をようやく始めた初心者です。 よろしくお願いします。

  • Webアプリから起動した実行ファイルについて

    お世話になります。IIS6.0、ASP.NET、C#でWeb開発しております。 Webアプリからwin32コンソールアプリを起動しているのですが、コンソールアプリ側でファイル操作ができません。具体的には、fopen()やCreateFile()などを試しましたが、落ちる・エラーが返るなどでまともに動きませんでした。コンソールアプリ単体で起動した場合は問題ないです。Webアプリから起動した場合、タスクマネージャで見ると、EXEの実行ユーザが"NETWORK SERVICE"となっています。権限の問題とかでしょうか…。どなたか、分かる方がいましたら、教えて頂ければと思います。よろしくお願いします。

専門家に質問してみよう