open_memstream 和 open_wmemstream 子例程
用途
打开动态内存缓冲区流。
库
标准库libc.a
语法
#include <stdio.h>
FILE *open_memstream(char **bufp, size_t *sizep);
#include <wchar.h>
FILE *open_wmemstream(wchar_t **bufp, size_t *sizep); 描述
open_memstream( )和open_wmemstream( )函数创建与动态分配的内存缓冲区相关联的 I/O 流。 该流已打开以进行写入,并且将可检索。
与调用open_memstream( )相关的流是面向字节的。
与调用open_wmemstream( )相关的数据流是宽定向的。
该流在分配的缓冲区中保持当前位置和当前缓冲区长度。 该位置最初设置为零 (缓冲区的开始部分)。 对数据流的每次写入都将从当前位置开始,并按照open_memstream( ) 成功写入的字节数或open_wmemstream( ) 成功写入的宽字符数移动该位置。长度初始设置为零。 如果某个写操作将该位置移动到大于当前长度的值,那么当前长度将设置为此位置。 在这种情况下,open_memstream( )的空字符或open_wmemstream( )的空宽字符将被附加到当前缓冲区。 对于这两个函数,终止空值不会包括在缓冲区长度的计算中。
在fflush( )或fclose( ) 成功执行后,bufp引用的指针包含缓冲区的地址,sizep指向的变量包含open_memstream( )成功写入的字节数,或open_wmemstream( ) 成功写入的宽字符数。对于open_memstream( ),缓冲区以空字符结束;对于open_wmemstream( ),缓冲区以空字符结束。
成功执行fflush( )后,bufp引用的指针和sizep引用的变量将一直有效,直到下一次对数据流进行写操作或调用fclose( )。
返回值
成功完成后,这些函数将返回一个指向控制流的对象的指针。 否则,将返回空指针,并设置 错误号 以指示该错误。
错误代码
在以下情况下,这些函数可能会失败:
| 项 | 描述 |
|---|---|
| [EINVAL] | 布夫普 或 锡泽普 为 NULL。 |
| [电子文件] | {FOPEN_MAX} 流当前在调用过程中处于打开状态。 |
| [ENOMEM] | 无法分配用于流或缓冲区的内存。 |
示例
#include <stdio.h>
int main (void)
{
FILE *stream;
char *buf;
size_t len;
stream = open_memstream(&buf, &len);
if (stream == NULL)
/* handle error */;
fprintf(stream, "hello my world");
fflush(stream);
printf("buf=%s, len=%zu\n", buf, len);
fseeko(stream, 0, SEEK_SET);
fprintf(stream, "good-bye");
fclose(stream);
printf("buf=%s, len=%zu\n", buf, len);
free(buf);
return 0;
} 此程序生成以下输出:
buf=hello my world, len=14
buf=good-bye world, len=14