teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2016/10/18 13:26

投稿

otn
otn

スコア86365

answer CHANGED
@@ -1,4 +1,10 @@
1
1
  質問の背景は何でしょうか?
2
2
  `EOF`は、ファイルの終わりと言うことで、読むべきデータがもう無いと言うことです。つまりデータはありません。
3
3
  C等では、`EOF`をプログラム上でデータで扱いたいというニーズのために、「ファイル中に絶対に存在しない値」として、`-1`を使っています。
4
- 他の言語ではまた別の手段で`EOF`を判断します。
4
+ 他の言語ではまた別の手段で`EOF`を判断します。
5
+
6
+ #追記
7
+ 歴史的なCP/M等の0001 1010 = 0x1A = SUB(substitute)については、ikedasさんの書かれている通りで、EOFというわけでは無いです。ファイルサイズがちょうど128の整数倍のファイルだと0x1Aは付きませんので、「0x1Aが出てくるまで読む」というプログラムはバグと言うことです。
8
+
9
+ Unix/LinuxのCtrl-D = 0000 0100 = EOT(End of Transmission)は、EOTの名前の通り、直ちにデータを送ります。行頭でCtrl-Dを打つと、`read`システムコールが戻り値`0`つまり「長さゼロのデータが読めた」と返ります。これはディスクファイルが`EOF`に達したときと同じ戻り値ですが、Unix/Linuxの場合は端末もファイルの一種なので、`read`が戻り値`0`の場合は`EOF`と見なすようコーディングします。`getchar`関数などはシステムコールに一皮かぶせてあるので、下請けの`read`が`0`を返したら`-1`を返すようになっています。
10
+ つまりシステムコールレベルでは、「`read`の戻り値が`0`」というのが`EOF`です。