名前
fmemopen, open_memstream, open_wmemstream - メモリーをストリームとしてオープンする書式
#include <stdio.h> FILE *fmemopen(void *buf, size_t size, const char *mode); FILE *open_memstream(char **ptr, size_t *sizeloc); #include <wchar.h> FILE *open_wmemstream(wchar_t **ptr, size_t *sizeloc);
glibc 向けの機能検査マクロの要件 ( feature_test_macros(7) 参照):
- glibc 2.10 以降:
- _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
- glibc 2.10 より前:
- _GNU_SOURCE
説明
fmemopen() 関数は、ストリームをオープンし、そのストリームに mode で指定されたアクセス許可を設定する。 そのストリームを通じて、 buf で指定された文字列やメモリーバッファーへの読み書きができる。 このバッファーは少なくとも size バイトの長さでなければならない。 引き数 mode は fopen(3) の場合と同じである。 mode で追記モード (append mode) が指定された場合、ファイル位置の初期値は バッファー中の 最初のヌルバイト ('\0') の位置に設定される。 それ以外の場合は、ファイル位置の初期値はバッファーの先頭になる。 glibc 2.9 以降では、文字 'b' を mode の二番目の文字として指定 することができる。 この文字は「バイナリ」モードを指定するものである。 このモードでは、書き込み時に文字列終端のヌルバイトが黙って追加 される ことはない。また、 fseek(3) SEEK_END は、文字列の長さからの相対値 ではなく、バッファーの末尾 ( size で指定した値) からの相対値となる。 書き込み用にオープンされたストリームをフラッシュ ( fflush(3)) やクローズ (fclose(3)) した時に、 (バッファーに空きがあれば) ヌルバイトがバッファーの末尾に書き込まれる。 このようにするためには、呼び出し元は バッファーに 1バイト余裕を作る ( size にこの 1バイトを含めた値を指定する) 必要がある。setbuf(stdream, NULL);
setbuffer(stream, buf, size);
返り値
成功して終了した場合には、 fmemopen(), open_memstream(), open_wmemstream() は FILE ポインターを返す。 失敗した場合は、 NULL を返し、 errno にエラーを示す値をセットする。バージョン
fmemopen() と open_memstream() は glibc 1.0.x ですでに利用可能であった。 open_wmemstream() は glibc 2.4 以降で利用可能である。準拠
POSIX.1-2008. これらの関数は POSIX.1-2001 では規定れていないが、 Linux 以外のシステムで広く利用可能である。注意
これらの関数が返すファイルストリームに対応するファイル ディスクリプターはない (つまり、返されたストリームに対して fileno(3) を呼び出すとエラーが返ることになる)。バグ
バージョン 2.7 より前の glibc では、 open_memstream() で作成されたストリームの末尾より先にファイル位置を動かしても、 バッファーが伸長されず、 fseek(3) が失敗し -1 が返る。例
このプログラムは fmemopen() を使って出力バッファーをオープンし、 open_memstream() を使って動的にサイズが変化する出力バッファーをオープンしている。 (プログラムの第一コマンドライン引き数から取った) 入力文字列を スキャンして整数を読み込み、これらの整数の二乗を出力バッファーに書き出す。 このプログラムの実行例は以下のようになる。$ ./a.out '1 23 43' size=11; ptr=1 529 1849
プログラムのソース
#define _GNU_SOURCE #include <string.h> #include <stdio.h> #include <stdlib.h> #define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while (0) int main(int argc, char *argv[]) { FILE *out, *in; int v, s; size_t size; char *ptr; if (argc != 2) { fprintf(stderr, "Usage: %s <file>\n", argv[0]); exit(EXIT_FAILURE); } in = fmemopen(argv[1], strlen(argv[1]), "r"); if (in == NULL) handle_error("fmemopen"); out = open_memstream(&ptr, &size); if (out == NULL) handle_error("open_memstream"); for (;;) { s = fscanf(in, "%d", &v); if (s <= 0) break; s = fprintf(out, "%d ", v * v); if (s == -1) handle_error("fprintf"); } fclose(in); fclose(out); printf("size=%zu; ptr=%s\n", size, ptr); free(ptr); exit(EXIT_SUCCESS); }
関連項目
fopen(3), fopencookie(3)この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2015-01-22 | GNU |