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