Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我可以得到一个由内存中已有数据支持的文件*吗?_C_Windows_File_Io_Fread - Fatal编程技术网

C 我可以得到一个由内存中已有数据支持的文件*吗?

C 我可以得到一个由内存中已有数据支持的文件*吗?,c,windows,file,io,fread,C,Windows,File,Io,Fread,我的代码目前使用一个库,我将一个文件*传递给它,它使用fread()crtapi读取一系列复杂的配置数据。我想将该文件移动到该文件内的嵌入式资源(Windows DLL)。不幸的是,读取Windows资源会直接将数据作为空*…传递给库 我希望能够得到一个由内存缓冲区支持的文件*,而不是磁盘上的文件。Windows有CreateStreamOnHGlobal(),但它使用的是IStream*,我需要一个文件*。不幸的是,我找不到任何适用于Windows的解决方案这可能吗? 我可以使用的解决方案是将

我的代码目前使用一个库,我将一个文件*传递给它,它使用fread()crtapi读取一系列复杂的配置数据。我想将该文件移动到该文件内的嵌入式资源(Windows DLL)。不幸的是,读取Windows资源会直接将数据作为空*…传递给库

我希望能够得到一个由内存缓冲区支持的文件*,而不是磁盘上的文件。Windows有CreateStreamOnHGlobal(),但它使用的是IStream*,我需要一个文件*。不幸的是,我找不到任何适用于Windows的解决方案这可能吗?


我可以使用的解决方案是将资源数据写入一个临时文件,将临时文件传递给配置解析器,然后删除该文件……但这样做效率极低,而且我正在处理大量数据。

您实际需要的是Windows上的等效数据。不存在这样的等价物

可以使用命名管道作为变通方法。您应该能够使用
fopen()
打开命名管道的读取端。然后,资源提供者将
文件*
传递给配置解析器,而其他线程将资源数据写入命名管道的写入端。只要解析器只想对文件进行顺序读取(与查找相反,查找在管道上不起作用),这就可以了


如果您愿意使用,它会提供。

我认为内存映射文件可能会提供您需要的内容。在Wikipedia或MSDN上签出。我需要与内存映射文件相反的文件。MMF让你像对待内存一样对待文件;我需要做的是把内存当作一个文件。谢谢你的建议,谢谢你的澄清。我希望您能找到改变库的动机,使用更合适的抽象来利用内存中的数据。谢谢。这是个好建议。痛苦……但这是个好主意。:-)我刚刚想出了一个更恶心的办法。将数据附加到DLL本身的末尾。使用
fopen()
将DLL作为常规文件打开,然后查找数据的开头,并将其传递到库中。