我们调用了一个库来读取文本,这个库API只接受一个FILE*
指针。它实际上是通过内部fread()
调用来读取文件文本。
但我们还需要使用此库来读取char*
字符串而不是FILE*
中的文本。
当然我们可以将char*
字符串写入临时文件,但由于某些原因我们不允许这样做...
怎么办?谢谢!!
答案 0 :(得分:4)
查看fmemopen
fmemopen()函数应将buf参数给出的缓冲区与流关联。
#include <stdio.h>
static char buffer[] = "foobar";
int main (void)
{
FILE *stream;
stream = fmemopen (buffer, strlen (buffer), "r");
/* You got a FILE* pointer, you can call your function here :-) */
}
答案 1 :(得分:1)
可以做到,但这并不容易,也很复杂。
您可以使用shm_open
创建共享内存文件句柄,mmap
可以使用此文件句柄使其指向字符串的内存区域,然后使用{{3}从文件描述符创建一个FILE
指针。
注意:这仅适用于POSIX(例如Linux或Mac OSX)系统。 Windows系统应具有类似的功能,但仍然不容易。
编辑这可能与Massimo Fazzolari在答案中引用的fmemopen
电话中幕后发生的情况类似。
答案 2 :(得分:0)
嗯,没有编写自己的设备驱动程序以某种方式与进程进行通信,这是一个棘手的问题。通过这种方式,我的意思是你可以创建一个字符设备,当读取它时,通过某种IPC(共享内存,命名管道或其他东西)进行通信回流程。
但这是(1)讨厌,(2)特定于UNIX(非便携)和(3)一个非常糟糕的主意: - )
如果没有这样的低级技巧(或使用可以处理文件句柄等内存的非可移植扩展),则无法执行此操作 - fread
需要FILE*
并将从文件句柄中读取,就是这样,真的。
答案 3 :(得分:0)
在各种unix系统上,您可以创建管道/套接字或类似的文件描述符,并使用fdopen()打开文件描述符并获取FILE *指针。然后将绳子送入管道/插座。
我建议您在遇到类似这样的奇怪问题时检查程序/库设计。奇怪的问题/要求是设计不良的强烈迹象。
答案 4 :(得分:-1)
我不认为这可以做到。 fread只能从文件流中读取,即FILE *或stdout。