如何用FILE *写入内存缓冲区?
有什么办法来创build一个内存缓冲区作为文件*。 在TiXml中,它可以将xml打印到FILE *中,但是我似乎无法将其打印到内存缓冲区中。
有一个POSIX的方式来使用内存作为FILE
描述符: fmemopen
或open_memstream
,取决于你想要的语义: fmemopen和open_memstream之间的区别
我想凯文是正确的答案。 但是,这是一个黑客做文件*。 请注意,如果缓冲区大小(这里是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]); } }
fmemopen可以从缓冲区创buildFILE,这对你有意义吗?
我写了一个简单的例子,我将如何创build一个内存中的文件:
#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(""); }
您可以使用文档所述的TiXMLPrinter的CStr方法:
当您需要时,TiXmlPrinter是有用的:
- 打印到内存(特别是在非STL模式下)
- 控制格式(行结束等)
C ++ basic_streambuf
inheritance
在C ++中,如果可以的话,应该避免使用FILE*
。
只使用C ++ stdlib,可以制作一个透明地使用文件或内存IO的单一接口。
这使用以下技术: 设置标准stream使用的内部缓冲区(pubsetbuf)
#include <cassert> #include <cstring> #include <fstream> #include <iostream> #include <ostream> #include <sstream> /* This can write either to files or memory. */ void write(std::ostream& os) { os << "abc"; } template <typename char_type> struct ostreambuf : public std::basic_streambuf<char_type, std::char_traits<char_type> > { ostreambuf(char_type* buffer, std::streamsize bufferLength) { this->setp(buffer, buffer + bufferLength); } }; int main() { /* To memory, in our own externally supplied buffer. */ { char c[3]; ostreambuf<char> buf(c, sizeof(c)); std::ostream s(&buf); write(s); assert(memcmp(c, "abc", sizeof(c)) == 0); } /* To memory, but in a hidden buffer. */ { std::stringstream s; write(s); assert(s.str() == "abc"); } /* To file. */ { std::ofstream s("a.tmp"); write(s); s.close(); } /* I think this is implementation defined. * pusetbuf calls basic_filebuf::setbuf(). */ { char c[3]; std::ofstream s; s.rdbuf()->pubsetbuf(c, sizeof c); write(s); s.close(); //assert(memcmp(c, "abc", sizeof(c)) == 0); } }
不幸的是,似乎不可能交换FILE*
和fstream
: 从std :: fstream获取FILE *