Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.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++ 从std::FILE创建GIO GFile或GInputStream*_C++_C_File_Gio - Fatal编程技术网

C++ 从std::FILE创建GIO GFile或GInputStream*

C++ 从std::FILE创建GIO GFile或GInputStream*,c++,c,file,gio,C++,C,File,Gio,我必须连接两个API,它们使用不同的结构来描述文件。一个为我提供了一个,第二个为我提供了一个或属于。有没有一种简单的方法可以从我收到的原始文件指针创建任意一个对象 void my_函数(std::FILE*FILE){ GFile*GFile=some\u creator\u方法(文件); //或者 GInputStream*ginput=some_stream_creator_方法(文件); //... //将GFile传递到其他库接口 //或者使用: 接口功能(gfile); //或使用 接

我必须连接两个API,它们使用不同的结构来描述文件。一个为我提供了一个,第二个为我提供了一个或属于。有没有一种简单的方法可以从我收到的原始文件指针创建任意一个对象

void my_函数(std::FILE*FILE){
GFile*GFile=some\u creator\u方法(文件);
//或者
GInputStream*ginput=some_stream_creator_方法(文件);
//...
//将GFile传递到其他库接口
//或者使用:
接口功能(gfile);
//或使用
接口流函数(ginput);
}
//要将参数传递给的接口函数签名:
无效接口函数(GFile*f);
无效接口流函数(GInputStream*is);

如果要重新使用底层文件句柄,则需要转到特定于平台的

  • 关于POSIX:与

  • 在Windows上:与

例如:

void my_method(FILE* file) {
#ifdef _WIN32
    GInputStream* ginput = g_win32_input_stream_new(_get_osfhandle(file), false);
#else
    GInputStream* ginput = g_unix_input_stream_new(fileno(file), false);
#endif

    . . .
    . . .

    g_input_stream_close(ginput, nullptr, nullptr);
}

请记住,
文件
应该在使用
ginput
期间保持打开状态。

如果我真的很挑剔,我不得不说这并不能完全回答问题,因为它没有提供
GFile*
。但目前还不清楚OP是否真的想要
GFile*
,或者仅仅是一种获得
GInputStream*
@KevinBoone
GFile
的方法并不是
文件的等价物
GFile
不表示打开的文件,仅表示文件元数据(名称、位置)。另一方面,
FILE
只表示一个打开的文件,没有任何元数据(从技术上讲,在Linux上,有时可以从文件描述符检索文件名,但我不建议这样做)@geo--问题是
GFile*
实际上与
文件*
并不相似--
GFile
更像路径名而不是流。如果您的API采用了
GInputStream*
,那么@rustyx建议的方法应该可以工作,否?@geo
GWin32InputStream
GUnixInputStream
都继承自
GInputStream
,您可以在任何需要
GInputStream*
的地方提供它们。您可以从文件路径创建
GFile
。如果不想将文件路径传递给函数,则需要以某种方式从
file*
获取文件路径,这是非常重要的。你可以得到一些灵感和灵感