2013-07-21 4 views
2

나는 내 응용 프로그램을 통해 FILE 포인터를 여러 번 사용하려고합니다. 이 기능을 만들었지 만 포인터를 통과 시켰습니다. 기본적으로 나는 반복되는 코드shared_ptr <FILE>을 (를) FILE *에있는 C++로 변환하는 방법?

 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.get() 대신에 &*fp을 사용했지만 여전히 운이 없었습니다.

+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'이 * opaque * 타입이기 때문에 사실상 완전히 새로운 것입니다. –

답변

3

FILE 인스턴스를 new으로 만들고이를 delete (예 : make_shared)으로 삭제하지 않아도됩니다. 대신, FILEfopen (또는이 경우는 _wfopen_s)으로 생성되고 fclose으로 파괴됩니다. 이 함수는 일부 지정되지 않은 방법을 사용하여 내부적으로 할당 및 할당 취소를 수행합니다. 그것은 당신이 그것이 할당하는 새로운 FILE 객체를 가리 키도록 준 포인터를 변경 - _wfopen_s 포인터하지만을 포인터하는 포인터를하지 않는

참고. shared_ptr에 포함 된 포인터의 주소를 가져 와서 포인터를 포인터로 만들 수는 없으며 이는 매우 좋은 일입니다. shared_ptr의 소유권 의미를 무시하고 메모리 누출 또는 악화를 초래할 수 있습니다.

그러나 는 사용자 정의 Deleter가 객체 또는 함수에 걸릴 수, 유형 -like 임의의 "핸들을"관리 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는이 아이디어에 대해보다 자세히 설명합니다.