作者:echo7111436 | 2023-08-30 18:05
有没有办法将内存缓冲区创建为FILE*.在TiXml中它可以将xml打印到FILE*但我似乎无法将其打印到内存缓冲区.
1> tbert..:
有一种POSIX方式可以将内存用作FILE
描述符:fmemopen
或者open_memstream
,根据你想要的语义:fmemopen和open_memstream之间的区别
POSIX不是C/C++标准!它是一个严重依赖于C标准的标准,但仍然只适用于C/C++支持/开发的操作系统子集!更不用说POSIX与C/C++标准的某些方面冲突了......
在任何C/C++标准中都没有定义fmemopen和open_memstream!
如果主要桌面操作系统不遵循POSIX,我们如何"一般来说,在实现POSIX的系统上编程"?我的观点是fmemopen或open_memstream都不是由任何C/C++标准定义的! - 您声称并使用POSIX 200809支持 - 因此声称它们符合"标准"并非真实.有趣的是,到目前为止你唯一的反应是提到我在每个评论中"大量"使用感叹号,而不是承认这些功能符合标准的说法是错误的......
"标准的好处在于有很多可供选择." 我想生活在现实世界中,对使徒的纯粹必杀技来说,必须要抚慰我的良心.
这句话是真的,尽管如此,这些函数都没有在C/C++标准中定义......(这两个是唯一与原问题相关的函数)
如果您考虑使用Win32(不是另一个NT子系统[例如SUA]或Win32之上的一个附加层[例如Cygwin])来跟随POSIX,那么也许我们...(您肯定会对这个定义感到孤独...)在所有其他情况下,我们通常不会在符合POSIX的操作系统上进行常规编程...
不,他们不是!它们不符合C/C++标准,因此它们不仅符合标准,而且简单.我以为我正在和一个关心C/C++的人谈话,似乎我错了.(你知道,这些语言并不局限于你喜欢的操作系统.更不用说Windows并不是声称非标准扩展是标准的一部分......)
@tbert:是2015年,我正在编写一个不符合POSIX的平台。
@tbert:现在是2017年,我正在为不兼容POSIX的平台编写代码。
2> Antti Huima..:
我想正确的答案是凯文.但这是用文件*做的黑客攻击.请注意,如果缓冲区大小(此处为100000)太小,则会丢失数据,因为在刷新缓冲区时会将其写出.此外,如果程序调用fflush(),则会丢失数据.
#include
#include
int main(int argc, char **argv)
{
FILE *f = fopen("/dev/null", "w");
int i;
int written = 0;
char *buf = malloc(100000);
setbuffer(f, buf, 100000);
for (i = 0; i < 1000; i++)
{
written += fprintf(f, "Number %d\n", i);
}
for (i = 0; i < written; i++) {
printf("%c", buf[i]);
}
}
`setbuf()`和`setvbuf()`(不是`setbuffer()`)是ISO-C,所以它**在你使用它们时应该是可移植的.如果bufferering模式完全缓冲,它应该尝试完全填充缓冲区; 在Windows上,你必须使用"NUL"而不是"/ dev/null"; 你还应该以二进制模式打开文件"wb"
3> solotim..:
fmemopen可以从缓冲区创建FILE,它对你有意义吗?