演習8-3 K&R プログラミング言語C

演習8-3

この _flushbufmy_putc だと、fp->cnt0 未満にならずに終了してしまう場合に、どうしてもデータがバッファに残ったまま書き出されない状態になってしまう。

/* _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規格準拠
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
«
»