🧩今日の学び
・EOFは「特別なデータ」ではなく、「もう次が存在しない」という状態である
・READするたびに内部位置は次へ進み、ファイルは最後まで順番に処理される
・AT END とEOF-FLAGを組み合わせることで、「最後まで読む」ループ処理が完成する
な)んじゃ終わりっすね。帰りますー。
係)待て待て待て待て!まだ終わってないからな!
な)えー、終わったんですよ。
係)終わってんのはお前の体型だからな。
な)もう何もかもが遅いんですよ。
係)そりゃそんな体型になれば遅いだろうよ。
な)ひどすぎ!?
係)いいか、今は一つのデータを読み込んだだけだろ。お前のデブデータ全部読み込んで、お前がいかに無駄に贅肉付けてるのかを証明させるってことだ!
な)デブデブうるさいっすよ!
ホントいっつも失礼なんだから。デリカシー無いんだから。乙女に年齢と体重聞いたら駄目なんですよ!乙女はうんこなんかしないんだから!
係)うるさいわ!いいから行くぞ!
ファイル処理は「最後まで読む」
READ NARUO-FILE.
前回までの流れでは、一行を読み込んだだけで、次の行は読み込まない。だからこそデータは一つしか存在していない状況だ。
な)だからルーピングさせろって話でしょ?
係)そうだ。
ファイル処理の基本は「最後まで読む」、だから
READ ↓ DISPLAY ↓ READ ↓ DISPLAY
を繰り返すわけだ。
な)でも、ルーピングしてどんどん回ったとして、ルーピングは勝手に止まるもんですの?
EOFは「もう次がない」という状態
係)ファイルには終わりがあるだろ?
な)SEKAI NO OWARI的な?ドラゴナイ的な?
係)データの最後まで行った状態だ!
な)あー、もう次ありませんってことっすか。
係)それをEOFって呼ぶんだよ。
な)ほー「エロいオーダー、フェンス越しに」っすか。
係)End Of Fileだっての!そもそもフェンス越しにってなんだよ!
な)フェンス越しにエロいオーダーをして、それを見て楽しむプレイ?
係)ホントうるさいわ…
な)あ!なんかありましたね、そういえば!
記憶には残らないけど、記録には残ってるやつ。
係)記憶に残しておけっての!
READするたびに次の行へ進む
な)でもっすよ?
ルーピングするとして、何をルーピングするんす?1行目、2行目とかどうやって判定させるんす?エロく説明するんすか?
係)エロから離れろよ!
いいか、判定なんかしてない。
な)ほ?
係)READするたびに、勝手に次へ進むんだよ。
な)自動なんすか?
係)そうだ。
な)オートマチックっすか?
係)なかなか便利だろ?
な)オートマ限定っすか?
係)うるせえ!!
な)ひ!
係)ファイルには「今どこ読んでるか」が内部で保持されてるんだよ!
例えば、最初にOPENした時点では、ここにいる。
▼ 1行目 2行目 3行目
で、READするとこうなる。
1行目 ← 読み込む ▼ 2行目 3行目
な)ほー
係)さらにREADするとこうなるわけだ。
1行目 2行目 ← 読み込む ▼ 3行目
な)むーん
係)READした瞬間に次位置へ進むと考えていいぞ。
な)ふむむ?
ってことは、READが次へ進めさせる役目ってことっすか?
係)そういう理解で良い。
EOFを見つけるのはCOBOL、止まるか決めるのは自分
な)んだば、EOFの出番はどこですの?
係)最後まで行ったら、EOFで、次はなしということになる。
な)いや、だから、それはこぼるんが勝手に判定してくれるんすかって話ですよ?
係)あぁそういうことか。
EOFそのものを見つけるのは、COBOL側だ。
ただし、「EOFになったらどうするか」は、お前が書く。
な)オーマイスパゲッティ!
READにはAT ENDとNOT AT ENDを書く
係)つまりこういうことだ
READ ↓ 次のデータがある → NOT AT END ↓ もうデータがない → AT END
で、その部分はどう書く?
な)書かないとか?
係)書けって言ってんだよ!
な)人生には選択肢が多いほうが良いんですよ!
係)いいからさっさと考えろっての!
な)むー!
READ ファイルだから
READ NARUO-FILE
で、分岐となるから、IFかしら?
READ NARUO-FILE
IF
IF…… あれ、条件ナッシング?
条件がないんだから、書かないでいいのかな。
READ NARUO-FILE
NOT AT END
AT END
ってなところかしら。
あ、こぼるん生徒会長のくせにひねくれてるから、終わりの始まりから書くんじゃなかったっけ?
だからして…
READ NARUO-FILE
AT END
NOT AT END
って感じでどうでしょ?
係)悪くはないな。
な)おー!係長が唸った!
係)一切唸ってないからな!
な)もう我慢しちゃって
係)お前のコードで唸るかよ!
な)ひど!
係)まずREADはEND-READしっかり閉じること。READがどこまでかをはっきりさせることだ。
AT ENDが先というのは、お前の言う通りだ。よく覚えてたな。
な)ほんとひねくれてますよねー
係)お前ほどじゃないだろうが。
な)いやだなー、もう、えへへ
係)お前の照れるポイントが一切わからん…。
な)あれ?でもEOFの出番がないんじゃ?
呼んでおいて、邪魔者扱いすか?嫌がらせっすか!晒し者っすか!晒し首っすか!
そら係長にとっては、晒し首からの鋸挽きなんて普通のことでしょうけど。人がノコギリ挽こうと思っても、もう転がってるんでしょうけど!
係)そもそも挽こうとするなよ!
EOF-FLAGは「終わった」を記録する旗
係)いいか、EOFはループを止めるために用意する目印ってことだ。
な)ほー?
係)COBOLがデータの読み込みが全部回り終えたという報告を受けたら、お前はEOFになったと旗を立てるんだ。
な)ほー??
係)具体的にはこう書く。
01 EOF-FLAG PIC X VALUE "N".
どう読む?
な)EOF-FLAGは1文字で、Nを入れておくってことでしょ?
係)そうだな。初期値はN、つまり「まだ終わっていない」ということだ。
MOVE "Y" TO EOF-FLAG
それで、最後まで行ったらYをEOF-FLAGに入れる。
それをループ終了の条件とするってわけだ。
な)あ!そか、AT ENDにMOVE "Y" TO EOF-FLAGを入れておけば、ルーピングから抜けられるって算段っすか!
係)そういうことだ。
な)さすが係長、なかなかやりますなー
係)なんで上からの物言いになるんだよ…
PERFORM UNTILで「最後まで読む」が完成する
係)今の内容をコードに反映させていけ。ループはPERFORM UNTIL 条件だ。
な)あいー
PERFORM UNTIL EOF-FLAG = "Y"
READ NARUO-FILE
AT END
MOVE "Y" TO EOF-FLAG
NOT AT END
なんかやること
END-READ
END-PERFORM.
これで、どうざましょ?ようござんしょ!?
係)…
な)あれ?全然違いました…?
おむすび
係)いや、それなりのコードが出てきたから、少し感動してた。
な)え、まじっすか!泣かせちゃいました!?ごんぎつね以上でした!?
係)ごんぎつねは感動する話じゃないだろ…
ま、お前もようやく1/32人分の仕事ができるようになったんだなと。
な)ひど!全然感動してないじゃないっすか!全米なんてスペクタクル感がないともう全然泣いてくれませんからね!
係)ごんぎつねのどこにスペクタクル感があるんだよ!
な)そもそも1/64人分程度なもんですからね!
係)なんで下がるんだよ!
(つぎに続く)
係長のワンポイント
EOFは「特別なデータ」じゃない。
“もう次が存在しない”という状態のことだ。
よくある誤解は「READが止まる」だが、実際はCOBOLがEOFを検知するだけだ。
だからAT ENDで何をするか、ループを止めるかは自分で決める必要がある。
その結果、READは「読む命令」ではなく、“状態を進める命令”になる。
COBOLはデータを処理する言語ではなく、状態を制御する言語だ。


コメント