fmemopen 子例程

用途

打开内存缓冲区流。

标准库 (libc.a)

语法

#include <stdio.h>
FILE *fmemopen (void *restrict buf, size_t size, const char *restrict mode);

描述

费门开 子例程将 布夫大小 参数给出的缓冲区与流关联。 布夫 自变量必须是空指针,或者指向包含 大小 参数指定的值 (以字节为单位) 的缓冲区。

模式 自变量是一个字符串,它具有下列其中一个值:
  • R雷布 以打开流进行读取。
  • W世界 以打开流进行写入。
  • A阿卜 附加到笔流以在第一个空字节处进行写入。
  • r +rb +r + b 以打开流进行更新 (读和写)。
  • W +wb +W + b 以打开流进行更新 (读和写)。 截断缓冲区中的内容。
  • a +阿拉伯 +a + b 追加以打开流进行更新 (读和写) ,并且初始位置位于第一个空字节。

字符 B 不具有任何效果。

如果将空指针指定为 布夫 参数,那么 费门开 子例程通过调用 马洛克 子例程将由 大小 参数指定的字节数分配给内存。 关闭流时,将自动释放此缓冲区。 因为此功能仅在由于无法获取指向缓冲区的指针而打开流以进行更新时才有用,所以如果 模式 参数不包含 + 字符,那么 费门开 子例程调用将失败。

该流在缓冲区中保持当前位置。 此位置最初设置为缓冲区的开头 (对于 RW 方式) ,或者设置为缓冲区中的第一个空字节 (对于 A 方式)。 如果在追加方式中找不到空字节,那么在缓冲区结束后将初始位置设置为 1 个字节。

如果 布夫 是空指针,那么始终将初始位置设置为缓冲区的开头。

该流还会维护当前缓冲区内容的大小。 对于方式 Rr + ,大小将设置为 大小 自变量所给定的值。 对于方式 WW + ,初始大小为零,对于方式 Aa + ,初始大小是缓冲区中第一个空字节的位置,或者如果找不到任何空字节,那么是大小参数的值。

对流执行的读操作不会将当前缓冲区位置提前到当前缓冲区大小之后。 在读操作中达到缓冲区大小的计数为文件结束。 缓冲区中的空字节对于读取没有特殊意义。 读操作从该流的当前缓冲区位置开始。

写操作从流的当前位置开始 (如果方式不包含 A 作为第一个字符) ,或者从流的当前大小开始 (如果方式不包含 A 作为第一个字符)。 如果在写操作结束时的当前位置大于当前缓冲区大小,那么当前缓冲区大小将设置为当前位置。 流上的写操作不会将当前缓冲区大小提前到大小参数中给定的大小之后。

当打开以进行写入的流被清空或关闭时,将根据内容的大小在当前位置或缓冲区的末尾写入空字节。 如果打开以进行更新的流被清空或关闭,并且最后一次写入已提高当前缓冲区大小,那么将在缓冲区末尾写入空字节 (如果适合)。

尝试将内存缓冲区流寻至负位置或大于大小参数中给定的缓冲区大小的位置失败。

返回值

成功完成后, 费门开 子例程将返回一个指向控制流的对象的指针。 否则,将返回空指针,并且 错误号 变量将设置为指示错误。

错误代码

费门开 函数将返回以下错误代码:
表 1. 错误代码
描述
EINVAL 大小 自变量指定缓冲区大小为零,或者 模式 自变量的值无效,或者 布夫 自变量为空指针,并且 模式 自变量不包含 + 字符。
电子文件 FOPEN_MAX 流当前在调用过程中处于打开状态。
ENOMEM 布夫 参数是空指针,并且由 大小 参数指定的长度缓冲区分配失败。

示例

#include <stdio.h>
static char buffer[] = "foobar";
int
main (void)
{
int ch;
FILE *stream;
stream = fmemopen(buffer, strlen (buffer), "r");
if (stream == NULL)
/* handle error */;
while ((ch = fgetc(stream)) != EOF)
printf("Got %c\n", ch);
fclose(stream);
return (0);
} 

以上程序将生成以下输出:

获取 f

已获取 o

已获取 o

已获取 b

有一个

已获取 R