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