内存流

作者: MachinePlay | 来源:发表于2020-01-30 15:56 被阅读0次

我们已经看到,标准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所示。


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;
}

相关文章

  • 内存流

    在之前用过了文件操作实现了针对于文件数据的输入与输出操作,但是如果说现在某一应用,需要进行IO操作,但是不生成文件...

  • 内存流

    我们已经看到,标准I/O库把数据缓存在内存中,因此每次一字符 和每次一行的I/O更有效。我们也可以通过调用setb...

  • IO流之 内存输出流

    内存输出流 什么是内存输出流 该输出流可以向内存中写数据,把内存当做一个缓冲区,写出之后可以一次性获取所有数据。 ...

  • 第九讲 文件操作

    File 输入和输出流是相对于内存来说的:写入内存叫做输入流,从内存写到文件叫输出流。

  • JavaSE总结(9)IO流(1)

    一、IO流: IO流: input输入(流向内存) 读取数据 output输出(流出内存) 写出数据 IO...

  • java——IO_文件输入流和输出流

    输入流和输出流(站在程序的角度思考问题)-----文件-->内存(输入流) 内存--->界面信息(输出流) 用输入...

  • JAVA-IO流的理解

    1.输入流和输出流的方向是相对于内存来说的,从文件/网络等到内存方向的流称为输入流,反之为输出流。2.I/O流根据...

  • Java之IO流

    在【内存】的角度:输入流:将数据从硬盘读到内存中输出流:将数据从内存写到硬盘文件中 从流操作数据时采用的单位,分为...

  • IO操作

    一、什么是IO流I:就是input 、O:就是output ,故称:输入输出流。将数据读入内存或者内存输出的过程常...

  • ofstream的使用方法

    ofstream的使用方法ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存...

网友评论

    本文标题:内存流

    本文链接:https://www.haomeiwen.com/subject/qqbithtx.html