C言語基礎|13章のまとめ

「入力・出力・ファイル」の基本がつながる!第13章で“ストリーム感覚”を身につけよう。

第13章では、C言語での入出力を「ストリーム」という共通の考え方で整理しながら、ファイル操作(オープン/クローズ)や、テキスト/バイナリの違い、そして scanf系の書式付き入出力まで一気に学びました。

ここまで理解できると、
「キーボードから読んで画面に出す」だけじゃなく、
「キーボードから読んでファイルに保存する」
「ファイルから読んで加工して別ファイルへ出す」
みたいな実用プログラムがスッと書けるようになります。

このまとめでは、章の要点を整理しつつ、特に質問の多い scanf関数:書式付きの入力を、表や図でしっかり復習していきます。

13章で押さえたい全体像(ストリームで全部つながる)

入出力の対象が違っても、C言語では「ストリーム」という共通の入出力の通り道で扱います。

入出力対象とストリームの対応

対象どんなストリーム?
キーボードユーザー入力stdin(標準入力)
画面表示stdout(標準出力)
エラー表示エラーメッセージstderr(標準エラー)
ファイル保存データfopenで作る任意ストリーム

表の説明

  • キーボードも画面もファイルも、「読む/書く」の窓口はストリームで統一されています。
  • stdin / stdout / stderr は最初から用意されている“標準ストリーム”です。

FILE と fopen と fclose(ファイル操作の骨格)

ファイルを扱うには、ストリームを開いて、最後に閉じるのが基本です。

FILE と基本関数

項目役割代表例
FILEストリーム制御情報を持つ型FILE *fp
fopenファイルを開いてストリームを得るfp = fopen(name, mode)
fcloseストリームを閉じるfclose(fp)

表の説明

  • fopen が成功すると FILE へのポインタを返します。失敗すると NULL です。
  • fclose を忘れると、書き込みが最後まで反映されないこともあります(バッファの都合)。

よく使うオープンモード(要点)

モード意味ざっくり挙動
r読み取り存在しないと失敗
w書き込み既存は上書き(内容消える)
a追加末尾に追記
rb / wb / abバイナリWindows等で改行変換を避けたいときに重要
r+ / w+ / a+更新(読み書き)読み書き両方

テキストとバイナリの違い(まとめの要点を整理)

テキストファイルとバイナリファイル

観点テキストバイナリ
保存形式文字の並びビット列そのもの
サイズ桁数や表記に依存だいたい sizeof(型) に依存
人が読める?読める読めない(ダンプが必要)
浮動小数点の精度書き方次第で落ちやすい落としにくい(そのまま保存)
主な関数fprintf / fscanffwrite / fread

表の説明

  • テキストは便利だけど、数値の表現が「文字」なので桁数や精度の影響を受けます。
  • バイナリはそのまま保存できる反面、人が直接読めません。

scanf関数:書式付きの入力(ここを重点復習)

scanf は「書式文字列の指令に従って入力を読み取り、変換し、変数へ代入する」関数です。

書式(関数の形)

int scanf(const char * restrict format, ...);

scanfの指令は3種類(どれが何をする?)

scanf 書式文字列の指令

指令書式例何をする?つまずきポイント
空白類文字(スペース、改行など)入力側の空白類文字を読み飛ばす書式に空白があると改行も飛ぶ
通常文字:, , など入力にその文字が来ることを要求一致しないとそこで失敗
変換指定%d, %lf, %s など型に変換して代入引数は基本ポインタ

表の説明

  • scanf は書式を左から順に実行します。失敗したらそこで止まります。
  • だから戻り値チェックが超重要です。

変換指定の構造(図でイメージ)

図:scanf の変換指定

図の説明

  • *は代入しない(読み捨て)
  • 幅は最大文字数の制限(特に文字列で必須級)
  • 長さ修飾子は代入先の型サイズを合わせる
  • 変換指定子で「整数・小数・文字列」などを決める

長さ修飾子と変換指定子(実務でよく使う組み合わせ)

よく使う scanf の組み合わせ

読みたい型書式例変数の型
int%dint
long%ldlong
long long%lldlong long
unsigned%uunsigned int
double%lfdouble
long double%Lflong double
文字列%schar配列

表の説明

  • double は %lf(printfとは違うので要注意ポイントです)
  • 型と書式がズレると未定義動作になりやすいので、まずここを固めるのが安全です。

scanfの戻り値(成功判定のカギ)

scanf は「代入に成功した項目数」を返します。

scanf の戻り値の意味

戻り値意味
22項目代入できた%d%lf で両方成功
11項目だけ代入できた最初の数値だけ成功
01項目も代入できない数値が欲しいのに文字など
EOF入力が尽きた等Ctrl+D / Ctrl+Zなど

表の説明

  • 期待する項目数と一致するかで判断するのが基本です。

サンプルプログラム

ここでは、ファイル名を固定して、scanf の学習に集中できる超シンプル例に変えます。

プロジェクト名:chap13-15-1 ソースファイル名:chap13-15-1.c

  • キーボードから整数を2つ読む(scanf)
  • 合計を画面に出す(printf)
  • 同じ内容を log.txt に保存(fprintf)
#include <stdio.h>

int main(void)
{
    int a, b;
    FILE *fp;

    /* 英語メッセージ:入力を促す */
    printf("Enter two integers (e.g., 10 20): ");

    /* scanf の戻り値で、2個読み取れたか確認する */
    if (scanf("%d %d", &a, &b) != 2) {
        printf("Input error. Please enter two integers.\n");
        return 0;
    }

    /* 英語メッセージ:結果表示 */
    printf("Sum = %d\n", a + b);

    /* ファイル名は固定にしてシンプルにする */
    fp = fopen("log.txt", "w");
    if (fp == NULL) {
        printf("File open error.\n");
        return 0;
    }

    /* 結果をファイルにも保存する */
    fprintf(fp, "a = %d, b = %d\n", a, b);
    fprintf(fp, "sum = %d\n", a + b);

    fclose(fp);

    printf("Saved to log.txt\n");
    return 0;
}

この例が“つまずきにくい”理由

シンプル化のポイント

よくあるつまずき原因今回の回避策
scanf が止まる書式の末尾に改行を入れると追加入力待ちになりやすいformat を %d %d にする
ファイル名入力で失敗パスや拡張子、入力ミスが混ざるlog.txt 固定にする
入力失敗で値が不定戻り値を見ていないif (scanf(...) != 2) を入れる

表の説明
scanf の学習では「戻り値チェック」と「余計な入力の罠を消す」が最優先です。まず成功体験を作るのが近道です。

13章まとめ(箇条書きの内容を、短く整理)

  • プログラム終了後も残したいデータはファイルに保存する。
  • 入出力はストリーム(データの流れ)として統一して扱う。
  • 標準ストリームは stdin / stdout / stderr の3つ。
  • FILE はストリーム管理情報の型で、fopen で開いて fclose で閉じる。
  • fprintf / fscanf は printf / scanf を任意ストリームへ拡張したもの
  • fgetc / fputc は文字単位の入出力
  • テキストは桁数でサイズが変わる、バイナリは sizeof(Type) でサイズ固定
  • バイナリの読み書きは fread / fwrite