2

我们调用了一个库来读取文本,这个库 API 只接受一个FILE*指针。fread()它实际上通过内部调用读取文件文本。

但是我们还需要使用这个库来读取char*字符串而不是FILE*.

当然,我们可以将char*字符串写入临时文件,但由于某些原因,我们不允许这样做......

怎么做 ?谢谢 !!

4

5 回答 5

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 :-) */
}
于 2012-09-14T08:45:06.010 回答
1

可以做到,但并不容易而且相当复杂。

您可以使用 来创建共享内存文件句柄shm_open,该文件句柄可用于mmap使其指向字符串的内存区域,然后用于从文件描述符fdopen创建指针。FILE

注意:这仅适用于 POSIX(例如 Linux 或 Mac OSX)系统。Windows 系统应该有类似的功能,但仍然不容易。

编辑fmemopen在 Massimo Fazzolari 的答案中引用的电话中,这可能与幕后发生的事情类似。

于 2012-09-14T08:49:31.090 回答
0

嗯,没有编写自己的设备驱动程序以某种方式与进程通信,这是一个棘手的问题。我的意思是,你可以创建一个字符设备,当读取它时,它会通过某种 IPC(共享内存、命名管道或其他东西)与进程通信。

但这是 (1) 讨厌的,(2) UNIX 特定的(不可移植的)和 (3) 一个非常糟糕的主意 :-)

如果没有这样的低级技巧(或使用可以像文件句柄一样处理内存的不可移植扩展),这是无法完成的 -fread期望 aFILE*并且将从文件句柄中读取,就是这样,真的。

于 2012-09-14T08:41:39.770 回答
0

在各种 unix 系统上,您可以创建管道/套接字或类似的文件描述符,并使用 fdopen() 打开文件描述符并获取 FILE* 指针。然后将绳子送入管道/插座。

当你遇到这样的奇怪问题时,我建议你检查你的程序/库设计。奇怪的问题/要求是糟糕设计的强烈迹象。

于 2012-09-14T08:44:44.137 回答
-1

我不认为这是可以做到的。fread 只能从文件流(即 FILE * 或 stdout)中读取。

于 2012-09-14T08:40:45.447 回答