C言語におけるファイル終端(EOF)の基本と使い方を徹底解説
ファイル終端(EOF:End of File)は、入力の終わりを示す特別な値です。テキストを入力した後、Ctrl + Z(Windows環境の場合)を押すと入力が終了し、「ファイルの終端に達したため、これ以上読み込むデータがない」ことをプログラムに伝えます。
EOFとは何か
C言語では、ファイルや標準入力からデータを読み込む際、その終端を検知するためにEOFが使われます。EOFはstdio.hヘッダーで定義されており、通常は負の整数値(多くの環境で -1)として定義されています。文字コードは0〜255の範囲に収まるため、この範囲外の値を持つEOFによって「ファイルの終わり」を確実に判別できるのです。
処理の流れ(アルゴリズム)
EOFを使ったファイル読み書きの基本的な手順は以下の通りです。
ステップ1:ファイルを書き込みモードで開く。 ステップ2:文字がファイルの終端に達するまで、1文字ずつファイルポインタへ書き込む。 ステップ3:ファイルを閉じる。 ステップ4:再度、ファイルを読み込みモードで開く。 ステップ5:fpがEOFになるまでファイルから文字を読み込む。 ステップ6:読み込んだ文字をコンソールに表示する。 ステップ7:ファイルを閉じる。
サンプルプログラム
以下は、EOFを使ってキーボード入力をファイルに保存し、その内容を読み出して表示するCプログラムです。
#include <stdio.h>
int main(){
char ch;
FILE *fp;
fp = fopen("std1.txt", "w"); // ファイルを書き込みモードで開く
printf("テキストを入力し、最後にCtrl+Zを押してください:\n");
// 1文字ずつ読み込み、EOF(Ctrl+Z押下時)でループ終了
while((ch = getchar()) != EOF){
putc(ch, fp);
}
fclose(fp);
fp = fopen("std1.txt", "r"); // ファイルを読み込みモードで開く
printf("ファイルの内容:\n");
// fpがEOFになるまでファイルから文字を読み込む
while ((ch = getc(fp)) != EOF){
putchar(ch);
}
fclose(fp);
return 0;
}実行結果
上記のプログラムを実行すると、次のような出力が得られます。
テキストを入力し、最後にCtrl+Zを押してください: This is the EOF demonstration example if your text typing is over press cntrlZ ^Z ファイルの内容: This is the EOF demonstration example if your text typing is over press cntrlZ
ポイント解説
- getchar() と getc() の戻り値判定: ループ条件で
!= EOFを比較することで、入力の終端を正確に検知できます。 - Ctrl+Z の役割: Windowsでは Ctrl+Z、Linux/macOSでは Ctrl+D が入力終端(EOF)の合図になります。
- fclose() の重要性: 書き込み後は必ずファイルを閉じてから読み込みモードで開き直すことで、バッファの内容が確実にディスクへ反映されます。
このようにEOFは、ファイル操作や標準入力の処理において「どこまで読めばよいのか」を判断するための不可欠な仕組みです。ぜひ実際にコードを動かして、EOFの挙動を体感してみてください。
-
C言語のループ制御文(for・while・do-while)を徹底解説!フローチャートとサンプルコード付き
C言語におけるループ制御文は、同じ処理を何度も繰り返し実行したい場合に使われる重要な構文です。毎回コードを書き連ねる必要がなくなり、プログラムを簡潔かつ効率的に記述できます。 C言語で利用できるループ制御文は、主に以下の3種類です。 for文 while文 do-while文 本記事では、それぞれの構文の書き方、フローチャートによる動作の流れ、実際に動くサンプルプログラムと実行結果まで、初心者にもわかりやすく解説します。 for文とは?基本構文と使い方 for文は、「初期化」「条件式」「増減式」を1行にまとめて記述できる、最もよく使われるループ構文です。繰り返す回数があらかじめ決まっている
-
C言語で連結リストの末尾からn番目のノードを取得するプログラム
n個のノードからなる連結リストが与えられたとき、その末尾からn番目のノードを出力するのが本記事の目的です。プログラムはリスト内のノードの並び順を変更してはならず、あくまで末尾から数えてn番目に位置するノードの値を表示するだけでなければなりません。具体例入力 -: 10 20 30 40 50 60 N = 3 出力 -: 40上記の例では、先頭ノードから順に「count − n」個目までのノード(10, 20, 30, 40, 50, 60)を走査し、末尾から3番目のノードとして 40 が得られます。効率的なアプローチリスト全体を最後まで走査しなくても、以下の手順で目的のノードを見つけられ