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

Lod*_*dle 39 c c++

有没有办法将内存缓冲区创建为FILE*.在TiXml中它可以将xml打印到FILE*但我似乎无法将其打印到内存缓冲区.

tbe*_*ert 64

有一种POSIX方式可以将内存用作FILE描述符:fmemopen或者open_memstream,根据你想要的语义:fmemopen和open_memstream之间的区别

  • POSIX不是C/C++标准!它是一个严重依赖于C标准的标准,但仍然只适用于C/C++支持/开发的操作系统子集!更不用说POSIX与C/C++标准的某些方面冲突了...... (16认同)
  • 在任何C/C++标准中都没有定义fmemopen和open_memstream! (8认同)
  • 如果主要桌面操作系统不遵循POSIX,我们如何"一般来说,在实现POSIX的系统上编程"?我的观点是fmemopen或open_memstream都不是由任何C/C++标准定义的! - 您声称并使用POSIX 200809支持 - 因此声称它们符合"标准"并非真实.有趣的是,到目前为止你唯一的反应是提到我在每个评论中"大量"使用感叹号,而不是承认这些功能符合标准的说法是错误的...... (8认同)
  • "标准的好处在于有很多可供选择." 我想生活在现实世界中,对使徒的纯粹必杀技来说,必须要抚慰我的良心. (4认同)
  • 这句话是真的,尽管如此,这些函数都没有在C/C++标准中定义......(这两个是唯一与原问题相关的函数) (3认同)
  • 所以......我们*不*,一般来说,在实现POSIX的系统上编程?你当然可以欺骗我。我想我应该把你多次使用的感叹号表示你完全是这里的权威。 (2认同)
  • 如果您考虑使用Win32(不是另一个NT子系统[例如SUA]或Win32之上的一个附加层[例如Cygwin])来跟随POSIX,那么也许我们...(您肯定会对这个定义感到孤独...)在所有其他情况下,我们通常不会在符合POSIX的操作系统上进行常规编程... (2认同)
  • 不,他们不是!它们不符合C/C++标准,因此它们不仅符合标准,而且简单.我以为我正在和一个关心C/C++的人谈话,似乎我错了.(你知道,这些语言并不局限于你喜欢的操作系统.更不用说Windows并不是声称非标准扩展是标准的一部分......) (2认同)
  • @tbert:是2015年,我正在编写一个不符合POSIX的平台。 (2认同)
  • @tbert:现在是2017年,我正在为不兼容POSIX的平台编写代码。 (2认同)

Ant*_*ima 21

我想正确的答案是凯文.但这是用文件*做的黑客攻击.请注意,如果缓冲区大小(此处为100000)太小,则会丢失数据,因为在刷新缓冲区时会将其写出.此外,如果程序调用fflush(),则会丢失数据.

#include <stdio.h>
#include <stdlib.h>

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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • `setbuf()`和`setvbuf()`(不是`setbuffer()`)是ISO-C,所以它**在你使用它们时应该是可移植的.如果bufferering模式完全缓冲,它应该尝试完全填充缓冲区; 在Windows上,你必须使用"NUL"而不是"/ dev/null"; 你还应该以二进制模式打开文件"wb" (8认同)

sol*_*tim 9

fmemopen可以从缓冲区创建FILE,它对你有意义吗?


sam*_*wry 5

我写了一个简单的例子,我将如何创建一个内存文件:

#include <unistd.h> 
#include <stdio.h> 

int main(){
  int p[2]; pipe(p); FILE *f = fdopen( p[1], "w" );

  if( !fork() ){
    fprintf( f, "working" );
    return 0;
  }

  fclose(f); close(p[1]);
  char buff[100]; int len;
  while( (len=read(p[0], buff, 100))>0 )
    printf(" from child: '%*s'", len, buff );
  puts("");
}
Run Code Online (Sandbox Code Playgroud)


Kev*_*ney 2

您可以使用TiXMLPrinterCStr方法,文档指出:

当您需要执行以下操作时,TiXmlPrinter 非常有用:

  1. 打印到内存(尤其是在非STL模式下)
  2. 控制格式(行结束符等)