77 イ 3 " サウンドグラフィックス”とディスクス出力 3.3.2 ファイルへ出力 ここではファイルに書き込むのですから , モ 示すモード "r" を指定しました . ドのことを思い出してください . 入力のときは , 人力用にオープンすることを は同じですが , 入力用にオープンしたときに f 叩 en の第 2 引数に指定したモー 出力用にファイルをオープンするには , 関数 fopen を使います . ここまで ・ファイルのオープン ですが書き込みゆえの注意点がいくつかあります . イルに出力する方法を説明します . ファイルへの出力も , 人力と手順は同じ ファイルからデータを入力する方法が分かったところで , 次にデータをファ ードは早の代りに " w " を使います . fp 出力用にオープンすることを示す fopen いし es し " 0 オープン時のエラーチェック を第 2 引数のファイルに出力します . ことができます . fputc は fgetc の反対 , つまり第 1 引数に指定された 1 文字 オープンに成功したら , 次の関数などを使ってデータをファイルに出力する ・テータの出力 オープンに成功したときの処理 return 1 : オープンに失敗したときの処理 if ( ! ()p = fopen("test" いる場合などでエラーになるからです . は , すでにそのファイルが存在し , かっそのファイルが書き込み禁止になって プン時のエラーチェックを行わなくてもよいわけではありません . 出力の場合 ーにはなりません . 新規ファイルとしてファイルを作成します . しかし , オー 出力の場合は入力と違って , 指定したファイルが存在しないときでもエラ
3.4 サンプレプログラム 79 print f ( " ファイルをオープンできません¥ n " 房 プリンタ 787 #include main(int int F 工 LE <stdio . h> argc ′ char *argv [ ] ) C : *pp, *fp; 土 f 土 f 土 f ( argc く 2 ) { printf( ・ 'pr failename[ret] YaYn' ・ ) : い ( fp = fopen ( argv [ 1 ], return 1 ー printf ( " プリンタをオープンできません¥ n " ) : ( ! ()p = fopen("prn" return 1 : return 1 : while ((c fgetc(fp) ) fput c ( c ′ pp ) : fclose(pp); fclose(fp) : return 0 : EOF ) 次にこのプログラムの実行ファイル名を pr として , 実行例を示します . 実行例 A>pr A>pr sample . c pr failename [ret] ・ ・・・ファイル名を指定しないと使い方か表示される ・・ samp c の内容がプリンタに出力される
770 3 " サウンド & グラフィックス " とディスクス出力 ディスクファイル ければなりません . ファイルをオープンするには , 標準関数の f 叩 en を使いま ファイルからデータを読み込むには , 入力用にそのファイルをオープンしな ・ファイルのオープン ファイルをクローズ ↓ テータを入力 ↓ ファイルを入力用にオープン 単にその手順だけを説明すると , 次のようになります . 最初にまず , ファイルからデータを入力する場合について説明します . 簡 は , プログラムが若干異なります . ファイルからデータを入力する場合と , ファイルにデータを出力する場合で くは , このファイルの入出力について説明していきます . するのは , データベースなどのプログラムには欠かせません . 本節以降しばら ファイルからデータを読み込んだり , またファイルにデータを書き込んだり 3.3.1 ファイルからスカ す . 次に f 叩 en のヘッダを見てみます . F 工 LE *fopen (char *filename ′ char *mode) これを見てわかるように , fopen は FILE 型のポインタを返します . FILE 型
ノ 8 3 " サウンド & グラフィックス”とディスクス出力 3.4.2 プリンタ出力ー幻 前節で説明したように , stdprn を使ってプリンタに出力する場合は■¥ r' と洋で改行しなければなりません . 改行に洋 r' と洋の 2 つを指定しな ければならないのは , stdprn がバイナリモードでオープンされているからです . このため■¥を洋 r' と洋 n' の 2 つに変換するというサービスが行われない 指定します . また , オープンモードとして "w" の他に , テキストモードを示す プリンタ用のファイルをオープンするには , fopen でファイル名に " prn " を ば , 洋だけで改行できます . 逆にいえば , 自分でプリンタ用のファイルをテキストモードでオープンすれ のです . pp = fopen ("prn" F 工 LE *pp; "t" も指定します . を : 関数 utc は , 1 文字単位で出力させることができます . fputc ( 出力文字 , ファイルポインタ ) : #include く stdio . ね> タへの出力には , 次の関数を使っています . するプログラムです ( コマンドライン引数については , 2. 8 節参照 ) . プリン 次は , コマンドラインの第 2 引数で指定されたファイルを , プリンタに出力
33 ディスクファイル ノヾイナリモードで入出力すれば , 上記のようなサービスは行われません . なお , テキストモード / バイナリモードとテキストファイル / バイナリファ イルとは直接関係ありませんが , テキストモードはテキストファイルを入出力 するのに適していますし , バイナリモードはバイナリファイルを入出力するの に適しています . ・ファイルのオープン 出力用にファイルをオープンしますが , これは前節と同様に f 叩 en 関数を 使います . ただし , 第 2 引数の文字列にバイナリモードを意味する b を含め ファイルをハイナリモートの出力用にオープン fp = fopen ( ”し es し” F 工 LE * fp; ます . ・オープン時のエラーチェック ファイルオープン時のエラーチェックも同様に行います . には , if ・テータの出力 オープンに成功したときの処理 re turn 1 : オープンに失敗したときの処理 ( ! ()p = fopen("test" fputc ではなく , fwrite という標準関数の方が適しています . この関数 オープンに成功したらデータの出力を行います . 構造体データを出力する fwrite(&p. sizeof(struct person) , 1. (p) : を使えば , 構造体データを一度に出力できます . 出力テータのアトレス ァータのサイズ テータの個数 出力するファイルポインタ ノ 79
3.3 ディスクファイル とは , ヘッダファイル stdio. h の中で定義されている構造体です ( つまり , f 叩 en を使うときは stdio. h をインクルードします ). そこでまず f 叩 en の戻り値を格納するための FILE 型のポインタを用意します . fp = fopen( " test " 入力用にオ - プンすることを示すモード オープンするファイル名 ( 1 ) て用意したポインタ 次に f 叩 en 関数を使ってファイルをオープンします . F 工 LE *fp; す ( 1.7.2 節参照 ) . うです ) を返します . そこで , 次のようにエラーをチェックすることができま f 叩 en は , オープンに失敗すると , NULL ( ポインタ版の 0 と思ってけっこ クするようにします . まいます . そこで , ファイルオープンしたら , うまくオープンできたかチェッ ンに失敗したファイルからデータを読み込もうとするなどの不都合が生じてし イルのオープンに失敗することがあります . それを見過ごしていると , オープ ファイルをオープンする際に , 指定したファイルが見つからないなど , ファ 0 オープン時のエラーチェック はなく , ファイルポインタのゆを使って指定します . タが格納されます . この後オープンしたファイルは , test というファイル名で これでファイル test はオープンされ , ポインタゆに test のファイルポイン 7 刀 if ( ! ()p = fopen("test" オープンに失敗したときの処理 return 1 : ・エラーのときは 0 より大きい値で処理を 終了させることが多い オープンに成功したときの処理
292 戻り値成功 = ファイルポインタ 戻り値成功 = 出力した文字数 . fopen 書式 FILE *fopen(c 〇月S亡 char *filename, ヘッダファイルく s セ d 土 0. h > 機能ストリームをオープンする . 工ラーまたはファイルの終わりに達していれは NULL 戻り値成功 = 入力した文字列 (<string>) へのポインタ 書式 char *fgets(char *s, ゴ n に月 , FILE *stream) 冫 ヘッダファイル <stdio . h> 機能ストリームから文字列を入力する . fg ets 工ラーまたはファイルの終わりに達していれは EOF 戻り値成功 = 入力した文字 書式月し fgetchar( v 〇 (d) : ヘッダファイ丿レ <stdio . h> 機能標準入力 (stdin) から 1 文字入力する . fgetchar 工ラーまたはファイルの終わりに達していれは EOF 戻り値成功 = 入力した文字 書式月と fgetc (FILE *stream); ヘッダファイルく stdio . h> 機能ストリームから 1 文字を入力する . fgetc 付録 c 〇月 s 亡 char *m 〇 de); NULL 失敗 = fprintf 機能書式付き文字列をストリームへ出力する . ヘッダファイルく s む d 土 0. h > 書式 n し fprintf(FILE *stream, c 〇月 s と char *format 孱 EOF ストリームへ 1 文字を出力する . fp utC 失敗 = argumen 亡 / 機能 ヘッタ、ファイル 書式 戻り値 <stdio . h> 失敗 = EOF 成功 = 出力した文字く C> 弖月し fputc(int c, FILE *stream);
サンプルプログラム 77 #include <stdio . h> #def ine F 工 LENAME struct Person { char name [20 ] : 土 n し age : main() F 工 LE *fp; " し e s セ " 33 ディスクファイル / * 名前 * / / * 年齢 * / struct Person p; if ( ! ()p = fopen(F 工 LENAME, printf ( " ファイルをクローズできません Y n " ) : if (fclose(fp)) { fread(&p, sizeof(struct Person) , 1 , (p) : return 1 : print f ( " ファイルをオープンできません Y n " ) : return 1 ー else { printf("%sYn%dYn" return 0 : 実行例 A>samp1e Mt . Fuji 3 7 7 6 p . name ′ P ・ age ) :
33 EOF ) 土 f ( fc 10 s e ( fp ) ) { putchar(c) : fgetc(fp) ) while ((c return 1 : printf いファイルをオープンできません Yn " ) : 土 f ( ! ( fp = fopen ( " test " F 工 LE *fp; int c; main() #include く s d 土 0 . h > サンプルプログラム 74 工 am 15 years 01d . My name is Taro Yamamoto . A>samp1e 工 am 15 years 01d . My name iS Taro Yamamoto . A>type test 実行例 return 0 : return 1 : printf ( " ファイルをクローズできません Yn " 房 サンプルプロクラム 74 を実行 ファイル " tes ドの内容を確認 ティスクファイル
ノ 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 から , データを入力するプロ グラムを示します .