我正在使用的库需要一个FILE *作为存储未知数量文本的输入。通常我可以将cout作为FILE *传递,但我想将这个未知大小的文本捕获到变量中。
是否有一种很好的方法可以为不断增长的缓冲区创建FILE *?
我知道这样的事情 -
char output[1024]
FILE *foutput = fmemopen(output, 1024, "w");
但据我所知,这会打开一个1024字节的固定大小缓冲区,可以写入。
答案 0 :(得分:2)
char *ptr = NULL;
size_t size = 0;
FILE *fp = open_memstream(&ptr, &size);
现在,您可以将fp
与stdio
功能一起使用,并访问"打印"通过ptr
输出。缓冲区自动生成,在free
流之后应为fclose
d。
open_memstream
不是标准C,但由POSIX.1-2008指定。虽然有关于它的ISO C TR。
对于open_memstream
不可用的系统(如macOS),您可以使用fopencookie
或funopen
来实现它,这样您就可以定义自己的fread
fwrite
}},fseek
,fclose
和FILE
函数,将在流上运行时调用。两者都没有标准化(首先是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'];
});
}
}
或类似内容。