C++11 如何在共享资源之间转换\u ptr<;文件>;以C+格式归档*+;?

C++11 如何在共享资源之间转换\u ptr<;文件>;以C+格式归档*+;?,c++11,shared-ptr,wofstream,wifstream,C++11,Shared Ptr,Wofstream,Wifstream,我试图在整个应用程序中多次使用文件指针 为此,我创建了一个函数并将指针传递给它。基本上我有这段代码 FILE* fp; _wfopen_s (&fp, L"ftest.txt", L"r"); _setmode (_fileno(fp), _O_U8TEXT); wifstream file(fp); 这是重复的,现在我想要这样的东西: wifstream file(SetFilePointer(L"ftest.txt",L"r")); .... wo

我试图在整个应用程序中多次使用文件指针 为此,我创建了一个函数并将指针传递给它。基本上我有这段代码

     FILE* fp;
    _wfopen_s (&fp, L"ftest.txt", L"r");
    _setmode (_fileno(fp), _O_U8TEXT);
    wifstream file(fp);
这是重复的,现在我想要这样的东西:

wifstream file(SetFilePointer(L"ftest.txt",L"r"));
....
wofstream output(SetFilePointer(L"flist.txt",L"w"));
对于功能:

FILE* SetFilePointer(const wchar_t* filePath, const wchar_t * openMode)
{
    shared_ptr<FILE> fp = make_shared<FILE>();
    _wfopen_s (fp.get(), L"ftest.txt", L"r");
    _setmode (_fileno(fp.get()), _O_U8TEXT);
    return fp.get();
}
FILE*SetFilePointer(常量wchar\u t*filePath,常量wchar\u t*openMode)
{
shared_ptr fp=使_共享();
_wfopen_s(fp.get(),L“ftest.txt”,L“r”);
_setmode(_fileno(fp.get()),_O_U8TEXT);
返回fp.get();
}

这并不简单。我尝试使用
&*fp
而不是
fp.get()
,但仍然没有成功

你不应该像
共享
那样,用
新建
创建
文件
实例,然后用
删除
销毁它们。相反,
文件
是用
fopen
(或者在本例中是用
\wfopen\s
)创建的,并用
fclose
销毁。这些函数使用一些未指定的方法在内部进行分配和取消分配

请注意,
\u wfopen\u s
不接受指针,而是指向指针的指针-它会更改您给它的指针,使其指向它分配的新
文件
对象。您无法获取
shared\u ptr
中包含的指针地址来形成指向它的指针,这是一件非常好的事情-这将严重破坏
shared\u ptr
的所有权语义,并导致内存泄漏或更糟

但是,您可以使用
shared\u ptr
来管理任意的“句柄”类型,因为它可以接受自定义的deleter对象或函数:

FILE* tmp;
shared_ptr<FILE> fp; 
if(_wfopen_s(&tmp, L"ftest.txt", L"r") == 0) {
  // Note that we use the shared_ptr constructor, not make_shared
  fp = shared_ptr<FILE>(tmp, std::fclose);
} else {
  // Remember to handle errors somehow!
}
文件*tmp;
共享ptr fp;
如果(&tmp,L“ftest.txt”,L“r”)==0){
//请注意,我们使用共享的\u ptr构造函数,而不是使\u共享
fp=共享的ptr(tmp,std::fclose);
}否则{
//记住以某种方式处理错误!
}

请看一下@KerrekSB-give,它更详细地介绍了这个想法。

也许您对此感兴趣。谢谢,但您正在将文件*转换为共享文件,我正在使用共享文件,我一直在想如何反转它。!我不明白:-/嗯,你的方法根本没有意义。当你说
make_shared
时,你实际上是在说
new FILE
,这是完全错误的,因为
FILE
是一种不透明类型。那么我该怎么办呢?我不想有重复的代码,我想不出任何其他方式!如果您能进一步指导我,我将不胜感激