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


80

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

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


스트림 버퍼의 잘못된 추상화입니다.
Pubby 2011

1
@Pubby : 어, "스트림 버퍼"가 무엇입니까? 스트림이나 버퍼와 어떻게 다릅니 까?
user541686

3
@moshbear : 죄송합니다. 그게 뭔지 모르겠네요.
user541686

1
@Mehrdad 스트로브 스트 룹의 는 C ++ 프로그래밍 언어 : 스페셜 에디션
moshbear

5
기분이 나아질 것 같으면 15 년 동안 C ++로 작업했지만 여전히 C ++ 라이브러리의 IO 부분을 얻지 못했습니다. 내가 그것을 사용할 기회가 있었던 단일 프로젝트가 없었습니다.
Nemanja Trifunovic 2011

답변:


50

스트림 버퍼는 입력 또는 출력 장치를 나타내며 해당 장치에 대한 포맷되지 않은 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 패싯을 사용합니다. 일반적으로 적절한 패싯이있는 로케일이 포함 된 와이드 스트림 버퍼를 사용하여 동일한 효과를 얻을 수 있습니다.


14
이것은 5 년이 너무 늦었 기 때문에 대답으로 게시하지 않고이 질문을 받아들이지 않을 것입니다. 그러나 이것을 읽은 후에도 용어에 여전히 혼동되는 사람을 streambuf위해 : 원시 데이터 용입니다 (예 : 원시 바이트, 원시 정수 등), 반면 stream위한 조리 데이터 (텍스트, 텍스트로 포맷 된 정수, 등). 달리 말하면 stream, 구문 분석 (또는 직렬화) 계층을 나타냅니다 . 일반 문자열을 다룰 때 기술적으로 둘 중 하나를 사용할 수 있지만 의미는 다릅니다. streambuf즉, 원시 데이터가 문자열 자체가되기를 원하지만 stream인코딩을 추상화합니다.
user541686 nov.

@Mehrdad stream추상을 인코딩을 제거 함으로써 무엇을 의미하는지 물어봐도 될까요? : D 좀 더 설명해 주시거나 더 많은 자료를 제공해 주시겠습니까?
Rick

3
@Rick : 물론입니다. stream책임이 읽기와 개체 쓰기 A와를 streambuf. streambuf는 바이트 저장 위치에서 바이트 (또는 문자 / 단어 / 당신이 선호하는 이름) 를 저장하고 복원하는 역할을 합니다. 객체와 바이트 간의 매핑은 내가 "인코딩"이라고 부르는 것입니다. 이에 대한 예는 a stream가 an을 수락 한 int다음이를 chars 로 변환하는 방법을 결정하는 것입니다. 그 반대의 경우도 마찬가지입니다. 빅 엔디안 형식, 리틀 엔디안 형식, 비트 반전 형식, 7 비트를 사용할 수 있습니다. 형식 만 또는 기타. 즉, 저장 형식을 추상화합니다.
user541686

69

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

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

여기에 이미지 설명 입력

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


2
나는이 기사뿐만 아니라 streambuf를 설명 할 수있는 것을 온통 검색했다. 찾을 수 있도록 도와 주셔서 감사합니다!
wvdschel 2013

1
예는 항상 가장 좋습니다. 감사합니다
eigenfield
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.