演習8-3 K&R プログラミング言語C
2010年03月21日
演習8-3
この _flushbuf
と my_putc
だと、fp->cnt
が 0
未満にならずに終了してしまう場合に、どうしてもデータがバッファに残ったまま書き出されない状態になってしまう。
/* _flushbuf : 出力バッファを書き出す * ファイルが書き込み用にオープンされていなければ即座に MY_EOF を返す */ int _flushbuf(int c, MY_FILE *fp) { int bufsize, n_write; unsigned char uc = c; if ((fp->flag&(_WRITE|_EOF|_ERR)) != _WRITE) { return MY_EOF; } if (fp->flag &_UNBUF) { /* バッファを使わない場合 */ n_write = write(fp->fd, &uc, 1); bufsize = 1; } else { if (fp->base == MY_NULL) { /* バッファがまだ未割り当ての場合 */ if ((fp->base = (char *) malloc(MY_BUFSIZ)) == MY_NULL) { return MY_EOF; } fp->ptr = fp->base; *fp->ptr++ = uc; fp->cnt = MY_BUFSIZ - 2; /* 最初の文字分を引く (MY_BUFSIZ - 1 - 1)*/ return 0; } if (fp->ptr) { if (c != MY_EOF) { /* バッファの最後に c を追加する */ *fp->ptr++ = uc; } bufsize = MY_BUFSIZ - fp->cnt - 1; fp->ptr = fp->base; fp->cnt = MY_BUFSIZ - 1; n_write = write(fp->fd, fp->base, bufsize); /* バッファを書き出す */ } } if (n_write != bufsize) { fp->flag |= _ERR; return MY_EOF; } return uc; } /* バッファに残っているデータを書き出す * 書き込みエラーがあると MY_EOF を返し、それ以外では 0 を返す * my_fflush(MY_NULL) で全てのストリームをはき出す */ int my_fflush(MY_FILE *fp) { int i; if (fp == MY_NULL) { for (i = 0; i< MY_OPEN_MAX; i++) { my_fflush(&_iob[i]); } } else { if ((fp->flag&(_WRITE)) == 0) { return MY_EOF; } _flushbuf(MY_EOF, fp); if (fp->flag & _ERR) { return MY_EOF; } } return 0; } /* まだ書き出されていないデータを my_fflush で書き出し * まだ読み込まれていないデータを破棄して、バッファを解放する * エラーがあると MY_EOF を返し、それ以外では 0 を返す */ int my_fclose(MY_FILE *fp) { if (fp == MY_NULL) { return MY_EOF; } my_fflush(fp); fp->cnt = 0; fp->ptr = MY_NULL; if (fp->base) { free(fp->base); } fp->base = MY_NULL; fp->flag = 0; fp->fd = -1; return 0; }
プログラミング言語C 第2版 ANSI規格準拠
posted with amazlet at 09.11.27
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
共立出版
売り上げランキング: 9726