SlideShare a Scribd company logo
詳解UNIXプログラミング

 5. 標準入出力ライブラリ
概要

標準入出力ライブラリはANSI C規格

バッファの割付や最適な大きさでの入出力操
作などの詳細を扱う

1975年にデニス・リッチーが作成したのが起源
ストリーム
標準入出力ライブラリではファイルのオープン
をファイルにストリームを結びつけるという

ストリームをオープンするとfopenはFILEオブ
ジェクトへのポインタを返す

FILEオブジェクトは実際のfiledes,バッファへ
のポインタやサイズを含むが、個々のアプリ
ケーションがオブジェクトを調べる必要はない
標準IO,エラー出力

3つのストリームがあらかじめ定義されている

<stdio.h>ではstdin,stdout,stderrのファイルポ
インタで3つのストリームを参照できる

STDIN_FILENOなどは<unistd.h>で定義され
た記号定数(数値)であるから区別すること
バッファリング(1)
バッファリングの目的はread,writeの呼び出し
回数最小化

バッファリングは(a)完全なバッファリング(b)
行バッファリング(c)アンバッファド の3つ

(a)はバッファが満杯になったときにflush(書き
出し)される

(b)は改行文字に出会うたびにflush cf)標準IO

(c)は標準エラー出力のような、可能な限り速
く表示したいときに用いる。
バッファリング(2)
ANSI Cでは(1)標準入力/出力が対話的な装置
を指さない限り、完全なバッファリングを使用
(2)標準エラー出力で完全なバッファリングを
行うことはない

SVR4と4.3+BSDでは(1)標準エラー出力は常に
アンバッファド(2)他のすべてのストリームは
端末装置を指す場合は行バッファリング、そう
でなければ完全なバッファリング
ストリームのオープン
FILE *fopen(const char *pathname, const char *type);
FILE *freopen(const char *pathname, const char
*type, FILE *fp);
FILE *fdopen(int filedes, const char *type);

   fopen 指定したファイルをオープンする

   freopen ストリームを指定し、既にオープンさ
   れていたらそれをクローズしてからファイルを
   オープン

   fdopen open,dup,pipeなどで取得したfiledesを
   受け取り、それを標準入出力ストリームへ結
   びつける
文字単位の入力関数
int getc(FILE *fp);
int fgetc(FILE *fp);
int getchar(void);


 全て一度に1文字ずつ読取る

 これらはエラー時もファイルの終わりでも同じ
 値を返すので区別するにはferrorかfeofを使う
文字単位の出力関数
int putc(int c, FILE *fp);
int fputc(int c, FILE *fp);
int putchar(int c);

  getchar <=> getc(stdin)と同様、
  putchar<=>putc(stdin)

  getc,putcはマクロでfgetc,fputcは関数=>関数だ
  とアドレスがとれるので別の関数の引数にでき
  る
行単位の入出力
char *fgets(char *buf, int n, FILE *fp);
char *gets(char *buf);
int fputs(const char *str, FILE *fp);
int puts(const char *str);
 fgetsはバッファサイズnも指定する

 getsはバッファサイズを指定できないので有名
 なセキュリティホールが存在

 fgetsとfputsを使えば改行文字を意識しないで
 済む
ストリームの位置決め


標準入出力ストリームを位置決めするには
1.ftellとfseek 2.fgetposとfsetposの2つの方法
がある=>基本的にfgetposとfsetposを使う
書式付き出力
int printf(const char *format, ....);
int fprintf(FILE *fp, const char *format, ...);
int sprintf(char *buf, const char *format, ...);

   printfは標準出力に書き込む

   fprintfは指定したストリームに書き込む

   sprintfは書式付けした結果を配列bufに収める
記述子の取得
int fileno(FILE *fp);


   filenoを呼び出すとストリームの記述子を取得
   できる
一時ファイル
char *tmpnam(char *ptr);
FILE *tmpfile(void);


   tmpnamは既存のファイル名とは異なる正当な
   パス名となる文字列を生成する

   tmpfileはプログラム終了時に自動的に削除さ
   れる一時的なバイナリファイルを作成

More Related Content

KEY
PDF
Library login2
PPTX
Kotohata profile
KEY
詳解UNIXプログラミング 第4章 ファイルとディレクトリ
KEY
KEY
PDF
32 Ways a Digital Marketing Consultant Can Help Grow Your Business
Library login2
Kotohata profile
詳解UNIXプログラミング 第4章 ファイルとディレクトリ
32 Ways a Digital Marketing Consultant Can Help Grow Your Business
Ad

Unix5

Editor's Notes