我有以下函数(来自lionet asn1编译器API):
int xer_fprint(FILE *stream, struct asn_TYPE_descriptor_s *td, void *sptr);
第一个参数是FILE *,这是输出的地方。
这有效:
xer_fprint(stdout, &asn_struct, obj);
这样做:
FILE* f = fopen("test.xml", "w");
xer_fprint(f, &asn_struct, obj);
fclose(f);
但是我需要在字符串中使用这些数据(最好是std :: string)。
我该怎么做?
答案 0 :(得分:1)
在Linux上,您有fmemopen
,它为临时内存缓冲区创建FILE *
句柄:
char * buffer = malloc(buf_size);
FILE * bufp = fmemopen(buffer, buf_size, "wb");
如果这不可用,那么您可以尝试将FILE *
附加到POSIX共享内存文件描述符:
int fd = shm_open("my_temp_name", O_RDWR | O_CREAT | O_EXCL, 0);
// unlink it
shm_unlink("my_temp_name");
// on Linux this is equivalent to
fd = open("/dev/shm/my_temp_name", O_RDWR | O_CREAT | O_EXCL); unlink("/dev/shm/my_temp_name");
FILE * shmp = fdopen(fd, "wb");
// use it
char * buffer = mmap(NULL, size_of_buf , PROT_READ, MAP_SHARED, fd, 0);
答案 1 :(得分:0)
在C中:打开文件并将其读回。使用合适的临时文件位置。没有标准的方法来创建FILE *
的内存(“字符串流”)版本。
答案 2 :(得分:0)
GNU的libc
提供string streams作为标准库的扩展。
fmemopen
和open_memstream
函数允许您对字符串或内存缓冲区执行I / O操作。这些设施在stdio.h
中声明。
答案 3 :(得分:0)
据我所知,你想调用xer_fprint来写入内存缓冲区。我不认为有直接的方法可以做到这一点,但我认为你可以使用管道。以下内容应该为您提供一些尝试的建议:
int rw[2];
int ret = pipe(rw);
FILE* wrFile = fdopen(rd[1], 'w');
xer_fprint(wrFile, &asn_struct, obj);
// ... later/in another thread
namespace io = boost::iostreams;
io::stream_buffer<io::file_descriptor_source> fpstream (rw[0]);
std::istream in (&fpstream);
std::string data;
in >> data;