从写入FILE *的函数中获取数据

时间:2014-06-23 11:54:54

标签: c++ c file

我有以下函数(来自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)。

我该怎么做?

4 个答案:

答案 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作为标准库的扩展。

  

fmemopenopen_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;