2 プログラミングの定石 main ( ) char select; select = get—charset(" よろしいですか (Y/N) ? " printf("%c が選択されました Yn", select); re turn 0 : 実行例 よろしいですか (Y/N) ・・不正な入力 ( ベルが嗚る ) ? Q よろしいですか (Y/N) これも不正な入力 ( ベルか嗚る ) ? W よろしいですか (Y/N) ・・正しい入力 ? Y Y が選択されました ・入力された文字を示す get-charset の主要部分は , 大きな for ループになっています . for ( ; ; ) は , 初期設定や条件などを何も指定していません . for 文でこう書くと無限ループに なり , re ⅲ rn 文などでループを抜ける指示をしない限り , ループを繰り返します . 全体の構成は , 次のようになります . for プロンプトを出力 1 文字入力 if ( 正しい入力 ) return 入力された文字 : ベルを鳴らす else getche はキーポードから 1 文字人力する関数で , ヘッダファイルく conio. h > が必要です . strchr は第 1 引数の文字列の中に第 2 引数の文字が入っている かを調べ , 入っていればその文字のポインタを返し ( 真 ) , なければ 0 を返しま す ( 偽 ) . strchr は , ヘッダファイル <String. h> が必要です . つまり , 正しい人力が行われていればその文字を返し , 不正な文字が人力 されていればベルをならし再度入力を求めています . 少し複雑な気もします力 : , 実際に自分で入力して動きを確かめてみるとよ いでしよう .
22 安全な文字列のスカ gets ( s ) : printf(" データ ? " char s [ 4 受け取るバッフアを破壊する恐れがあります . たとえば 1.6.1 節で説明した文字列を入力する関数 gets を単純に使うと , 文字列を 安全な文字列のスカ 列を納めるバッファ s は , 4 文字分あります . 文字列の最後には洋びが入り のようにして s にキーポードから文字列を入力したとします . この場合 , 文字 もし 4 文字以上入力したらどうなるでしよう ? バッフアを破壊し , ますので , 入力可能な文字数は 3 文字分です . しかし , 大事なデータを壊してしまうこともあります . 723 s [ 0 ] s[2] s [ 3 ] 大事なテータが→ 入っている 可生もある char buf[6]; のような文字配列を用意し , 4 文字以上入力すると こ窈ろにも代入 されてしまい 元から入っている テータを壊してしまう このように , gets は入力 文字数を指定できないた め , バッフアを破壊する危 険を伴います . しかし , gets の入力文字数を指定 する関数はないので , 安全 に文字列を入力するための get-str という関数を作っ てみます . これは , 指定した文字数 だけ入力する関数です . た とえば , 5 文字までの文字 列を入力したければ , 最後 の洋びを含めて
実行例 A>samp1e Here are some . You may perform the program. A>type test Here some guidelines . You may perform the program . 3.3.3 造体データの出力 3.3 ディスクファイル ・・適当にキーホードから入力 ・・・入力の最後は CTRL-Z ・・ファイルか作成されたか調べる ハイナリモード ここまでで , ファイルへの入出力についての基本は終りです . 本節では , その応用として , 1. 11 節で説明した構造体などの特殊なデータを , ファイル に出力する場合を説明していきます . なお , 構造体データを出力させたファ イルを使って入力方法を説明しますので , 人力より先に出力を説明します . たとえば , 次のような構造体があったとします . struct Person { char name [ 20 ] : 土れに age : struct Person p; ・・構造体の定義 ・・ struct Pe 「 son 型の変数を盲 こういった構造体データをファイルに出力する方法を考えます . 構造体デ ータといっても , その出力手順は , 通常のデータ出力と同じです . ↓ 構造体テータを出力 ファイルを出力用にオープン ↓ ファイルをクローズ ただし , 構造体データを入出力する場合 , 通常はテキストファイルではな
ノ 2 イ 2 プログラミングの定石 get—str(buf, 5 房 のように入力可能文字数を第 2 引数に指定して呼び出します . これで , ザーが何文字入力しても , 最初の 5 文字だけが buf に入力されます . get-str の定義を次に示します . コ、一 VOid get—str(char *s, char te Ⅲ p [ 129 島 gets (temp) : strncpy(), temp, s [ s 土 z e ] 土 n し size) Size) ー MS-DOS でキーポードから入力可能な最大文字数は 128 文字です . め , 128 + 洋びで配列には 129 文字分指定します . char te Ⅲ p [ 129 レ そのた そして , gets で temp に人力します . 次に , 先頭から指定文字数だけ s に コピーします . このとき使っている strncpy は , 1. 5. 3 節の strcpy に文字数 を指定できるようにしたものです . strncpy(), temp, size); strncpy は , 最大 size 文字分の文字列を temp から s にコピーします . もし temp が size 以上の場合は , size 分の文字列をコピーしてしまうので , s の最 後には洋 0 が入りません . そこで , どの場合でも s を文字列として使えるよ get—str は strncpy を使っているので <String. h> をインクルードします . s[size] うにするため , 次の 1 行が必要になります .
27 イ 付録 Ⅲ朝ィい CÖ「叩らや 9 ProjéÖt ions F Ⅱ Edi t S を引℃ h n 掴、材正囲 . C ttirclude く stdio. h> printf( printf( return 9 : ロ Save Editor FiIe Save Ed は 0 「 File As 第 : \ T 日や判 0 料正øø. F il es ↓ す翻モ 2.0 ツ第 12 い山し 19 , 18 小 2 : 45E FI ー Enter の「 ectO 「リ path and file mask NONAMEOO. C のままでよければ , リターンキーを入力しますが , 本書で は , neko. c に名前を変えてセープします . : お 9 : キーで NONAMEOO. C を消 し , neko. c を入力 , リターンキーを人力します . これで入力したデータは , neko. c としてセープされます . * C のプロクラムは , 拡張子を℃にします . 5 工デイタの使い方 本節では , TC でプログラムを入力したり , 編集するときに使うエデイタに ついて説明します . ただし , カーソルの移動など本当に基礎的な操作しか説 明しません . 全機能を説明していると , 膨大な量になってしまうからです . 詳細は , TurboC + + のマニュアルを参照してください . ・カーソルの移動 ←キーを入力します . 反対に 1 文 1 文字左へカーソルを移動させるなら , 字右へカーソルを移動させるなら , キーを入力します . 同じように , 1 行 上はキー , 1 行下はすキーを入力します . また一気にカーソルを移動させることもできます . 行の先頭へカーソルを移 動させるなら , CTRC 十 Q を人力した後に , S キーを入力します . 行の終り へ移動させるなら , ℃ TRC 十 Q を入力した後に , D キーを人力します .
十十 ゞ 23 uP ・ Step. スリーム〃 0 C 自身は , 入出力機能を持っていません . 入出力を行うためには , C を使って入出力用の プログラムを書かなけれはなりません . 入出力用のプロクラムをいちいちユーサーが書いていては大変なので , c には標準の入出 カライプラリが付属しています . c の標準入出力機能を使うには , stdio. h を include する必 要があります . C の拡張言語である C + + も , また入出力機能を持っていません . そこで , C + + も C と同様 , C + + を使って書かれた入出力ライプラリカイ寸属しています . それが , ストリーム I/O です . ス トリーム I/O を使うには , iostream. h を include する必要があります . こで , sample8. c を c + + で書き換えたリストを示します . これを使って C と C + + のプロ グラムの違い , とりわけ入出力機能についてその違いを説明します . / / samp1e8 . cpp ーー挨拶をするプログラム #include く iostream . h> main() / / 改行させるときは¥れを使う ”我が輩は猫である¥ n " ・ cout くく " 名前はまだない¥ n " cout くく return 0; / / 適当に空白行を使うと / / プログラムが読みやすくなる ・コメント C + + のコメントは , 〃で始めます . 〃から行末までがコメントになります . C のたソと違 い , 複数行にまたがるコメントを書くことはできません . 逆にコメントを 1 行に制限したため , コメントの終端を入力しないで済むという利点があります . 前述の原典によると , C + + のコメントは , C がお手本にした言語 BCPL から取り入れたそ
・データベース 228 4 ァータのスカ 次に , 関数 run の無限ループの中から呼び出している各関数を見ていきま す . これらの関数は , メインメニューの 1 つのコマンドに対応しています . 最初は , " データ入力 " コマンドに対応する data_input です . void data—input (void) print f ( " データ入力 Y n " ) : printf ( " if (is—input ( ) ) input_record ( ) : printf("** 入力不能 **YaYn"),• e 1 S e ・データベースでは , 入力可能なレコード件数を 100 件に制限していま す . したがって , 入力の前にまず人力が可能かどうかをチェックする必要が あります . それを is_input でチェックしています . is_input はデータ管理の仕 事になるので , data. c で定義されています . 入力可能な場合は , 次の input_record でデータを入力します . この関数は , ちょうど構造体のメンバーにデータを入力する練習になっています .
十 2 【実行例】 文字列 ( 最大 7 文字 ) ? 123456789 入力文字列 = 12 3 4 5 6 7 ・ 9 文字入力した ・・しかし , 7 文字しか入力 されていない ・ setw マニピュレータについては , 「ステップアップ 3 」で説明しました . そのマ二ピュレータの 1 つに setw というのがあります . このマニピュレータは , 関数のように引数を取り , 入力する 文字数を指定できます . たとえは c in > > setw ( 8 ) > > s : のように使えは , s には 8 文字までしか入力されません . ただし , 文字列の最後には 洋 0 が入りますので , 実際に入力できるのは 7 文字までです . ・ iomanip. h setw のように引数を取るマニピュレータを使う場合は , iomanip. h というへッダファイルを インクルードする必要があります . 通常は , iomanip. h の中で iostream. h をインクルードしていますので , iomanip. h をイン クルードすれは iostrem. h をインクルードする必要はありません . しかし , 私が使用した Turbo C + + では , そのようになっていませんでした . 両方インクルードする必要があります .
ノ 82 3 " サウンド & グラフィックス " とディスクス出力 3.3.4 造体データのスカ 次に , ファイルから構造体のデータを入力する方法を説明します . ルは , 前節のデータ出力で使った test を使います . 0 ファイルのオープン バイナリモード ファイ ファイルをオープンするには , f 叩 en 関数を使います . 第 2 引数のモードに は , 入力モードの "r" を指定します . さらに , バイナリモードの "b" を指定し ます . fp fopen (F 工 LENABE, 0 データの入力 構造体データの人力には , fwrite に対して fread という関数を使います . fread(&p, sizeof (struct Person), fread の使い方は , fwrite と同じです . データのサイズ テータの個数 入力するファイルポインタ 入力テータのアトレス 次に , 前節で構造体データを出力させた test から , データを入力するプロ グラムを示します .
7.6 いろいろなスカ 0 いろいろなスカ 1.6.1 キーホドからスカー g s 1. 4. 5 節の「理想体重を求めるプログラム」は , 178.0 cm の人専用のプロ グラムでしたが , あいにく身長というのは , 178. Ocm しかないわけではありま せん . その人の身長に合わせてその都度 , プログラムを書き換えなければなら ないのなら , これほど使いにくいプログラムはないでしよう . そこで , キーポードから好きな身長を入力できるようにプログラムに手を加 え , それを使って計算し , プログラムの汎用化をはかります . 本節では , このキーポードからの入力について説明していきます . キーポードから人力した文字を , プログラムの中の変数に取り込むにはど うしたらよいでしよう ? それには gets という関数を使います . この関数は , キーポードから人力し た文字を文字列変数にしまってくれます . gets を使うには , printf と同じように #include <stdio. h> が必要です . 次に , gets を使って身長を入力するプログラムを示します . 57