Part15: ファイル入出力

ダイヤ「というわけで実用編いきますわよ」
果南「ファイルの読み書きができれば使い方の幅広がるもんね」
花丸「がんばルビィずら」
ダイヤ「混ぜないでいただけます?」


ダイヤ「はじめに、ファイル入力、ファイルの中身を読むところから始めますわ」

花丸「いきなり括弧てんこ盛りのコードが出てきたずら・・・」
ダイヤ「落ち着いて見ていけば読めるはずですわ。このコードは、ファイルを読み込んで改行区切りでリストにする手続きread-fileを定義しています」
果南「まあ、そこくらいは分かるんだけど」
ダイヤ「call-with-input-fileはScheme組み込みの手続きで、指定された名前のファイルを開いて、第2引数で受け取った手続きを呼び出すものです」
果南「となると、3行目からが本体、と・・・この引数iは何?」
ダイヤ「それは入力ポート、まあファイルからデータを読み込む入口みたいなものですわ。ファイルハンドルとかファイルポインタとかそういうのが近いかもしれませんわね」
花丸「例えがよくわかんないけど・・・」
ダイヤ「組み込みの入出力手続きを呼び出すときに使うものという認識で十分ですわ。さて、次の名前付きletで1行ずつデータを読んでいきます」
果南「引数が2つ・・・空リストと、read-lineは・・・」
ダイヤ「read-lineはポートから1行読む手続きですわ。ここで、先ほどの入力ポートを指定します」
花丸「あ、なんかわかったずら。ここから読んでね、って教えてあげるんだ」
ダイヤ「あとは、空リストslにファイルから読んだ行lconsでつなげてリストを作っていますわ。注意すべきは終了条件ですわね」
果南「eof-object?
ダイヤ「ファイルを最後まで読み終わると、eof-objectというのが返ってきます。それを判定する手続きがeof-object?ですわ」
花丸「読み終わったら繰り返しから抜けて終了、ってことだね」

ダイヤ「実際に動かしてみますわ。まず、テキストファイルを用意します」

君のこころは輝いてるかい?
恋になりたいAQUARIUM
青空Jumping Heart
ユメ語るよりユメ歌おう

ダイヤ「setlist.txtというファイル名で保存しておきます。文字コードはまた別の話になるので、この場ではUTF-8で保存しておいてください」
花丸「できたずら~」
ダイヤ「では実行してみましょう」

(“君のこころは輝いてるかい?” “恋になりたいAQUARIUM” “青空Jumping Heart” “ユメ語るよりユメ歌おう”)

花丸「おおっ、読めたずら!」
ダイヤ「簡単なファイルの読み込みはできるようになりましたわね」


ダイヤ「次はファイル出力です」

ダイヤ「読み込みに比べると分かりやすいと思いますわ」
果南「なんかHello worldでやったコンソール出力みたいだね」
ダイヤ「まさにその通りですわ。このコードは出力先を標準出力からファイルに変えただけですの」
花丸「最初の方も、読み込みのコードと似てるずら。call-with-output-fileで書き込み用のファイル開いてる、ずら?」
ダイヤ「そうです。そしてそれが呼び出すlambdaに渡されるのは出力ポートですわ。これをdisplaynewlineに渡すことで、ファイルへの出力を行っています」


ダイヤ「さて、このScheme入門ですが・・・一旦、ここで中締めとしますわ」
果南「あれ、もう終わり?」
ダイヤ「最低限、Schemeを使ったプログラムを書ける程度の内容は見てきたと思いますし。私事ですが少々忙しくなりますので・・・」
花丸「まあ、仕方ないずら」
ダイヤ「マクロや継続、非決定性といった難しめのトピックは残っていますが、いずれ時間ができたらまた勉強してみてもいいですわね」
果南「まずはここまでの内容をちゃんと復習しておくよ」
花丸「SICPってやつ読んでみるずら」

ダイヤ「ここまでのお相手は、恋の喜び咲かせましょう♡AZALEAの黒澤ダイヤと」
果南「松浦果南と」
花丸「国木田花丸でした~」
3人「それでは、ご機嫌よう♪」


LINEで送る
Pocket


返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です