emacs 入門 //\し/ N 図 7 オートセープ機能を制御する変数 (defconst auto—save—default t "*t says by default do auto—saving Of every file—visitxng buffer. " ) 図 8 オートセープに関する変数 (defconst delete—auto—save—files t "*Non—ni1 means delete a buffer' s auto—save file when the buffer is saved for real. " ) (defconst auto—save—visited—file—name nil "*t says auto—save a buffer in the file it is visltxng, when practical. NO 工 a11y auto—save files are written under Other names. " ) の変数に、、 t 〃が設定されていると、すべてのファイルに対 してオートセーフ艘能を有効にするようです。ここまで分 かってしまえばあとは簡単です。 (setq auto—save—default nil) とすれば、オートセーフ艘能が無効になるはずです。 ろん、 M—X eval—expression eval : (setq auto—save—default nil) もち それならは・、 (setq auto—save—interval 1 ) と設定して、、、これで万全になんて思い込んだ人もいるの では ? は一い、残念でした。オーバーヘッドを考慮して か、 auto-save-interval の最小値は 21 に制限されていま す。だから、たとえ 20 以下の数を設定しても、 21 回キー ポードを叩かないかぎりオートセープされません。 オートセープで気をつけなくてはならないのは、 ・実際の処理がどれほど破壊的であっても、オートセ の頻度はキー入力の回数で決まる ということです。たとえは、 ・ C ー y で長大な領域をャンクする ・ 1 文字だけ入力する ープ のように、 Nemacs のなかから直接指定することもできま す 3 。 オートセープの頻度 ところで、オートセープ機能が有効になっているときに は、文字の入力や消去などのためのキー入力を 300 回おこ なうたびに、オートセープが実行されます。この頻度を変 (setq auto¯save¯interval 50 ) 変数にお好みの数値を設定してください。たとえば、 更したければ、 UNIX MAGAZINE 1991.9 覚えていますか ? 3 eval-expression は、任意の Emacs Lisp の式を実行 ( 評価 ) するコマンドです。 オートセープは実行されません。 変数を 0 に設定すれば、オートセーフ・機能が on の場合も 更新します。また、特殊な場合として auto-save-interval とすれば、キー入力 50 回ごとにオートセープ・ファイルを のいすれも、、キー入力 1 回ぶん〃と勘定されてしまいます。 オートセープの設定いろいろ さて、ほかにもオートセープ関係で何か設定できるか こまできたら、いっそのこと files . el をくまなく探 検してみましよう。 auto ー save をキーワードとして捜してみると、図 8 に示 した delete-auto-save-files や auto-save-visited-file -name なんて変数も発見されました。 delete-auto-save-files のはうは、ドキュメントから察 するにオートセープ・ファイルを残しておくための設定の ようです。オートセープ・ファイルは、ふだんはもとのフ ァイルがセープされたときに消去されてしまいます。とこ 121
emacs 入門 # ファイル名 # ます。 (setq delete—auto—save-files nil) ろが、 さきほど、オートセープ・ファイルの名前は、 おけば、オートセープ・ファイルも保存されたままになり のように delete-auto-save-files 変数に、、 nil 〃を設定して visited-file-name 変数は、そんな面倒くさがり屋さんの なんて考える人もいるかもしれませんね。 auto-save- いちいち recover-file なんてしなくてすむのに」 「どうせなら、もとのファイルに直接書き込んでくれりゃ だよ、って説明しましたが、 「やつばり、これまでの変更はやめた ! 」 と設定してください。ただしこれだと、 (setq auto—save—visited—file—name にする前に ために用意されている設定です。オートセープ機能を on t ) のように nil 以外の値をセットすれば、もとのファイル名 (setq make—backup—file t) の make-backup-file 変数です。この変数は、 ますは、自分のそそっかしさに自信をもっている人向け files. el のなかから探ってみましよう。 ファイルを残しておくことだってできます。その方法を、 をバックアップする機能でしたが、もっと積極的に過去の オートセープは、万一の障害に備えて自動的にファイル ファイルのバージョン管理 V 安全運転のためのバージョン管理 と組み合わせて使うほうがいいでしよう。 まく避けたいのなら、次に説明するンヾージョン管理機能〃 なんて気が変わったときにはすでに手遅れです。これをう の最後に 122 をつけたファイル名でバックアップ・ファ イルを作ってくれます 4 。 たとえば、もとのファイル名が、 になります。 osyougatsu なら、バックアッフ・ファイルは、 osyougatsu ァイルや /. emacs" に誓いておくとよいでしよう。 4 すべてのファイルについてバックアップをとっておきたいのなら、初期設定フ (setq version—control never) version-control 変数には、 t 以外の値も設定できます。 のようなファイル名で残してくれます。 osyougatsu. ~ 3 ~ osyougatsu. ~ 2 ~ osyougatsu. ~ 1 ~ なら、最初にセープするときにもとのファイルを、 osyougatsu す。たとえば、 イル名の最後に、、 . 番号〃をつけたファイル名になりま 作ってくれます。バックアップ・ファイルは、もとのファ と設定すれば、一連番号つきのバックアップ・ファイルを (setq verslon—control t) v ersion-control 変数に イルを残しておく方法を紹介しましよう。 もとないですね。そこで、次は複数のバックアップ・ファ とっては、バックアップ・ファイルが 1 つしかないのは心 なぜかこんな目にしょっちゅう遭ってしまうューサーに なんてこともあります。 3 ) 後日、自分の失敗に気づいたときには手遅れだった 2 ) そのまま、セープしてしまった 1 ) 気づかすにファイルの一部を消してしまい はすいぶん減りますが、 これだけでも、間違ってファイルを壊してしまう危険性 UNIX MAGAZINE 1991.9
emacs 入門 図Ⅱ files. el に定義されている dired-kept-versions 変数 (defvar dired—kept—verslons 2 "*When cleaning directory, number Of versions tO keep ・ " ) 図に dired-kept-versions の説明 dired—kept—verslons ' controls dired's clean—directory (. ) comand. と、図 11 のように dired-kept-versions なんて変数も定 義されています。ドキュメントや変数名から察するに、ど うやら kept-old-versions 変数や kept-new-versions 変数の親戚のようなので、どんな使われ方をしているかち ょっくら調べてみましよう。 files. el を読み込んでえ、 search-forward コマンドで dired-kept-versions を捜してっと・・ 。あれあれ、どこ にも使われてないや。おかしいなあ。でも、 files. el の、あ る関数のドキュメントのなかには図 12 のように書かれて いるので、どうやら dired システムの clean-directory コ マンドが利用する変数のようですね。それしや、この変数 については次回に予定している dired システムの説明の 際に触れることにして、とりあえす今日のところは忘れて しまいましよう。 これまでは、ファイルをなくしてしまったときに一部分 だけでも救う方法について話してきました。今度は、うっ かり操作でファイルを壊してしまう、、不注意運転〃を避け る方法をとりあげることにしましよう。でも、ただただ新 しいコマンドを覚えるだけしゃあ物足りない。せつかくだ から、新しいコマンドを見つけたときに、そのコマンドの 動作を知る方法も一緒に身につけてください。 これさえ分かれは、 EmacsLisp プログラムだってす一 し、す一い と読めるはす。 変更したくないファイルなら・ 書込み許可のないファイルを find-file コマンドで読み 込んだときには、自動的にバッフアが変更禁止になってモ ードラインに変更禁止マーク、 V ちょっと待て、その操作が事故のもと 124 図ロ書込み可能なファイルを読み込んだときのモードライン の初めの試しとて 雑煮食べ過ぎ喉つまり 門松ひっくリかえして大県ぎ いーよー今日こそ楽しけれ —NEmacs: osyougatsu (Fundamental)--Åll- が表示されます。でも、書込み許可はあるけど変更したく ないファイルを見たいときには・・・・・・。覚えていますか ? そ う、 find-file-read-only コマンドがありましたね。 では、うつかり find - file で読み込んでしまったファイ ルを変更しないようにするにはどうすれはよいのでしょ う ? toggle-read-only は、まさにそんなときのために 用意されているコマンドです。 ますは、いつもどおり find ー file コマンドでファイルを 読み込んでみましよう。図 13 のモードラインに注目して ください。 —NEmacs : UNIX MAGAZINE 1991.9 してしまったら・・ もし、 toggle-read-only を実行する前にうつかり変更 ってなったでしよ。 -%%-NEmacs : で変更禁止にしてみましよう。 (C-x c-q) M-x toggle-read-only う印です。このバッフアを、 となっているのは、、、このバッフアは変更できますよ〃とい
emacs 入門 ,/ へ、/ N 書きに関係する変数や関数を中心に紹介しました。次回は、 今回の続きということで、ディレクトリに関するお話をす れると、ユーザーの不快指数も上がりますから、プログラ ミングや文書の作成にも悪影響を及ほ、します。 次回の予告 M-x pwd 今回は files. el ファイルから読み取ったファイルの読み コマンド ・今回出てきたコマンドの一覧 ることにしましよう。 ( あらい・みちこ ASTEC) recover—file auto—save—mode M-x toggle¯read—only revert—buffer info M-x undo (C-- 、 C-x u) save—some—buffers (C-X M-x kill—some—buffers M-x cd M-X UNIX MAGAZINE 1991.9 save-abbrevs require-final-newline buffer-read-only trim—verslons—withotlt—asking kept—new—verslons kept-old-versions verslon—control make-backup-file auto-save—visited-file-name delete- auto-save- files auto—save—interval auto-save-default p 変数 set-buffer-modified-p buffer-modified-p isp 関数 s) ファイルをリカバーする オートセープ・モードの切替え バッフアの変更状態を設定する関数 バッフアが変更されたかどうかを返す関数 複数のバッフアを確認しながら削除 複数のファイルを確認しながらセープ デフォルトディレクトリの変史 デフォルトディレクトリの表示 1 つ前の変史をもとに戻す ⅲ fo システムの起動 これまでのバッフアの変更を無効にし、もとのファイルから読み込む ヾッフアの変更可能 / 変更禁止状態の切替え オートセープ先のファイル名の選択 オートセープ・ファイルを残すかどうかの指定 オートセープの間隔の指定 オートセープ機能の有効 / 無効の切替え 文書ファイルの読み書きと同時にアプレピエーション定義ファイルを読 ファイルの最後にニューライン文字を追加するかどうかの指定 バッフアが変更できるかどうかの指定 削除する際にユーザーに確認を求めるかどうかの指定 シリアル番号つきのバックアップ・ファイルのうち、中間のファイルを ファイルを何個残しておくかの指定 シリアル番号つきのバックアップ・ファイルのうち、もっとも新しい イルを何個残しておくかの指定 シリアル番号つきのバックアップ・ファイルのうち、もっとも旧いファ バックアッフ・ファイルにシリアル番号をつけるかどうかの指定 バックアップ・ファイルを作るかどうかの指定 み書きするかどうかの指定 133
emacs 入門 /A\// N 図図 revert-buffer コマンドのメッセージ Revert buffer from file /home/ara/osyougatsu? (yes 0 てⅡ 0 ) 図丐オートセープが有効な状態で revert-buffer を実行したときのメッセージ Buffer has been auto—saved recently. Revert from auto—save file? (y or Ⅱ ) 図オートセープしたファイルを読み込むときのメッセージ Revert buffer from file /home/ara/#osyougatsu#? (yes or Ⅱ 0 ) 図ロ toggle-read-only コマンドの定義 1 (defun tocle—read—only ( ) 2 3 4 5 6 ー 51 田 lge whether this buffer is visiting its file read—only. ( interact ive ) (setq buffer—read—only (not buffer—read—only) ) (set—buffer—modified-p (buffer—modified—p) ) ) Force mode—l ine redxsplay M-x revert-buffer を実行してみましよう。これは、それまでの変更をすつば り捨てて、ディスク上のファイルを読みなおすコマンドで す。おそらく、図 14 のように本当にもとに戻しても (revert) よいのか確認を求められるでしようから、 yes と 答えてください。 ただし、 revert-buffer コマンドにはオートセープ機能 に絡んだちょっとした落し穴があります。オートセープが 有効なときにこのコマンドを実行すると、図 14 のメッセ ージに続けてオートセープ・ファイルを利用するかどうか を訊ねられます ( 図 15 ) 。このとき、ついつい y と答えてし まうと、再度、、本当に悔いはないのか〃と確認を求められ ます ( 図 16 ) 。ここで yes と答えてしまうと、もとのファイ ルではなくオートセープしたファイルを読み込もうとする ので、当初の目的である、 間違っておこなった変更を無効にする から外れてしまいます。 そのうえ、オートセープ先のファイル名がもとのファイ ル名と同しだったりしたら 6 、事態はいっそうややこしくな ってしまいます。 もっとも、この状態を逆手にとって積極的にオートセー 6 さっそく復習ですね。 auto-save-visited-file-name 変数が t の場合に、オート セープ先のファイル名はもとのファイル名と同しになリます。 UNIX MAGAZINE 1991.9 プしたファイルを読みなおすのもいいでしよう。 コマンドを解析するには さて、今回もいくつか新しいコマンドを紹介しましたが、 これからもどんどん出会うにちがいないニューフェイスの 動作を知るにはどうすれはいいのでしようか。 toggle-read-only コマンドを例にとって、新しいコマ ンドの解析手順を追ってみましよう。もちろん、この方法 には私の、、偏見〃が入っているので、あなたに適している かどうかは分かりませんが toggle-read-only コマンドは、 files. el で定義されて います ( 図 17 ) 。 6 行ほどのごく短いプログラムなので、ち ょっと読んでみましよう。 1 ~ 2 行目は関数定義の決まり文旬です。 1 行目で関数 名が toggle-read-only だと宣言し、 2 行目はこの関数の ドキュメントになっています。 3 行目は、 「この関数はユーサーがコマンドとして呼び出せるよ」 という宣言だと思ってください。 4 ~ 6 行目が関数の本体ですが、 4 行目の、 (setq buffer—read—only は変数 buffer-read-only に いういつもの式ですね。 . 〃以下の値を設定すると 125
emacs 入門 図 22 Em acs Lisp のリファレンス・マニュアルのメー * LispRef : (). /local/info/lispref) . 図 23 LispRef を選択したときに表示される画面 (lnfo Na ロ、ト - Top - ー卩 JJ ー」 - Emacs Lisp Reference Manua1. ーユー項目 ile: lispref N0de: Top, Prev: (dir), Up: (dir)' Next: lntroduction 国 This lnfo file documents GNU Emacs Lisp ・ む一Ⅱ 1 n f 0 . (lzgprefVIop ☆ Evaluation: ☆ Control Structures : MacrOS : ☆ Funct ions : ☆ Variables: ☆ Symb01s: ☆ Sequences Arrays Vectors : ☆ Lists: ☆ Strings and Characters: ☆ Numbers: ☆ Types 0f Lisp Object: ☆ lntroduction: ☆ Menu: ☆ らあなたのサイトではリファレンス・マニュアルがインス トールされていません。システム管理者に訊ねてみてくだ 0 このメニューを選択します。 メニューを選択するには、メ 運よくリファレンス・マニュアルが見つかったら、次は 図 24 Buffers を選択したときに表示される画面 ile: lispref N0de: Buffers, Prev: Backups and AutO Saving, Up: TOP, Next: Win\ Buffers ☆☆☆☆☆☆☆ A "buffer" is a Lisp object containing characters. Buffers are used tO hold the contents of files when they are visited, but buffers need not have an associated file. While several buffers may exist at one time, exactly one buffer is designated the "current buffer" Most editing comands act on the contents Of the current buffer. Each buffer, including the current buffer, may 0 「 may not be displayed in a Wi ndOW. ☆ Menu: ☆ Buffer Basics : ☆ Buffer Names: ☆ Buffer File Name: ☆ Buffer Contents: ☆ Buffer Modification: ☆ Modification Time . ( い司比 f 第 司ーー % Ⅵ nf 0 : ( I n fo tla ロ - ow ) - - 1 0 p ー -IJJJ- 」一 ニュー (menu) の、 を入力し、 Menu item といわれたらすかさす、 ま入力してください。 Menu item : LispRef さきほどのメニュー項目をそのま これで、図 23 のようなドキュメントが表示されます。 キーポードを打つのがちょっと苦手という人は、メニュ 128 で移動しておいて、 (C-p) 、 1 ー X prevlous—line や、 (C-n) M-x next-line 一項目の行まで、 図 25 Buffer Modification を選択したときに表示される画面 ile: lispref N0de: Buffer M0dification, Prev: Buffer Contents, Up: Buffers, N\ Major Line lnformation: : ) , and controls saving (*N0te Saving Buffers: : ) changes. The flag value is normally indicated in the mode line (*N0te you save the buffer. Thus , the fl ag ind i cates whether there are unsaved set い、い whenever you alter the contents, and cleared セ 0 、 nil' when record whether you have changed the text Of the buffer. This flag is Emacs keeps a flag called the "modified flag fO 「 each buffer, tO Buffer Modification ext: Modification Time (11Spref)Buffer M0diflC ・ 3い0n Menu item (default LispRef) : と入力すれば、 This function returns 、セ′ if the buffer has ☆ Function : buffer-modi fied-p &optiona 1 BUFFER not match the new visited file . unchanged since some other fiLe was visited in the buffer, the text does even 、 set-visited-file-name ・ sets the flag セ 0 、い Lisp programs also the flag explicitly. The Lisp function and auto-saving (*NOte Aut0 Saving: : ) ・ ( ⅱ 1f0 物ロ - ow トー To に一 [ JJ 、ト been modified since if the text is たとえば、 buffer-modified-p 関数の動作を知りたいと いいでしよう。 いので、時間があるときにひととおり眺めておいたほうが どの項目が目的のメニューかを判断するのはけっこう難し ません。またまた、メニューが並んでいます。このなかで、 でも、これだけではまだマニュアルの本体にたどり着け い。やはり図 23 の画面が表示されます。 と表示されるので、そのままリターンキーを押してくださ UNIX MAGAZINE 1991.9 * Buffers: ということで、 バッフアに関係がありそうだから きには、
emacs 入門 「おやおや、何かいわれたぞ。なになに・ AutO save iS newer; consider M—X recover—file どうやら、 recover-file を実行しろといわれているよう です。では、 Nemacs さんの仰せのとおり、 M—X recover—file -/osyougatsu Recover file : と実行してみましよう ( 図 1 ) 。今度は、 yes か no を選べと いわれたようです。そこで yes を選ぶと・・ 、あらま不思 議、もとのファイルが復活しちゃいました。 しつは、 UNIX の標準工デイタⅵにも同しような機能 があります。同様な状況でファイルを失ってしまったとき には、図 2 のようなメールが自動的に届き、、、失ったメール 「処理を続けるつもりならリターンキーを叩け」 を実行してみましよう。 % Vi osyougatsu. roma さっそく、指示に従って、 が取り戻せるよ〃と知らせてくれます。 図ー M-x recover-file でファイルを復活させた状態 —NEmacs : osyougatsu /homeia: 、 a/osyougatsu not ound (Fundamental)--Åll--C-JJ-]- 116 Jul 8 1991 /home/ar 、 a/#osyougatsu# (Fundamental)--Åll- : ・」 lr を CtO 「 y ・ Recover autO save file /home/ara/#osyougatsu#? (yes or no) 図 2 vi で編集中に計算機が落ちた場合に届くメール You were editing the file "osyougatsu. roma' at く Mo Ⅱ Ju1 1 00 : 00 > 0 取 the machine " host' when the editor was killed. といわれました ( 図 3 ) 。はいはい仰せのままに、とリター ンキーを叩けばご覧のとおり。あっという間にファイルが もとどおり ( 図 4 ) 。 では、ⅵはいったいどんな魔法を使ってファイルを復活 するのでしよう。大まかな仕組みは同しなのですが、ディ レクトリ名やコマンド名は計算機の種類や OS によって 異なるので、 SunOS 4.0.3 を例にとって説明しましよう。 図 5 を見てください。ⅵコマンドは / tmp ディレクトリ 図 3 vi -r でメッセージか表示された状態 "osyougatsu. roma" 4 116 characters i yoh kyou koso tanosi kere kadomatsu hi kkur i kaes i te oosawagi zouni tabesugi nOdO tsumarl no hajimeno tamesi tOte 図 4 vi ゴでファイルをリカバーした状態 [Hit return t.o continue] osyougatsu. roma" [Dated: Mon Jul 8 17 : 01 : 26 ] You can retrieve most Of your changes tO th1S file using the "recover" command Of the editor. An easy way tO dO this is tO give the command ¯r osyougatsu. roma' This method a1S0 works usmg "ex't and "edit". UNIX MAGAZINE 1991.9 119
LJN Ⅸ流プログラミング 11 用してコマンドをカスタマイズする準備か整いました。 ている部分です。この部分では、 fopen の結果によって 分岐しています。 fopen は、指定されたファイルがオー さっそく、例題プログラムの作成にとりかかりましょ プンできなかったときには NULL を返します。この値 う。さきはど getchar() を使うと書きましたが、実際に は fopen() を利用してファイルポインタを使い、ファイ が NULL であれば、ファイルがオープンできなかった ことを示して、次のファイルの処理に移ります。この段 ルの内容にアクセスすることになりますから、正確には 階でコマンド自身を終了してしまってもよいのですが、 getc() を使うことになります。 今回は終了せすに次のファイルを出力するようにしてみ このプログラムは、基本的には前号でお話ししたシェ ました。出力に標準工ラー出力を使う点についても、す ルを用いたプログラムと似たものになります。注意しな でにお話ししましたね。さもないと、作成した cat コマ ければならないのは、シェルでは行単位の処理が簡単に ンドからの出力にこのエラー出力が交しってしまうので おこなえましたが、 C 言語で書くときは行単位の処理は 注意してください。 難しいという点です。今回は、設定のためのオプション は各行に書かれた文字ですから、無理に行単位で処理せ すに文字単位で処理することにしましよう。 したがって、プログラムは指定されたファイルのな かに書かれた文字を順に読み込み、書かれている文字に 対応する変数を設定することになります。 オプションファイルの読込み C 言語でファイルの内容を読み込む方法は、お分か りいただけたでしようか。これで、ファイルの内容を利 1 #include く stdio . れ> 2 3 #define MAXLEN 256 4 5 main() 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 2 2 2 3 24 25 26 27 28 29 30 0 0 0 int int int *fp; buf CMAXLEN] ; *ptr ; ch; FILE char char int if ( (ptr = getenv("HOME") ) = = NULL) { fprintf (stderr , "Can ' t get HOME environment variable\n" ) ; exit(l) ; strcpy(buf, ptr) ; strcat(buf , "/. test—file") ; if ((fp = fopen(buf, "r")) = = NULL) { , buf ) ; fprintf (stderr, "Can't open file %s\n" exit(l); ((ch = getc(fp)) ! = EOF) { while switch (ch) { case a = 1 ; 137 UNIX MAGAZINE 1991.9
こで、今回はいきなり C 言語でのファイルの読込み方 法から入ることにします。とはいっても、この方法に 関しては連載の開始当初にも触れています。そのときに 使ったのは、 ・ 1990 年 11 月号 : getchar() による読込み ・ 1990 年 12 月号 : gets() や fgets() による読込み でした。 ます、 getchar() を使って前回と同様なプログラムを 作成してみましよう。読み込むファイルはホームディレ クトリの . test-file で、その内容は、オプションを設定 するための a から c までの文字が 1 行に 1 文字すっ書 かれている数行のものです。 ところで、標準入力以外のファイルの読込み方法に ついてはまだ何もお話ししていませんでしたね。今回 は、この説明から始めましよう。 ファイルのオープン C 言語でファイルを読み込む場合には、 ( 標準入力の ときは不要だった ) ファイルのオープンという操作が必 要になります。いったんファイルをオープンするとそ のファイルを示すものが返され、以降はその返されたも のを使ってそのファイルか躱作できるのです。これに は、 fopen という関数を利用します。この関数をオンラ イン・マニュアルで調べてみると、 #include く stdio . h> DZ—X 流プログラミング 今泉貴史 前回は、ファイルを利用してカスタマイズするコマン FILE *fopen(filename, type) ドを B シェルや C シェルを使って書いてみました。最 char *filename , *type ; 後に触れましたが、実際にはこのようにファイルを利用 してカスタマイズしているシェル・プログラムははとん と出てきます。これはマニュアルの SYNOPSIS の部 どなく、たいていは C 言語を使って作成されています。 分に出ているものですが、意味を簡単に紹介しておきま しよう。 今回も、前回に引き続きファイルを利用してカスタ ます、この関数 (fopen) を使うためには stdio. h と マイズするコマンドについてお話ししますが、今度は C いうインクルードファイルを読み込んでおく必要があり 言語を使うとどうなるかに重点をおいて説明します。 ます。この関数の戻り値は FILE 型へのポインタであ り、引数としては文字へのポインタ型 ( つまり文字列 ) C 言語でのファイルの読込み を 2 つ渡します。最初の引数は、その名前が示すとおり 処理対象のファイルのファイル名 ( パス名 ) です。問題 カスタマイズ用のファイル名や複数のファイルを使 は 2 つ目の引数です。 うときの優先順位については、すでに説明しました。そ 134 UNIX MAGAZINE 1991.9
LJN Ⅸ流プログラミング 11 たファイルポインタに対して getc を繰り返し呼び出し 外の文字からなる文字列を意味しています。つまり 2 つ 目の引数には、 = の直後から改行文字の直前までが代入 ます。 されます。 工ラーを判定する場所はもう 1 カ所あります。 2 つ目 さきほど、 fscanf の戻り値は変換できた引数の数だ の引数に代入された値が on か。仕かを検査する部分で と述べましたが、入力が終了した場合には EOF を返し す。 2 つ目の引数に代入された値がこれらの文字列でな ます。この値をループの終了条件として使うことも忘れ いのならは、エラーである旨を表示して次の行の処理に てはいけません。これで、行単位の処理ができるように 移らなければなりません。 なりました。次はエラーを検出するガ去です。 残りの部分は、さきほどのプログラムとよく似た手 工ラーの検出は、 fscanf が返す値にもとづいておこ 順になります。最初にオフションの設定か書かれたファ こでは 2 つの引数を指定していますから、 ないます。 イルをオープンするための処理、それぞれの文字に対応 2 以外の値 ( つまり 0 や 1 。 EOF は特別 ) が返された ら入力行にエラーがあると判定するのです。その場合、 するオプションを設定したり解除したりする処理、オー プンしたファイルをクローズする処理、それぞれのオフ その行のなかでまだ fscanf か第売み込んでいない入力が ションの値を出力する処理などをおこないます。最終的 あるはすですから、それを読み飛はさなけれはなりませ ん。それには、改行文字か EOF がくるまで指定され には、次のようになります。 #include く stdio . h> ・ 1 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 #define MAXLEN 256 0 0 0 int i nt int *fp; buf [MAXLEN] ; *ptr ; ch ; retval , tmpval ; line = 0 ; FILE Char Char char int int if ( (ptr = getenv("HOME") ) = = NULL) { fprintf (stderr , "Can ' t get HOME environment variable\n" ) ; exit(l); strcpy(buf , ptr) ; strcat(buf, "/ . test_file") ; if ((fp = fopen(buf, "r")) = NULL) { fprintf(stderr, "Can't open file %s\n" , buf); exit(l); / * main 100P * / fscanf(fp, "set %c while ( (retval 取十十・ if (retval ! = 2 ) { &ch, buf)) ! = EOF) { 140 UNIX MAGAZINE 1991.9