2010-06-07 10 views
4

며칠 전에 및 미리 읽기를 사용하는 streambuf 서브 클래스를 작성하는 것이 재미있을 것이라고 결정했습니다. 내 STL (SGI)이 filebuf을 구현하고 basic_filebufFILE*이 있다는 것을 깨달았습니다. 따라서 basic_filebuf에서 물려받은 것은 문제가되지 않습니다.해당 스트림을 다시 작성하지 않고 streambuf에서 파생

그래서 나는 basic_streambuf에서 물려 받았습니다. 그렇다면 나는 mmapbuf을 fstream에 묶고 싶었다.

내가해야 할 일은 filebuf의 암시 적 인터페이스를 복사하는 것이라고 생각했지만 분명히 실수였습니다. SGI에서 basic_fstreambasic_filebuf을 소유합니다. basic_filestream.std::::ios::rdbuf(streambuf*)에 전화를 건건 상관없이 파일 스트림이이를 완전히 무시하고 자신의 filebuf을 사용합니다.

지금은 약간 혼란 스럽습니다 ... mmfstream을 만들 수 있습니다. fstream의 정확한 복사/붙여 넣기가 될 수 있지만 DRY 지향적이지는 않습니다.

내가 이해할 수없는 무엇이다 : fstream 그렇게 단단히은 filebuf보다는 다른 것을 사용할 수 없습니다 그래서, filebuf와 결합 하는가? 스트림과 버퍼를 분리하는 요점은 다른 버퍼를 가진 스트림을 사용할 수 있다는 것입니다.

솔루션 :

=>filestreamfilebuf의 암시 적 인터페이스에 의존해야한다. 즉, fstream은 streambuf 클래스에 의해 템플릿 화되어야합니다. 모든 사용자가 filebuf의 암시 적 인터페이스를 구현하는 한 모든 사용자가 fstream에 자체 streambuf 서브 클래스를 제공 할 수 있습니다. 문제 : 템플릿 매개 변수로 fstream을 사용하는 동안 템플릿 선택기가 중단되므로 fstream에 템플릿 매개 변수를 추가 할 수 없습니다.

=>filebuf은 추가 속성없이 순수 가상 클래스 여야합니다. 그래서 모든 FILE * 쓰레기를 운반하지 않고도 상속받을 수 있습니다.

제목에 대한 아이디어가 있습니까?

+0

제목에 오타가 있습니다. streambug => streambuf. 귀하의 질문에 대한 답변을 모르겠지만, 미안 해요! – chrism1

+0

수정 됨, thanks :) – NewbiZ

답변

2

Boost.Iostreams 라이브러리의 mapped_file을 확인하십시오. 나는 그것을 사용한 적이 한 번도 없었지만 이미 필요한 것을 할 수있는 것처럼 보입니다.

편집 : 죄송합니다. 귀하의 질문을 다시 읽어보십시오. 아마도 부스트에서 영감을 얻을 수 있습니다.

+0

예, 오늘 아침에 동료와 이야기를 나눴고, 저에게 부스트가 이미 있다는 것을 알려주었습니다. :) 그러나 주목 하셨듯이, 그것은 주로 즐거움을위한 것입니다! 감사. – NewbiZ

2

fstream 그 자체로는 큰 클래스가 아닙니다. basic_stream을 상속 받아 모든 <<>> 연산을 지원하고, steambuf을 초기화해야하며 해당 생성자를 사용하여 streambuf 생성자에 매개 변수를 전달합니다.

어떤면에서 템플릿 기반 솔루션에 대해 작성한 내용은 괜찮습니다. 그러나 basic_stream은 또한 예를 들어 tcp_stream으로 도출 될 수 있습니다. 이 경우 fstream의 생성자는 쓸모가 없습니다. 따라서 새 tcpstream 클래스를 제공하고 basic_stream에서 상속받은 생성자가 tcp_stream을 만들 수있는 올바른 매개 변수를 제공해야합니다. 결국 fstream에서 아무 것도 사용하지 않을 것입니다. 이 새로운 tcpstream을 만드는 것은 3 가지 또는 4 가지 기능 만 쓰는 문제입니다.

결국 fstream 클래스에서 파생되므로 실제 이유는 없습니다. 이것은 클래스 계층 구조에서 불필요한 커플 링을 추가합니다.

+0

