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

如何通过fread函数读取char*字符串?,c,memory,char,fread,C,Memory,Char,Fread,我们调用了一个库来读取文本,这个库API只接受一个文件*指针。它实际上通过内部调用读取文件文本 但是我们还需要使用这个库来读取char*字符串中的文本,而不是文件* 当然,我们可以将char*字符串写入临时文件,但由于某些原因,我们不允许这样做 怎么办?谢谢 我认为这是办不到的。fread只能从文件流中读取,即file*或stdout。我认为这是不可能做到的。fread只能从文件流中读取,即文件*或标准输出。嗯,除了编写自己的设备驱动程序以某种方式与进程通信之外,这是一个棘手的问题。我的意思是,

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

但是我们还需要使用这个库来读取
char*
字符串中的文本,而不是
文件*

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


怎么办?谢谢

我认为这是办不到的。fread只能从文件流中读取,即file*或stdout。

我认为这是不可能做到的。fread只能从文件流中读取,即文件*或标准输出。

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

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


如果没有这些低级技巧(或者使用可以像处理文件句柄一样处理内存的不可移植扩展名),这是无法做到的-
fread
需要一个
文件*
,并将从文件句柄读取,真的就是这样。

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

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


如果没有这些低级技巧(或者使用可以像处理文件句柄一样处理内存的不可移植扩展名),这是不可能做到的-
fread
需要一个
文件*
,并将从文件句柄读取,真的就是这样。

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


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

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

我建议您在遇到类似这样的奇怪问题时检查程序/库设计。奇怪的问题/要求是不良设计的强烈迹象。

查看

函数的作用是:将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 :-) */
}
#包括
静态字符缓冲区[]=“foobar”;
内部主(空)
{
文件*流;
流=fmemopen(缓冲区,strlen(缓冲区),“r”);
/*如果有文件*指针,可以在此处调用函数:-)*/
}
退房

函数的作用是:将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 :-) */
}
#包括
静态字符缓冲区[]=“foobar”;
内部主(空)
{
文件*流;
流=fmemopen(缓冲区,strlen(缓冲区),“r”);
/*如果有文件*指针,可以在此处调用函数:-)*/
}

这是可以做到的,但并不容易,也不太复杂

您可以使用创建共享内存文件句柄,此文件句柄可用于使其指向字符串的内存区域,然后使用从文件描述符创建一个
文件
指针

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


编辑在马西莫·法佐拉里的回答中提到的
fmemopen
呼叫中,可能会有类似的事情发生在幕后。

这是可以做到的,但并不容易,也相当复杂

您可以使用创建共享内存文件句柄,此文件句柄可用于使其指向字符串的内存区域,然后使用从文件描述符创建一个
文件
指针

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


编辑在马西莫·法佐拉里的回答中提到的
fmemopen
通话中,可能在幕后发生了类似的事情。

不确定你为什么投了否决票。根据您提供的标签,这确实是不可能的。这不能在标准C中完成,即使我的方法可以在UNIX/Linux类型的系统中实现,这仍然是一个坏主意。@不,当问题只指定C(没有像Linux这样的限定符)时,我认为这意味着ISO C。我不确定你为什么投了否决票。根据您提供的标签,这确实是不可能的。这不能在标准C中完成,即使我的方法可以在UNIX/Linux类型的系统中实现,这仍然是一个坏主意。@不,当问题只指定C(没有像Linux这样的限定符)时,我认为这意味着ISO C。这不是C,而是POSIX。您应该指定它的不可移植性。+1,但正如@paxdiablo指出的,它是(最近)POSIX添加的。史诗般的提示,谢谢你提到这一点。去寻找一个最新的POSIX系统,它不是C,而是POSIX。您应该指定它的不可移植性。+1,但正如@paxdiablo指出的,它是(最近)POSIX添加的。史诗般的提示,谢谢你提到这一点。我想你的意思是
stdin
,但无论如何,那仍然是一个
文件*
,所以多余:-)Manik,我想你的意思是
stdin
,但无论如何,那仍然是一个
文件*
,所以多余:-)谁说你不是allo