第49回
ユーティリティを作る~文字列置換プログラム

プログラムの設計

本コラムの第35回、第37回などで、テキストファイルから文字列を検索するプログラムを紹介しました。その仕組みを土台にして、見つけた文字列を別の文字列と置き換えるプログラムを作ってみます。

プログラムの基本仕様

プログラム名は"strchg"としましょう。書式は以下のようにします。
strchg <旧文字列> <新文字列> <入力ファイル> [<出力ファイル>]

<入力ファイル>の中から<旧文字列>を見つけ、それを<新文字列>に置き換えて、<出力ファイル>に書き込みます。<出力ファイル>が存在しなければ新たにファイルが作成され、存在していれば上書きされます。

<出力ファイル>は省略可能で、省略されたら標準出力へ出力します。その場合はリダイレクトで出力先をディスク上のファイルに切り替えることができます。

全体の構造を考える

本コラムの「第35回 変数の通用範囲~内部広域変数と外部広域変数」で「単語を検索するプログラム」を作り、「第37回 ファイルの扱い(2)~ファイル操作の実例」でそれを改良して「文字列検索プログラム」を作りました。

プログラムの基本的な部分の動作は、このときのプログラムと変わりません。違うのは以下の部分です。

文字列検索では
	指定した文字列を見つけて
	それが存在する行を表示する
だけでしたが、今回作る文字列置換プログラムでは
	見つけた旧文字列を新文字列に置き換え
	さらに
	旧文字列が見つからなかった行もそのまま出力する
という点です。

処理の流れを考える

上述の点を踏まえて、プログラム全体の流れを考えましょう。

1.コマンドラインからパラメータを調べる
 1-1.入力ファイルが指定されていれば
    →入力ファイルをオープン
 1-2.指定されていなければ
    →標準入力を使用

2.<旧文字列>と<新文字列>を取得して変数へ保存

3.入力ファイルから1行読み込んでバッファへ保存 ---- ★
 3-1.読み込みながらファイルの終端をチェック
  3-1-1.ファイルの終端なら
       →プログラム終了
  3-1-2.ファイルの終端でなければ
       →バッファ内から<旧文字列>を探す
   3-1-2-1.<旧文字列>が存在すれば
         →それを<新文字列>に置き換える
   3-1-2-2.<旧文字列>が存在しなければ
         →何もしない
 3-2.出力ファイルにバッファの内容を書き出す

4.★(3)に戻って処理を続ける

おおよそ以上のようになります。

機能別に関数を設計する

全体の構造が決まったので、次にこれを各機能に分割していきます。

このプログラムに必要な機能は、以下の3つに大別できます。

1.ファイルをオープンする
2.文字列を置き換える
3.処理を繰り返す

上記3つの機能のうち「3.処理を繰り返す」部分は、main関数内で処理できそうです。残る「1.ファイルをオープンする」と「2.文字列を置き換える」の2つの機能は、独立した関数としましょう。

関数名は
  ファイルのオープン:openfile
  文字列の置換:strchg
としておきます。