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

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

ただいまの
回答率

87.78%

コード処理の意味

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 1,021

score 50

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


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+2

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+1

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/29 00:22

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

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

こんにちは。

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る