dポイントプレゼントキャンペーン実施中!

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

A 回答 (5件)

メイン関数を


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;
}
    • good
    • 0

注意。



当方の回答のプログラムは、

sample.exe -f C:\a.txt
のように-sも-dも無い時

sample.exe -fC:\a.txt -d
のように-fとファイル名を空白で区切らない時

には、エラー処理していません(usageを表示しないで処理を進めてしまう)ので、厳密なチェックが必要な場合は判定文を追加して下さい。
    • good
    • 0

質問の意図がよくわかっていないので


はずしていたらごめんなさい。

コマンドから"C:\a.txt"と入力されたらどうなるのか?
(プログラムで\を補う必要があるのか?)
ということですね?

答えは、必要ありません。

そもそもどういう場合に\\と重ねる必要があるのか?

これはCにとっては超基本的な問題です。
本来Cでプログラムを書く前に知っていなければなりません。
ですから、こんな場所で質問するのもおかしいとおもうのですが...

( 1+1の答えは幾つですか?と尋ねるようなものです)

Cでは\で開始される特別な文字コードが存在します
例えば
  '\n' 改行
  '\0' 文字列終端
などです。(他にもあります)

これらは表面上(人間が読むと)2文字ですが
メモリ上は1バイトのコードとして格納されます。

そして
 '\\'
は¥1文字のコード1バイトが格納されます

これは、コンパイラがソースを解釈して
文字列をメモリに格納するの規則です

コマンドラインから入力された場合は
すでにメモリの中に格納されていますので
\を補う必要はありません
    • good
    • 0

そのままでいいですよ



『C:\\a.txt』などと記述するのは Cのソースに文字リテラル(定数)として記述する際の約束です

『\』が特別な意味を持つので 『\』自体を現すのに『\\』という書き方をします

コマンドラインからの入力を受け取った
argvなどには C:\a.txt などは そのまま取得できます

fopen( argv[2], "rt" );
といった具合に使うことが可能です

スペースなどを含むパスの場合パスの前後に『"』を付け加えましょう

sample.exe -f "C:\Program files\a.txt" -d
といった具合にします
    • good
    • 0

そのまま何も加工せず処理すればいいです。



プログラム中で、" " で囲まれた文字列の中で\を表すのに\\と書くだけで、データとしては\が1つです。

この回答への補足

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

補足日時:2009/02/18 22:49
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!