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
是一种不透明类型。那么我该怎么办呢?我不想有重复的代码,我想不出任何其他方式!如果您能进一步指导我,我将不胜感激