tcp_stream은 파일 스트림이나 문자열 스트림처럼 조작 될 수 없기 때문에 전적으로 tcp_stream과 동의합니다. 하지만 여기서 우리는 똑같은 방법으로 액세스해야하는 두 개의 스트림 버퍼에 대해 말하고 있습니다. 두 스트림 버퍼는 파일을 조작하고 둘 다 파일 스트림에서 액세스해야합니다. fstream과 filebuf가 다른 클래스없이 사용할 수 없다면 다른 클래스에있는 점은 무엇입니까? – NewbiZ

+0

새로운'streambuf'에 추가 매개 변수 ('filebuf'에 주어진 것 이상)를 제공해야 할 것이라고 확신합니다. 따라서 새로운'filestream'을위한 새로운 생성자를 작성해야합니다. 이러한 생성자는 작성, 작성, 유도 또는 단독 실행으로 작성해야하는 유일한 것입니다. –

+0

> 아니요. fstream의 추가 기능인 open, close, is_open을 모두 구현해야합니다. 문제는 이러한 작은 메서드를 작성하지 않고 그냥 수행하지 않아도됩니다. 복사/붙여 넣기가 가능하며 코드를 다시 사용하지 않아도됩니다. 더 중요한 것은 내 사용자가 fstream에서 mmfstream으로 전환해야한다는 것입니다. – NewbiZ

1

std::fstream의 전체 요점은 _ F _ile 기반 std::stream입니다. 당신이 당신의 mmstreambuf 바탕으로 일반 std::stream을 원한다면, 당신은 mmstreambuf를 생성하고 IO 스트림에서 std::stream::stream(std::streambuf*)

+0

"std :: fstream의 전체적인 점은 _F_ile 기반 std :: stream"> 그리고 ** ** 파일 기반 스트림을 원합니다!내'mmstreambuf' 클래스는'filebuf'와 똑같은 기능을 제공하지만 버퍼 메모리 대신 매핑 된 메모리를 사용합니다. – NewbiZ

11

에 전달해야한다 '디자인, 실제 스트림의 가장'기능 (스트림 버퍼의 기능과 반대로) std::basic_istream, std::basic_ostream 및 기본 클래스로 구현됩니다. 문자열 및 파일 스트림 클래스는 다소간의 편의를위한 래퍼이며 올바른 유형의 버퍼가있는 스트림이 인스턴스화 된인지 확인합니다. 당신이 스트림을 확장 할 경우

당신은 거의 항상 자신의 스트림 버퍼 클래스을 제공하려면, 당신은 당신의 자신의 스트림 클래스를 제공 할 필요가 거의 절대. .

일단 스트림 버퍼 유형을 사용하면 주변에있는 모든 스트림 객체에 대한 버퍼로 만들 수 있습니다. 또는 std::basic_istream, std::basic_ostreamstd::basic_iostream에서 자신의 클래스를 파생하여 스트림 버퍼를 인스턴스화하고이를 기본 클래스에 전달할 수 있습니다.
후자는 사용자에게 더 편리하지만 버퍼의 인스턴스화를위한 보일러 플레이트 코드 (즉, 스트림 클래스의 생성자)를 작성해야합니다.

질문에 대답하십시오 : 파일 스트림과 파일 버퍼는 너무 밀접하게 결합됩니다. 왜냐하면 전자는 후자를 쉽게 만들 수 있기 때문입니다. 파일 스트림을 사용하면 모든 것을 쉽게 설정할 수 있습니다.
스트림 스트림을 사용하여 스트림 버퍼를 구성하는 것은 문제가되지 않아야합니다. 어쨌든 파일 스트림을 전달하지 말고 기본 클래스 만 전달하면됩니다 (참조).

+0

나는 이것이 엎드려서 투표 된 이유를 배울 __very__ 관심이있을 것입니다. – sbi

+3

질문에 답하지 않았기 때문에. 여기에 쓰여진 내용은 어떤 식 으로든 문제를 해결하는 데 도움이되지 않습니다. 그건 당신이 상상의 "나는 iostream과 streambuf의 차이점은 무엇입니까?"라는 질문에 대답하는 것과 같습니다. – NewbiZ

+1

@ Aurélien : 공정한 요점. 단, 나는 당신의 질문에 분명히 답할 것입니다. 나는 이것이 더 분명해질 수 있도록 대답을 바꾸려고 노력했다. – sbi

관련 문제