2013-07-21 68 views
2

我試圖通過我的應用程序 多次使用FILE指針爲此我雖然我創建一個函數並通過該指針傳遞。基本上我有這段代碼如何將shared_ptr <FILE>轉換爲C++中的FILE *文件?

 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(); 
} 

這並未」簡單地工作。我嘗試使用&*fp而不是fp.get(),但仍然沒有運氣。

+1

也許[這個想法](http://codereview.stackexchange.com/questions/4679/shared-ptr-and-file-for-wrapping-cstdio-update-also-dlfcn-h)是你感興趣的。 –

+0

謝謝,但在那裏你正在將文件*轉換爲shared_ptr,我使用的是shared_ptr,並且我堅持如何將其反轉。我很無能: -/ – Breeze

+3

那麼,你的方法根本沒有意義。當你說'make_shared '時,你實際上在說'新的FILE',這是完全錯誤的,因爲'FILE'是一個* opaque *類型。 –

回答

3

你不應該用new創建FILE實例並用delete銷燬它們,就像make_shared一樣。相反,FILE s是用fopen(或在這種情況下爲_wfopen_s)創建的,並用fclose銷燬。這些函數使用某些未指定的方法在內部進行分配和解除分配。

注意_wfopen_s並不需要一個指針,但一個指針的指針 - 它改變了你給它指向新FILE對象它分配的指針。你不能得到包含在shared_ptr中的指針的地址,以形成一個指向它的指針,這是一件非常好的事情 - 它會極大地破壞shared_ptr的所有權語義並導致內存泄漏或更糟。

但是,您可以使用shared_ptr管理亂「手柄」般的類型,因爲它可以自定義刪除器對象或功能:

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! 
} 

請大家看看the link @ KerrekSB給了它,它涵蓋了更多細節的相同想法。

相關問題