• ベストアンサー

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

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

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

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

回答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% (4900/10358)
回答No.1

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

ikutame
質問者

補足

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

関連するQ&A