Nice programing

streambuf는 정확히 무엇입니까?

nicepro 2020. 10. 24. 11:44
반응형

streambuf는 정확히 무엇입니까? 어떻게 사용하나요?


I / O 스트림이 C ++에서 작동하는 방식에 대해 조금 더 배우려고하는데, 언제 무엇을 사용해야하는지 정말 혼란 스럽습니다.

정확히 무엇입니까 streambuf? , an 또는 a 와 비교하여는
언제 사용 합니까? (마지막 세 개는 이미 알고 있지만, 그렇지 않다면 그들과 어떻게 비교 되는지 모릅니다 .)streambufstringistreamvectorstreambuf


스트림 버퍼는 입력 또는 출력 장치를 나타내며 해당 장치에 대한 포맷되지 않은 I / O를위한 저수준 인터페이스를 제공합니다. 스트림은, 다른 한편으로는, 기본 포맷되지 않은 I / O 함수로서 포맷 특히 I / O 기능 (즉,를 통해 버퍼 주위에 높은 수준 래퍼를 제공 operator<<하고 operator>>과부하). 스트림 객체는 스트림 버퍼의 수명을 관리 할 수도 있습니다.

예를 들어 파일 스트림에는 내부 파일 스트림 버퍼가 있습니다. 스트림은 버퍼의 수명을 관리하고 버퍼는 파일에 대한 실제 읽기 및 쓰기 기능을 제공합니다. 스트림의 형식화 연산자는 궁극적으로 스트림 버퍼의 형식화되지 않은 I / O 함수에 액세스하므로 스트림의 I / O 함수 만 사용하면되고 버퍼의 I / O 함수를 직접 건드릴 필요가 없습니다.

차이점을 이해하는 또 다른 방법은 로케일 객체의 다양한 용도를 살펴 보는 것입니다. 스트림 등의 서식을 함께 할 수있는 측면 사용 numpunctnum_get. 또한 스트림의 오버로드 operator<<operator>>사용자 정의 시간 또는 돈 데이터 유형이 시간 및 돈 형식화 패싯을 사용할 것으로 예상 할 수 있습니다 . 그러나 스트림 버퍼는 인터페이스가 사용하는 단위와 바이트 사이를 변환하기 위해 codecvt 패싯을 사용합니다. 따라서, 예를 들어,에 대한 인터페이스를 basic_streambuf<char16_t>사용 char16_t있도록 basic_streambuf<char16_t>내부적으로는 사용하는 codecvt<char16_t, char, mbstate_t>포맷 변환 기본적 char16_t으로 버퍼에 기록 단위를char기본 장치에 기록 된 단위. 따라서 스트림은 대부분 포맷 용이고 스트림 버퍼는 다른 외부 인코딩을 사용할 수있는 장치에 대한 포맷되지 않은 입력 또는 출력을위한 저수준 인터페이스를 제공합니다.

I / O 장치에 대한 형식화되지 않은 액세스 만 원할 때 스트림 버퍼를 사용할 수 있습니다. 스트림 버퍼를 공유하는 여러 스트림을 설정하려는 경우 스트림 버퍼를 사용할 수도 있습니다 (버퍼의 수명을 신중하게 관리해야 함). 넓은 문자 스트림 버퍼처럼 보이게 wbuffer_convert하는 a의 파사드 역할을하는 C ++ 11 과 같이 사용할 수있는 특수 목적 스트림 버퍼도 있습니다 basic_streambuf<char>. 어떤 로케일에 첨부 된 codecvt 패싯을 사용하는 대신 생성 된 codecvt 패싯을 사용합니다. 일반적으로 적절한 패싯이있는 로케일이 포함 된 와이드 스트림 버퍼를 사용하여 동일한 효과를 얻을 수 있습니다.


의 도움으로 streambuf낮은 수준 에서 작업 할 수 있습니다 . 기본 버퍼에 대한 액세스를 허용합니다.

다음은 몇 가지 좋은 예입니다. C ++ streambufs를 사용하여 복사,로드, 리디렉션 및 티 와 비교를 참조하면 도움이 될 수 있습니다.

여기에 이미지 설명 입력

자세한 내용은 IOstream 라이브러리 를 참조하십시오.

참고 URL : https://stackoverflow.com/questions/8116541/what-exactly-is-streambuf-how-do-i-use-it

반응형