
-----------------------------------------------
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[ ])
{
FILE *fin,*fout;
char ss[256];
if(argc != 3){
printf("引数の数が違います\n");
exit(1);
}
if((fin=fopen(argv[1],"r"))==NULL){
printf("入力ファイルをオープンできません\n");
exit(1);
}
if((fout=fopen(argv[2],"w"))==NULL){
printf("出力ファイルをオープンできません\n");
exit(1);
}
while(fgets(ss,256,fin)!=NULL){
fputs(ss,fout);
}
fclose(fin);
fclose(fout);
return 0;
}
-----------------------------------------------
以上のプログラム名は「tcopy.cpp」でコマンドプロンプトから実行し、ファイルをコピーするという事を行っていきます。
「aaa.txt」と「bbb.txt」の2つを用意し、「aaa.txt」の内容、
abcdef
ABCDEF
012345
を「bbb.txt」にコピーしていきます。
そこで疑問なのですが、ファイルをコピーする際、コマンドプロンプトから、
>tcopy aaa.txt bbb.txt
と打ち込むとコピー出来るようであり、「tcopy」、「aaa.txt」、「bbb.txt」が引数になるという事なのですが、何故この3つが引数になるのかという事と、
int main(int argc,char *argv[ ])
のargcに引数が何故代入されるかが分かりません。
後、「aaa.txt」と「bbb.txt」がargv[1]とargv[2]に何故対応しているかが分かりません。
教えていただければ嬉しいです。
No.5ベストアンサー
- 回答日時:
argv[0] がプログラムを呼んだ時の名前です。
元々、UNIX から来ている言語なので、
別名で登録した時に(ln や、ln -s)
違う動作ができるようになっていたりします。
その後の引数は、自分でいれた引数なのでわかるとは思いますが、
基本的に空白文字で、文字列を区切るようになっています。
これが、呼び出した側の shell が区切るのか、プログラムのスタートアップで区切るのかまでは規定されていませんが、
受け取った main 関数には、区切られた文字列と、その個数が渡される様に、規格で決まっています。
最初から分けられていたり、個数がわかった方が、コマンドラインからの場合、楽だからじゃないでしょうか。
区切られていない、もともとのコマンドラインの文字列も調べられる物も多いですが、
通常使うほどの事はないので、特別な操作が必要だったりします。
(ないものもありますし)
昔は、
main(argc,argv,env)
int argc;
char **argv;
char **env;
{
とはじまり、argv[],env[] の最後は NULL だったので
わざわざ、argc は必要なかったのですが・・・あったらあったで、引数の個数がすぐ分かるので便利だったのでしょう。
ご回答ありがとうございます。
argv[0]="tcopy"
argv[1]="aaa.txt"
argv[2]="bbb.txt"
argc=個数
>main 関数には、区切られた文字列と、その個数が渡される様に、規格で
>決まっています。
以上の記述により理解できました!
ありがとうございます。
No.4
- 回答日時:
#3です。
一部誤記がありましたので、#3の内容を次のとおり差し替えます。>argcに引数が何故代入されるかが分かりません。
argcに入るのは「引数の数」です。今回の例でいうと、
1)tcopyという、実行ファイルの名前
2)aaa.txtという、入力ファイルの名前
3)bbb.txtという、出力ファイルの名前
の3個です。
argcが3ですので、argv[]に対しては
argv[0], argv[1], argv[2] の3個にアクセスできます。
No.3
- 回答日時:
>argcに引数が何故代入されるかが分かりません。
argvに入るのは「引数の数」です。今回の例でいうと、
1)tcopyという、実行ファイルの名前
2)aaa.txtという、入力ファイルの名前
3)bbb.txtという、出力ファイルの名前
の3個です。
argvが3ですので、argv[]に対しては
argv[0], argv[1], argv[2] の3個にアクセスできます。
ご回答ありがとうございます。
>argvに入るのは「引数の数」です。
引数の数が入るということ理解できました!
ありがとうございます。
No.2
- 回答日時:
こんにちは。
私も詳しいことは知りませんので、#1さんと同様に、
「C言語の言語仕様として、そのように取り決められている」から
というぐらいのお答えしかできませんが、
その辺りのことは、下記の各リンク先の記事が参考になるかと思います。
■過去ログ(関連記事)
C言語でのコマンドライン引数の内部での処理のされ方
http://okwave.jp/qa3103747.html
■参考サイト
もう一度基礎からC言語 第17回 コマンドライン引数と終了コード~main関数の基本事項 終了コードを返す
http://www.grapecity.com/japan/powernews/column/ …
<補足>
上記の参考サイトに記載されていますが、C/C++等で作ったプログラムの起動時は、
OS(シェルプログラム)
↓
プログラム
◎スタートアップルーチン ←※これはリンク時に自動的に結合されます。
↓ ・ここでコマンドラインの解析が行われ、引数(argc, argv)に格納してmain関数を呼び出す。
↓
◎main関数
↓ ・渡された引数(argc, argv)を参照して処理を行う。
↓
◎その他の関数
というような流れで実行されているようです。
※ただし、これは処理系に依存する部分だと思います。
No.1
- 回答日時:
質問の趣旨を誤解しているかも知れませんが
main 関数の仕様として、そのように用意する事が定められているから、その様に用意してある。
その様に用意してあるから、用意してある機能を用意された通りに利用することが出来る。
というだけの事ですよ。
ご回答ありがとうございます。
>main 関数の仕様として、そのように用意する事が定められているから、そ
>の様に用意してある。
>その様に用意してあるから、用意してある機能を用意された通りに利用する
>ことが出来る。
そういうものだと、理解するということですね!
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでワークシートを引数として...
-
バッチ処理でファイルの中身を...
-
多数のサブディレクトリ内のフ...
-
.txtではなく.logの方が良いの...
-
ファイル内容の修正、行削除に...
-
ファイル名の一部をbatで変更し...
-
テキストファイルで提出とは?
-
VBAでエクセルをtxtに変換する...
-
シェルスクリプトでファイルを...
-
UWSCでファイルを開く方法
-
ファイルの最後に文字列挿入
-
accessでSQL文を使ってcsvファ...
-
バッチファイルからVBAに引数を...
-
複数のテキストファイルを1つに...
-
コマンドラインから引数を渡す...
-
FTPコマンドでgetしたい
-
テキスト(txt)→ワード(docx)へ...
-
拡張子を元に戻す
-
VB2010で動作しない
-
MS-DOSのバッチファイルの中で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチ処理でファイルの中身を...
-
.txtではなく.logの方が良いの...
-
VBAでワークシートを引数として...
-
多数のサブディレクトリ内のフ...
-
COPYコマンドで結合すると余計...
-
バッチファイル 複数ファイル...
-
psqlでエラーログをとりたい
-
ファイル内容の修正、行削除に...
-
バッチファイルで文字列削除に...
-
テキストファイルで提出とは?
-
拡張子を元に戻す
-
ファイルの最後に文字列挿入
-
UWSCでテキストファイルを開い...
-
エクセルの各セルの内容をそれ...
-
ファイル名の一部をbatで変更し...
-
renameコマンドについて
-
accessでSQL文を使ってcsvファ...
-
3つ以上のテキストファイルをコ...
-
Windowsのバッチファイルを利用...
-
ファイルのワイルドカードについて
おすすめ情報