EOFが理解できない。

1名無しさん
例えば
while((c = getchar) != EOF){
    putchar(c);
    }

のようなプログラムがあるとして
毎回変数cにgetchar()で値を代入していくのに
EOFになる事はあるのでしょうか?
そもそもEOFって何ですか?
本当に解らなくて困っているのでマジレスお願いします。
文字配列の最後が'\0'で終わる事は知っていますが
それとは関係あるのでしょうか?
2名無しさん@お腹いっぱい。:2000/12/13(水) 01:33
おまえ馬鹿?

>c=getchar

マニュアル読めや!!
3名無しさん@お腹いっぱい。:2000/12/13(水) 01:34
#define EOF (-1)
4名無しさん:2000/12/13(水) 01:35
カニハン本、オライリー本と読んだんですけど理解できませんでした。
5名無しさん:2000/12/13(水) 01:35
>>2
c = getchar()の間違いです。
6名無しさん:2000/12/13(水) 01:36
EOFとはどのような現象なのでしょうか?
7:2000/12/13(水) 01:40
ファイルの末端になると getchar() が失敗して -1 (EOF) を返す。
EOF は文字コード(0xFF) に割り当てられてる制御用の特殊文字
\0 も文字コード(0x00) に割り当てられてる制御用の特殊文字
8:2000/12/13(水) 01:42
getchar() はテキストファイルの読み込みにのみ使用可能
バイナリファイルではファイル中に EOF(0xFF) と同じデータがある可能があるので使えない。
9名無しさん:2000/12/13(水) 01:44
>>7
例えば32bitの整数型に32bitの最大数+1をgetchar()すると
EOFになるという事でしょうか?
10名無しさん:2000/12/13(水) 01:46
文字列のEOFとは、例えばどのような物か例をあげて頂けるとありがたいです。
11:2000/12/13(水) 01:48
ありゃ、そうでしたっけ? それだとEUCのファイルも読めなさそう
だけど。
手元のLinuxだとEOFは(-1)で、getcharはintだから通常の文字列と
かぶることはないと思うけど。処理系依存なのかな。
12名無しさん@お腹いっぱい。:2000/12/13(水) 01:49
>>10
EOF = End Of File
文字列はFileではないのでEOFはありえない。
13:2000/12/13(水) 01:53
11は>>8ね。

>>9 putchar()の間違い? そうなら、EOFを書き込むってことは普通
できないんじゃないかな。EndOfFileなんだから、ある特定の文字っ
てのは実装としてはあっても、考え方としては正しくないんじゃ
ないでしょうか。
14名無しさん@お腹いっぱい。:2000/12/13(水) 01:55
>>8 不正解
>>11 正解
15>10:2000/12/13(水) 01:58
んー 文字として規定しなくても
入力の終わりとして char の範囲外で int にある値(たとえば -1)
と解釈してもいいんでは。
char = int の処理系は困るけど。
16:2000/12/13(水) 01:59
俺間違ってる?
ていうか Windowsプログラマの俺は getchar() なんて使わなね~よ。
EUC で EOF(-1) とかぶる文字ってあるのか?
char の -1(0xFF) を int にキャストすると -1(0xFFFFFFFF) に成るだろ?
17>16:2000/12/13(水) 02:04
間違ってるよ。大体EOFがどんな値かなんて知る必要はない。
1はとにかくリファレンス読め。
リファレンスのどこがどう分からないのかを聞け。
18名無しさん:2000/12/13(水) 02:04
>>15
今やっと解ったような気がします。
変数の型に規定されていない範囲の値を代入するとEOFとなるのでしょうか?
例えばunsigned int に負の数とか。
19>18:2000/12/13(水) 02:11
それはちゃう。
EOF は入力の終わりを知るためのシンボルとしての値。
だから値は直接きめられていないし、入力系の関数以外に
使ったり、入力の終わりを知る以外に使うのは正しくないと思うよ。

unsigned int に負の数を代入するとどうなるかは
型変換の問題になると思う。
20名無しさん:2000/12/13(水) 02:11
EOFはストリームからの文字の入力の終わりを示す値だとありますが
プログラムにこれ以上入力しない事をどうすれば知らせられるのでしょうか?
21:2000/12/13(水) 02:14
DOSなんか辞めちまえ!
22>20:2000/12/13(水) 02:21
CTRL-Z(DOS)/CTRL-D(UNIX)の事かいや?
それとも自前の入力ルーチンに終了を知らせる方法か?

