内存流

我们已经看到,标准I/O库把数据缓存在内存中,因此每次一字符 和每次一行的I/O更有效。我们也可以通过调用setbuf或setvbuf函数让 I/O库使用我们自己的缓冲区。在SUSv4中支持了内存流。这就是标准 I/O流,虽然仍使用FILE指针进行访问,但其实并没有底层文件。所有 的I/O都是通过在缓冲区与主存之间来回传送字节来完成的。我们将看 到,即便这些流看起来像文件流,它们的某些特征使其更适用于字符串 操作。
有3个函数可用于内存流的创建,第一个是fmemopen函数。

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

返回值:若成功,返回流指针;若错误,返回NULL fmemopen 函数允许调用者提供缓冲区用于内存流:buf 参数指向缓
冲区的开始位置,size参数指定了缓冲区大小的字节数。如果buf参数为 空,fmemopen函数分配size字节数的缓冲区。在这种情况下,当流关闭 时缓冲区会被释放。
type参数控制如何使用流。type可能的取值如图5-14所示。


4064394-7669b0996e7e0895.png
image.png

注意,这些取值对应于基于文件的标准I/O流的type参数取值,但 其中有些微小差别。第一,无论何时以追加写方式打开内存流时,当前 文件位置设为缓冲区中的第一个null字节。如果缓冲区中不存在null字 节,则当前位置就设为缓冲区结尾的后一个字节。当流并不是以追加写 方式打开时,当前位置设为缓冲区的开始位置。因为追加写模式通过第 一个null字节确定数据的尾端,内存流并不适合存储二进制数据(二进 制数据在数据尾端之前就可能包含多个null字节)。
第二,如果buf参数是一个null指针,打开流进行读或者写都没有任 何意义。因为在这种情况下缓冲区是通过fmemopen进行分配的,没有 办法找到缓冲区的地址,只写方式打开流意味着无法读取已写入的数 据,同样,以读方式打开流意味着只能读取那些我们无法写入的缓冲区 中的数据。
第三,任何时候需要增加流缓冲区中数据量以及调用fclose、 fflush、fseek、fseeko以及fsetpos时都会在当前位置写入一个null字节。

#include <iostream>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#define BUFFSIZE 4096
int main(int argc, char * argv[]) {
    char buf[BUFFSIZE];
    printf("open mem file_stream\n");
    FILE *fp = fmemopen(buf, BUFFSIZE, "r+");
    char c;
    printf("fputs\n");
    fputs("hello world", fp);
    char line[BUFFSIZE];
    printf("%s\n", buf);

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值