2017-09-26 1 views
0

C 함수 (fopen)가있는 파일을 열고 해당 핸들을 C++ 파일 스트림 (fstream ...)에 할당 할 수 있습니까?C 파일 핸들을 C++ 파일 스트림에 할당

묻는 이유 : Windows에서 UTF8을 처리하려고하지만 fstream 클래스에는 const char* ctor/open 메서드 만 있습니다. 그래서 C API를 사용하여 열어야하고 스트림 객체가 그것을 사용하게해야합니다.

부스트 스트림 라이브러리를 사용하면 싱크/소스를 지정할 수도 있기 때문에 가능 할지도 모르지만 어디서부터 시작해야할지 모르겠습니다.

설명 : UTF8 문자열로 지정된 경로로 파일을 열고 싶습니다. 따라서 파일 열기 방법은 fstream이 아닌 UTF8 경로를 지원해야합니다. const wchar_t*을 수락하는 MSVC 확장이 도움이되지만, MinGW는 이러한 과부하를 제공하지 않습니다. 그래서 대신 창문에 wfopen을 사용해야합니다.

+0

내가 누락되었지만'UTF-8'은 정상적인'char *'버퍼가 필요합니다. 또한 fstream 열기 메서드는 파일 이름 만 처리하므로 파일 인코딩에 어떤 차이가 없습니다. fstream으로 파일을 여는 것이 왜 작동하지 않는지에 대해 더 구체적으로 설명해 줄 수 있습니까? – Galik

+0

'fstream'에서 문자열을 읽는 것은 그것에 할당 된 로케일에 달려 있습니다. –

+0

파일 이름은 UTF8입니다. 추가 된 내용이 – Flamefire

답변

1

C 함수 (fopen)가있는 파일을 열고 해당 핸들을 C++ 파일 스트림 (fstream ...)에 할당 할 수 있습니까?

아니요, 아니요. 그러나 FILE*을 사용하여 I/O를 처리하는 사용자 지정 std::streambuf 파생 클래스를 작성 (또는 찾은 후) 한 다음 해당 클래스의 인스턴스를 표준 std::istream 개체에 할당 할 수 있습니다. 도움을 받으려면 std::basic_filebuf의 구현을 보거나 GNU의 stdio_filebuf 클래스를 참조하십시오.

UTF8 문자열로 주어진 경로로 파일을 열고 싶습니다. 따라서 파일 열기 방법은 fstream이 아닌 UTF8 경로를 지원해야합니다. const wchar_t*을 수락하는 MSVC 확장이 도움이되지만, MinGW는 이러한 과부하를 제공하지 않습니다. 그래서 대신 창문에 wfopen을 사용해야합니다.

Windows의 대부분의 유니 코드 API는 UTF-8을 지원하지 않으며 UTF-16 만 지원합니다. 따라서 Visual C++ 및 기타 호환 컴파일러에서 wchar_t 오버로드가 발생합니다. Mingw는 단순히 이러한 확장을 지원하지 않습니다. 하지만 제 3 자 솔루션이 있습니다. Pathie (Pathie::ifstreamPathie::ofstream 클래스 참조).

+0

질문에 추가 된 바와 같이 : 파일 이름은 UTF8입니다. 그걸로 작동하는 구현을 알게 되었습니까? 아니면 이에 대한 부스트 구성 요소가 있습니까? – Flamefire

+0

@Flamefire : 내 대답을 업데이트했습니다. –

+0

고마워요! 라이브러리 boost : nowide는'iofstream' 클래스를 제공하므로 도움이됩니다. Pathie는 아마도 모든 boost :: filesystem 항목을 대체 할 수 있지만 대신 그것을 보완 해 줄 것입니다. 아니면 둘 중 하나에 대해 의견이나 경험이 있습니까? – Flamefire