作者: 藤岡和夫
日時: 2008/3/02(09:28)
On Sun, 02 Mar 2008 02:56:52 +0900
davi <davi-1984@...> さんwrote:

> ジッと読んでみると、「&& count != 0」が勘所なんですね。

 そうですね。そこがわかれば問題解決ですね。なぜそのようにしているかとい
うと、ループの最初の時点ではtitleとprtitleの値が必ず違うので、このブロッ
クを実行してしまうのを避けているのです。ただ単にそれだけ。一行目を読めば、
prtitleにはtitleの値が入るので二行目以降はtitleと前の行のタイトルを比較
して制御できるようになります。

> この組み合わせの例ですが、END部分って、読み込んだファイル
> の最終行、その1行分“だけ”に対する処理だと見て良いので
> しょうか?
> 
> ENDを殺して動かしてみましたが、最終レコード全体が出力され
> ませんでした。
> 
> 創世記機械の出版年である1981だけが欠けて、
> 
> |創世記機械,,山高昭 訳,創元推理文庫,
> 
> と出力されるはずだと予想していたのですが…
> 
> どうして最終レコード全体が出力されないのでしょう?

 前の説明でおわかりになっていると思うのですが、レコードの出力処理は、title
とprtitleが違う場合にのみ出力するのです。したがって、最後の行を読んだ段
階ではまだtitleとprtitleの値は一緒ですから、出力しません。そこで出力する
とデータが未完成ですしね。出力してはいけないのです。ブロックの最初のほう
で一つ前のレコードを次の行のtitleを取得して出力してよいのかどうか条件判
断する構造になっているのです。

 今回の例のように、データの規則性が複雑な場合には、ループを処理した後、
最後のデータを出力することになることが多いですね。それが私がワンパターン
になると言った意味です。

藤岡 和夫
kazuf@...
日曜プログラマのひとりごと http://homepage1.nifty.com/kazuf/renewal.html