other versions
FMEMOPEN(3) | Linux Programmer's Manual | FMEMOPEN(3) |
名前¶
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) が指定された場合、ファイル位置の初期値は バッファ中の 最初の NULL バイト ('\0') の位置に設定される。 それ以外の場合は、ファイル位置の初期値はバッファの先頭になる。 glibc 2.9 以降では、文字 'b' を mode の二番目の文字として指定 することができる。 この文字は「バイナリ」モードを指定するものである。 このモードでは、書き込み時に文字列終端のヌルバイトが黙って追加 される ことはない。また、 fseek(3) SEEK_END は、文字列の長さからの相対値 ではなく、バッファの末尾 ( size で指定した値) からの相対値となる。 書き込み用にオープンされたストリームをフラッシュ ( fflush(3)) やクローズ (fclose(3)) した時に、 (バッファに空きがあれば) NULL バイトがバッファの末尾に書き込まれる。 このようにするためには、呼び出し元は バッファに 1バイト余裕を作る ( size にこの 1バイトを含めた値を指定する) 必要がある。返り値¶
成功して終了した場合には、 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=%ld; ptr=%s\n", (long) size, ptr); free(ptr); exit(EXIT_SUCCESS); }
関連項目¶
fopen(3), fopencookie(3)この文書について¶
この man ページは Linux man-pages プロジェクトのリリース 3.41 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2012-04-28 | GNU |