将FILE *打开到不断增长的内存空间

时间:2017-03-24 16:21:01

标签: c++ qt memory buffer

我正在使用的库需要一个FILE *作为存储未知数量文本的输入。通常我可以将cout作为FILE *传递,但我想将这个未知大小的文本捕获到变量中。

是否有一种很好的方法可以为不断增长的缓冲区创建FILE *?

我知道这样的事情 -

char output[1024] 
FILE *foutput = fmemopen(output, 1024, "w");

但据我所知,这会打开一个1024字节的固定大小缓冲区,可以写入。

1 个答案:

答案 0 :(得分:2)

char *ptr = NULL;
size_t size = 0;
FILE *fp = open_memstream(&ptr, &size);

现在,您可以将fpstdio功能一起使用,并访问"打印"通过ptr输出。缓冲区自动生成,在free流之后应为fclose d。

open_memstream不是标准C,但由POSIX.1-2008指定。虽然有关于它的ISO C TR。

对于open_memstream不可用的系统(如macOS),您可以使用fopencookiefunopen来实现它,这样您就可以定义自己的fread fwrite }},fseekfcloseFILE函数,将在流上运行时调用。两者都没有标准化(首先是GNU扩展,第二是BSD特定)。

您可以在此类系统上使用BSD libc's implementation

对于仅实施C标准规定的API的系统,您运气不好。你可以做的最好的事情是将输出写入临时文件(也许保存在ramfs或类似文件中),然后从中读取。

只有在与使用std::stringstream IO的API进行交互时才应执行此操作。如果不是要求,请考虑使用import { Component, OnInit, Input, style, transition, animate, trigger } from '@angular/core'; import { DataTransferService } from '../services/data-transfer.service'; @Component({ selector: 'app-page-header', template: '<h1 [innerHTML]="heading" [@fadeMe]="heading" *ngIf="heading != null"></h1>', animations: [ trigger('fadeMe', [ transition('void => *', [style({opacity: 0}), animate('500ms ease-in', style({opacity: 1}))]) ]) ] }) export class PageHeaderComponent implements OnInit { public heading: string = ''; constructor( private pageHeaderService: DataTransferService ) { } ngOnInit() { this.pageHeaderService.pageHeaderData$.subscribe( data => { this.heading = data['heading']; }); } } 或类似内容。