第二十七話 ストリーム
月曜日の午後、俺は元気よく電算部部室の扉を開けると、そこには立花先輩、西原さんがいた。
さらに、そこにサヤちゃんも混じっていた。空いているPCの一つを使って、何か作っている様子だった。
「遅い遅いー」
先輩の言葉を聞いて、
「あ、すいません」
俺は部室の中へと足を運んでいく。
サヤちゃんが振り向いて、
「お兄ちゃん、こんにちは」
ぺこりと頭を下げる。
うぬっ。その仕草は萌える。
「こら、ロリは駄目って言ってるでしょうが」
でれっとしたのがバレたのか、先輩から早速ツッコミを受けて、俺は慌ててかぶりを振る。
「ち、違いますって! それより、ゲーム作りを続けましょう」
俺は自分のPCを立ち上げると、椅子に座る。
「さて、先輩、次に作るのはハイスコアのことでしたね」
「そうそう。ちゃんと覚えてたのね」
「イツキくん、頑張って」と西原さんも応援してくれる。
「え、お兄ちゃん、ゲーム作ってるんだ……」サヤちゃんも画面を見ている。
「で、ハイスコアの問題は、それをどうセーブするかってことですよ」
「セーブファイルの問題?」
「ええ、要するに俺はさっぱりわからんのです」
白状する。
「あ、まだファイルの出し入れ教えてなかったねー。そういえば」
「はい、全然まったく」
「じゃ、まずはストリームから説明したほうがいいわね」
「ストリーム?」
はて、どこかで聞いたことがあったような。
「前にも言ってるんだけど、Cには標準で3つのストリームがあるのよ。入力、出力、エラー出力ね」
「ああ、そうだった」
「ま、こういうプログラム見たらわかるかなー」
先輩がキーボードを取って、コードを書き始めた。
/* ストリームテスト test.c */
#include<stdio.h>
int main(void)
{
printf("テストなの\n");
return 0;
}
ごく普通のprintfプログラムだ。
「これが、どうかしたんですか?」と西原さんも怪訝顔。
「まあまあ。実行してみるわよ」
先輩はプログラムをコンパイルすると実行した。
C:¥sample>test
テストなの
C:¥sample>_
勿論、画面に文字列が表示されただけだ。
「これは、標準出力ストリームを使って、画面に出力したところ」
「そうですが……」
今更、基礎的なことを言う先輩の真意がわからずに、俺は曖昧に答える。
「でも、出力は画面へと決まっているわけじゃないのよ」
「え?」
「たとえば、ファイルに出力したい場合は──」
先輩は、再び実行を行う。だが、今度は少し長く打っていた。
C:¥sample>test > test.txt [ENTER]
C:¥sample>_
「えっ!?」
画面に文字が出ない?
まさか……。
「ご想像のとおりよ」
先輩がdirコマンドを打つと、そこにはtest.txtファイルが新たに作られていた。メモ帳で開いてみると、そこには一行、「テストなの」とのみ書かれている。
「これが、ファイルへ書き込み?」
「そう。リダイレクトっていう機能よ。標準出力を画面でなくてファイルへと設定したわけ」
「こ、こんな機能がWindowsにあったなんて……」
「もとはUnixだけどねー。ちなみに、カッコの向きを逆にすれば、標準入力でファイルから読み込みも出来るのよ」
「これでファイルをやり取りするんですか?」と西原さん。
サヤちゃんは、何を当たり前な事を、という顔をしている。
「ところで、あたしが『標準』って言葉をいつもストリームに付けていたのに、気づいた?」
「え? いいえ」
「実はストリームは三つの標準以外にも、独自に作ることが出来るの。そして、そのストリームを窓口にして、プログラムの外のファイルと読み書きをするわけよ」
「直接ハードディスクのファイルに書き込みしないんだ」
「それはOSが許さないの……」サヤちゃんが答えた。
「サヤちゃんが言うとおり、アプリがハードと直接やり取りするのはご法度。それに、それだと他のOSのパソコンだとプログラムが動かないじゃない。デバイスドライバが違う場合、場合によっては同じOSだったとしても動かないし」
「あ、そうか」
「だからストリームって論理デバイスを間に挟むことで、PCの実装に依存しないプログラムになるのよ。じゃ、イツキくんもわかったところで、やり方を教えるわ」
先輩が、新たにプログラムを書き始めた。