質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

1481閲覧

コード処理の意味

xxxxxxx

総合スコア50

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2016/12/28 06:09

C

1if (argc != 3) { 2 fprintf(stderr, "Example: qtotal motofile.dat insatsu.dat\n"); 3 } 4 if ((infile = fopen(argv[1], "rt")) == NULL) { 5 fprintf(stderr, "Can not open file: %s\n", argv[1]); 6 exit(1); 7 } 8 if ((outfile = fopen(argv[2], "wt")) == NULL) { 9 fprintf(stderr, "Can not open file: %s\n", argv[2]); 10 exit(1); 11 }

上記のコードは何をしているのか知りたいです。
2つのコマンドライン引数argcとargv[]はそれぞれ引数の総個数、引数の文字列を指すポインタの文字列という考え方であっていますでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

上記のコードは何をしているのか知りたいです。

読んで字のごとくだと思いますが、これが分からないと言うことは、勉強をちょうど始めたばかりと言うことでしょうか?数日も勉強すれば自然に意味が分かると思います。
その段階の人に説明するのは難しいです。例えば「ファイルポインタ」とか「NULL」という概念は分かりますか?

2つのコマンドライン引数argcとargv[]はそれぞれ引数の総個数、引数の文字列を指すポインタの文字列という考え方であっていますでしょうか?

普通はそういうネーミングを行います。意味は名前でなくどこでどう使われているかで決まります。
int main(int argc, char **argv)等と書いてあるかと思いますので、その通りです。

投稿2016/12/28 06:48

otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

if (argc != 3) {

fprintf(stderr, "Example: qtotal motofile.dat insatsu.dat\n");

}

main関数には、コマンドラインをスペースで区切った文字列の配列が渡されますが、argcはこのコマンドも含めた文字列の個数を示します。

個数が3以外なら、エラーメッセージつまりこのコマンドの使用例を標準エラー出力に表示します。標準エラー出力とは、コマンドラインでたとえ出力リダイレクト> 出力ファイル名」されていても、出力ファイルには方向転換されないで、画面に表示されるものです。

if ((infile = fopen(argv[1], "rt")) == NULL) {

fprintf(stderr, "Can not open file: %s\n", argv[1]); exit(1);

}

argv[1]はこのコマンドを除く最初の文字列を示し、fopen関数はこれをファイル名として"rt"すなわち読み取り専用、テキストモードで開きます。テキストモードとは改行コードが正しく認識されるモードです。

fopen関数の結果がNULLなら、何らかの原因(ファイルが存在しない等)で開けなかったことを示します。その際、エラーメッセージつまりこのファイルが開けなかった旨を標準エラー出力に表示します。そして、exit(1)つまりこのコマンドを終了コード1で終了します。終了コードとは、このコマンドを起動した(通常は)シェル(Windowsならコマンドプロンプト)が利用するもので、0ならコマンド成功、0以外ならコマンド失敗とみなします。

fopen関数の結果がNULL以外なら、ファイルを開くことに成功したことを示します。これ以降、infileを関数の引数に指定しfscanf関数やfgets関数などを使ってファイルの読み取りができます。

if ((outfile = fopen(argv[2], "wt")) == NULL) {

fprintf(stderr, "Can not open file: %s\n", argv[2]); exit(1);

}

argv[2]はこのコマンドを除く2番目の文字列を示し、fopen関数はこれをファイル名として"wt"すなわち書き込み専用、テキストモードで開きます。

fopen関数の結果がNULLなら、何らかの原因で開けなかったことを示すので、その際、エラーメッセージを標準エラー出力に表示します。そして、exit(1)つまりこのコマンドを終了コード1で終了します。

fopen関数の結果がNULL以外なら、ファイルを開くことに成功したことを示すので、これ以降、outfileを関数の引数に指定しfprintf関数やfputs関数などを使ってファイルの書き込みができます。

投稿2016/12/28 13:46

編集2016/12/28 14:23
naomi3

総合スコア1105

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xxxxxxx

2016/12/28 15:22

ご丁寧にありがとうございました! 大変わかりやすい多くのご回答をいただき、ベストアンサーを決めるのには悩みましたが、長文で細かく書かれているこちらの方をベストアンサーとさせていただきます。 みなさま本当に丁寧なご回答ありがとうございました。
guest

0

書かれている通りの認識でよいかと思います

最初のif文は、コマンドの書き方(文字列3つではない)がおかしいですよということで、
printf文でコマンドの書き方を説明しています
次のif文は、引数1のファイルを読み込み型で開く
次のif文は、引数2のファイルを書き込み型で開く
をしています

投稿2016/12/28 08:20

ardin

総合スコア544

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

2つのコマンドライン引数argcとargv[]はそれぞれ引数の総個数、引数の文字列を指すポインタの文字列という考え方であっていますでしょうか?

その通りです。
例えば、そのプログラムを引数無しで起動すると、argcは1でargv[1]やargv[2]には値が入っていません。
その時無理やりargv[1]等にアクセスするとかなりの率でメモリの不正アクセスで落ちます。
それを防ぐために、最初のif文でargcが3であり、argv[1]とargv[2]に値が入っていることを確認しています。
後は、それぞれに入っている文字列をファイル名とみなしてファイルをオープンしています。
タイプミスでファイルがオープンできないことも良くありますので、オープンできなかったら、ユーザが間違いを修正できるようにエラーメッセージを表示して終了しています。

投稿2016/12/28 12:33

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問