当前位置:  开发笔记 > 编程语言 > 正文

如何使用FILE*写入内存缓冲区?

如何解决《如何使用FILE*写入内存缓冲区?》经验,为你挑选了3个好方法。

有没有办法将内存缓冲区创建为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,它对你有意义吗?

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有