※まさかgetchar()にプログラム内部で値を渡すわけでもあるまい。
23名無しさん:2000/12/13(水) 02:25
もしかしてEOFってCTRL-Dとかの強制終了の事ですか?
OSがプログラムを終了させるのではなくて
CTRL-DでOSがプログラムに入力終了だと告げるのでしょうか?
24:2000/12/13(水) 02:43
EOFは「ファイルの終わり」って言うそのままの意味で、それ以上
でもそれ以下でもありません。stdio.hで(-1)が定義されているの
もCの実装上の都合だけでしょう。
あと、DOSの場合は知りませんが、UNIXではCtrl-DでEOFを送る(と
言う表現は正しいのか?)のはshellの役目です。
25名無しさん@お腹いっぱい。:2000/12/13(水) 06:09
1は(c = getchar()) != EOFの意味がわかってないと見た。
cはint型ね。
getchar()はint型を返す関数で、読み込んだ文字またはEOFを返す。
普通は文字は0x0000~0x00ffでEOFは-1(0xffff)。
その値をcに代入する。
代入式c = getchar()の式の値は代入した値なので、
getchar()の返り値と同じ。
それとEOFを比較してるということ。
26名無しさん@お腹いっぱい。:2000/12/13(水) 10:11
>>24
Ctrl-Dの機能はshellとは関係なく、ttyデバイスの機能だと思う。
Ctrl-Dの本来の意味は行バッファ中の文字を送信するためのもの。
行バッファが空の場合は、0文字が送信され、これがEOFと解釈される。
だから行の途中でCtrl-Dを入力してもEOFとは解釈されない。
27名無しさん@お腹いっぱい。:2000/12/13(水) 10:38
道に終わりがあればそれがEOFです
28:2000/12/13(水) 12:12
>>26
そうだったのか。間違ったこと書いてすいません、皆さん。そして
知識をありがとう。
29名前ついてますか?:2000/12/13(水) 12:29
>>24 ^Dでストリームが終了するのは shellじゃなくて
ttyドライバのおかげだよ。
sttyで設定できるものはttyの範疇

ちなみに DOSの ^Zは driverじゃなくて applicationが
扱わなきゃいけない点で、Unixの ^Dとは違ったような。
DOSの C libraryはそこを頑張ってごまかしてくれるけど。
30名無しさん@お腹いっぱい。:2000/12/13(水) 21:11
文字コード調べても…
EOFの状態を知りたいのならそれに用いる専用の関数(eof()とか)を使えば良い
31名無しさん@お腹いっぱい。:2000/12/14(木) 02:38
1はファイルっていうか入出力ストリームの概念を理解しているのか?
まずは関数の使い方よりもそこからだろう。
32名無しさん:2000/12/14(木) 08:43
入手力ストリームの概念について簡単にで良いですので教えてもらえるとありがたいです。
33名無しさん@お腹いっぱい。:2000/12/14(木) 11:34
>>32
>入手力ストリーム
取りあえず叫んどけって感じの語感だな。

それはともかく。
入出力を単なるバイトの流れに見えるように抽象化したものだ。
メインフレームのように、
データセットの種類がゴチャゴチャあって
固定レコード長であったり無かったりして
ブロックサイズを一々指定しないといけなかったり
なんかして、というような環境を考えた時に、
入出力をこのように極めて単純な形に抽象化し、
そのように見せることのありがたみが理解出来る。
逆に、UNIXのようなOSを用いていると、あまりに
当然すぎて、よく分からないかもな。
34名無しさん@お腹いっぱい。:2000/12/14(木) 13:20
簡単にいうとカセットテープみたいなものだね。
始めと終わりのあるびろーんと長いもので、テープの端っこまで読んでしまうとEOFと。
getchar()はさしずめコマ送りと言ったところかな。
35名無しさん@お腹いっぱい。:2000/12/14(木) 14:16
EOFは文脈によって2つの意味がある
1)EOFマクロ
2)ファイルの終端(End Of File)

1)EOFマクロ
 これはgetc, fgetc, getcharなどの
 ストリームから1文字取得する機能を持つ関数が
 ストリームの終わりにくるか(要するにファイルの終端)、
 読込みエラーが発生した場合に返される値である
 ※エラーで中断したかファイル終端まで読んだかの厳密な判定
  を行なう場合はfeof, ferrorを行なう場合もある
 EOFマクロは大概の処理系では-1に定義されている

2)ファイルの終端(End Of File)
 ストリームの終わり

余談
 ストリームからデータの取得を行なうその他の関数(fread, fgets etc)
 は、ファイル終端まで読んだかを判定するのにはEOFマクロは使わない

こんな感じかな?
36メモ:2001/03/03(土) 16:46
ちょっとメモするからage
37ドキュプログラマ:2001/03/03(土) 19:01

EOFって、EnterpriseObjectFrameworkのことかとおもった。
ウツダシノウ
38エ口プロク”ラマ:2001/03/03(土) 19:24
Eroi Omanko Fucking = EOF
39デフォルトの名無しさん:2001/03/04(日) 18:44
copy con config.sys
ってみんな使ったよね
40デフォルトの名無しさん:2001/03/04(日) 20:54
使わない
41デフォルトの名無しさん:2001/03/04(日) 23:26
getc
getchar
fgetc
getch
getche
ungetc
ungetch
の違いを教えてください。
42デフォルトの名無しさん:2001/03/04(日) 23:33
>>41
リファレンスよめ
43デフォルトの名無しさん:2001/03/05(月) 11:27
EOFで結構盛り上がれるんだね。
44デフォルトの名無しさん:2001/03/05(月) 14:14
39です
>>40
じゃあ、エディタがない状況
たとえば出張先のOSの再インストールとか(そんな状況あるか?)
の時はどうすんの?
45デフォルトの名無しさん:2001/03/05(月) 14:50
>44
a:\vim config.sys

