第43回
仕様設計からコーディングまで~タブ/スペース変換プログラムを作る(3)

構造体をポインタでつなぐ

前回作成した「タブ/スペース変換プログラム」は、入力ファイルを1つだけ指定できる形でした。今回は、複数の入力ファイルを指定できるようにしてみます。そのためには、複数の構造体を効率的に処理する仕組みが必要になります。

プログラムの仕様

今回作成する「タブ→スペース変換プログラム」の書式は以下のようになります。
tb2sp <n> <ファイル名> <ファイル名> ...

<n>はタブストップ幅で、省略すると規定値として「8」とみなすことにします。この部分はこれまでと同じです。

続く
<ファイル名> <ファイル名> ...
の部分は、複数のファイル名を任意の数だけ指定できます。プログラムでは、指定された複数のファイルを読み込んでタブからスペースへと変換し、その結果を標準出力へ連続して出力します。

複数のファイルの変換結果を連続的に処理するため、すべてを一気に出力すると「どこからどこまでが1つのファイルなのか?」がわからなくなります。そこで、1つのファイルごとにまずファイル名を出力し、次いで変換結果、最後に区切り記号として"---- end of file ----"の1行を出力する――という形にします。

配列かポインタか?

入力ファイルの情報は、構造体で管理してきました。複数のファイルを扱う場合、構造体も複数必要になってきます。

実のところ、これまでに紹介してきた入力ファイルが1つだけの仕様では、構造体を使うメリットはあまりありません。今回のように入力ファイル――処理対象のファイルが複数となる場合にこそ、構造体を使う意味が出てきます。

複数の構造体を扱うには、以下の2とおりの方法がありました。

a.配列
b.ポインタによるリンク

ポインタのリンクで対処

配列は添字(要素番号)で個々の要素を自在に指定できますが、あらかじめ要素数を決めてメモリを確保しなければなりません。入力ファイルの数が確保した要素数より多かった場合、足りない要素を追加することはできません。入力ファイルの数が少なければ、使われなかったメモリが無駄になります。

ポインタのリンクでは必要な数だけメモリを確保できるので、無駄はありません。ただし、先頭を起点にして順番に(シーケンシャルに)アクセスすることしかできません。

このプログラムは入力ファイルを順に処理していけば良いだけですから、配列のメリットである「要素を自在に参照できる」ことにはあまり意味がありません。

入力ファイルの数が不定の場合、むしろ「必要なだけメモリを確保できる」というポインタのメリットが活かせます。

そんな訳で、ここでは必要な数だけ構造体のメモリを確保し、それらをポインタによってリンクする形を採ることにします。