如何通过fread函数读取char *字符串?

时间:2012-09-14 08:37:27

标签: c memory char fread

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

但我们还需要使用此库来读取char*字符串而不是FILE*中的文本。

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

怎么办?谢谢!!

5 个答案:

答案 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。