aドライブがないマシンなど知らん
46デフォルトの名無しさん:2001/03/05(月) 15:02
>>44
40じゃないので、へ理屈を並べてみる。
1) type con > config.sys ## copy con config.sys と変わらんわい
2) copy config.sys+con config.sys ## 追記(元の内容が残るぞ)
47デフォルトの名無しさん:2001/03/05(月) 16:38
config.sysぐらいならedlin使えばいいじゃん。
無理にcopyやtypeでやることも無いでしょ。
#俺はVzをFDに入れて持ち歩いてたけど。
48デフォルトの名無しさん:2001/03/05(月) 23:57
39です
C-zなんかでスレッドができていたので思わず
copy conを思い出して書いただけで
実際私もConfigでは使ってないような気がします
何かで使ったんだけどなー
ごめんなさい
49デフォルトの名無しさん:2001/03/06(火) 02:33
edlinは外部コマンドだから手元に無い場合もあるんだしね。
50デフォルトの名無しさん:2001/03/06(火) 02:35
EOFって
#define EOF void* ( -1 )
だっけ?
51デフォルトの名無しさん:2001/03/06(火) 10:16
>>50
アホ。stdio.h調べろ
52デフォルトの名無しさん:2001/03/06(火) 15:53
EOFって エホ とよむんかな?
俺はアホじゃないよ。
53デフォルトの名無しさん:2001/03/06(火) 16:54
エホバの商人って心臓付近の肉売ってるんだろ?
エホバの商人って心臓付近の肉売ってるんだろ?
54デフォルトの名無しさん:2001/03/06(火) 19:25
>>52
えんどおぶふぁいる。なんでもかんでもりゃくすな。
http://www.ascii.co.jp/ghelp/13/001385.html

あほだとおもうぞ。じかくしょうじょうがないのはさらにまずい。
ぼくちゃん、わかったかな。
55デフォルトの名無しさん:2001/03/07(水) 04:52
EOF = 0x1A だと思ってた、っていうか、
54のURLには、「MS-DOSファイルのEOFコードは1Ahである」と書いてある。
あと、PNG Specificationでは
0x1A = The control-Z character stops file display under MS-DOS.
http://www.libpng.org/pub/png/spec/PNG-Rationale.html#R.PNG-file-signature
となっているけど、CマガジンのPNG説明では、その0x1A = EOFって書いてあったんだよ。
56トリッキーの1:2001/03/07(水) 05:33
>>55
EOFという文字コードは0x1Aなので、
「MS-DOSファイルのEOFコードは1Ahである」
は間違いじゃ無いでしょうね。英語もほぼ同じ事を言っています。
ここでいうEOFコードというのは、「ここがファイルの終わりだよ」と
作成者が親切に?付けるものなので、その気になれば1つのファイルに
EOFコードをたくさん書くことも可能です。

しかし、標準ライブラリ関数が返すEOF(-1)は、
「ファイルの終わりまで読んだよ」という意味です。
テキストモードで開いた場合、0x1Aを読むとfgetc()などはEOFを返しますが、
バイナリモードで開いた場合、ファイルの本当の最後に行き当たって初めてEOFが返ります。

全く同じ"EOF"という文字で表されるので非常にわかりにくいのですが、
プログラム上で使用するEOFと、ファイルの中にあるEOFコードとは
別物であり、定義が違う事に注意しましょう。

なんかまともに書いてしまった。
テキストモード云々のあたりに自信がないので、
間違ったことがあれば誰か訂正してください。
57デフォルトの名無しさん:2001/03/07(水) 08:56
>>49
>edlinは外部コマンドだから手元に無い場合もあるんだしね。
MSDOS標準エディタだから、普通にインストールされていれば
必ず入っていたはず。ちなみにW2Kにも付属している。
58デフォルトの名無しさん:2001/03/07(水) 10:48
>>57
標準エディタが手元にない時なんていくらでもあるんだから。
57は一仕事する前に、きっちり準備するんだね
えらいなー
どっかの行き当たりばったりで
内部コマンドだけでがんばってるやつとは違うんだね
59デフォルトの名無しさん:2001/03/07(水) 15:43
>>58
FD一枚で動かしてるんじゃなきゃedlinなんて
準備しなくたって入ってるだろ。
60デフォルトの名無しさん
copy con config.sys は結構使ってたよ。
別の FD にシステムをコピーしてリブートしたものの、
config.sys を書くのを忘れてたときとか。