
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 / fscanf | fwrite / fread |
表の説明
- テキストは便利だけど、数値の表現が「文字」なので桁数や精度の影響を受けます。
- バイナリはそのまま保存できる反面、人が直接読めません。
scanf関数:書式付きの入力(ここを重点復習)
scanf は「書式文字列の指令に従って入力を読み取り、変換し、変数へ代入する」関数です。
書式(関数の形)
int scanf(const char * restrict format, ...);
scanfの指令は3種類(どれが何をする?)
scanf 書式文字列の指令
| 指令 | 書式例 | 何をする? | つまずきポイント |
|---|---|---|---|
| 空白類文字 | (スペース、改行など) | 入力側の空白類文字を読み飛ばす | 書式に空白があると改行も飛ぶ |
| 通常文字 | :, , など | 入力にその文字が来ることを要求 | 一致しないとそこで失敗 |
| 変換指定 | %d, %lf, %s など | 型に変換して代入 | 引数は基本ポインタ |
表の説明
- scanf は書式を左から順に実行します。失敗したらそこで止まります。
- だから戻り値チェックが超重要です。
変換指定の構造(図でイメージ)
図:scanf の変換指定

図の説明
- *は代入しない(読み捨て)
- 幅は最大文字数の制限(特に文字列で必須級)
- 長さ修飾子は代入先の型サイズを合わせる
- 変換指定子で「整数・小数・文字列」などを決める
長さ修飾子と変換指定子(実務でよく使う組み合わせ)
よく使う scanf の組み合わせ
| 読みたい型 | 書式例 | 変数の型 |
|---|---|---|
| int | %d | int |
| long | %ld | long |
| long long | %lld | long long |
| unsigned | %u | unsigned int |
| double | %lf | double |
| long double | %Lf | long double |
| 文字列 | %s | char配列 |
表の説明
- double は %lf(printfとは違うので要注意ポイントです)
- 型と書式がズレると未定義動作になりやすいので、まずここを固めるのが安全です。
scanfの戻り値(成功判定のカギ)
scanf は「代入に成功した項目数」を返します。
scanf の戻り値の意味
| 戻り値 | 意味 | 例 |
|---|---|---|
| 2 | 2項目代入できた | %d%lf で両方成功 |
| 1 | 1項目だけ代入できた | 最初の数値だけ成功 |
| 0 | 1項目も代入できない | 数値が欲しいのに文字など |
| 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
