- ベストアンサー
VC++でコンソールアプリのパスの対応の問題
今、VC++でコンソールアプリをやっていますが、アプリのイメージとして sample.exe -f C:\a.txt -d のコマンドで、C:\a.txtのファイルを削除し、 sample.exe -f C:\a.txt -s で、ファイルをコンソールに表示するようにしたいですが、問題は指定されたパスの問題ですが、内部でファイルのfopenとか、removeとは、C:\\a.txtしないといけないようですが、 コマンドから入力したパスに対する処理は、どうすればよろしいでしょうか?よろしくお願いします。
- みんなの回答 (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; }
その他の回答 (4)
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
注意。 当方の回答のプログラムは、 sample.exe -f C:\a.txt のように-sも-dも無い時 sample.exe -fC:\a.txt -d のように-fとファイル名を空白で区切らない時 には、エラー処理していません(usageを表示しないで処理を進めてしまう)ので、厳密なチェックが必要な場合は判定文を追加して下さい。
- BLK314
- ベストアンサー率55% (84/152)
質問の意図がよくわかっていないので はずしていたらごめんなさい。 コマンドから"C:\a.txt"と入力されたらどうなるのか? (プログラムで\を補う必要があるのか?) ということですね? 答えは、必要ありません。 そもそもどういう場合に\\と重ねる必要があるのか? これはCにとっては超基本的な問題です。 本来Cでプログラムを書く前に知っていなければなりません。 ですから、こんな場所で質問するのもおかしいとおもうのですが... ( 1+1の答えは幾つですか?と尋ねるようなものです) Cでは\で開始される特別な文字コードが存在します 例えば '\n' 改行 '\0' 文字列終端 などです。(他にもあります) これらは表面上(人間が読むと)2文字ですが メモリ上は1バイトのコードとして格納されます。 そして '\\' は¥1文字のコード1バイトが格納されます これは、コンパイラがソースを解釈して 文字列をメモリに格納するの規則です コマンドラインから入力された場合は すでにメモリの中に格納されていますので \を補う必要はありません
- redfox63
- ベストアンサー率71% (1325/1856)
そのままでいいですよ 『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)
そのまま何も加工せず処理すればいいです。 プログラム中で、" " で囲まれた文字列の中で\を表すのに\\と書くだけで、データとしては\が1つです。
補足
詳しく説明していただけないでしょうか? よろしくお願いします。