2010-06-15 4 views
5

나는 C++에서 랜덤 액세스 바이너리 I/O를위한 다형성 인터페이스로 std::istreamostream을 사용하고 대한 권장하지만, 다양한 방법으로 최적 보인다는 C++ 다형성, 시크, 바이너리 I/O 인터페이스

  • 64 비트 검색은 streampos/streamoff 제한으로 인해 이식 가능하지 않으며 오류가 발생하기 쉽습니다. 현재 해결책으로 boost/iostreams/positioning.hpp를 사용하지만, 이러한 각성을 절단하거나 구체적인 구현 사이의 불일치
  • (POSIX ftruncate ALA) 파일 등의 확장
  • 누락 조작을 필요로; 예 : stringstream은 독립적 인 get/put 위치를 갖는 반면, filestream
  • 플랫폼 구현 간의 불일치; 예 : 오류에 대한 failbit/badbit의 파일이나 사용의 끝을 통과 추구하는 행동은
  • 모든 stream의 서식 시설이나 streambuf
  • streambuf 오류보고의 가능성도 버퍼링 (즉, 예외 대 반환을 필요로하지 않습니다 오류 표시) 나는 Boost.Iostreams Device concept에서 제공하는 단순화 된 인터페이스를 좋아하는 가정 implementation-dependent

연습에서이지만 기능 템플릿이 아닌 다형성 클래스로 제공합니다. (device class이 있지만 다형성이 아니며 제공된 장치 구현에서 반드시 사용하지 않는 구현 도우미 클래스입니다.) 주로 큰 디스크 파일을 사용하지만 다형성을 원하므로 대체 구현을 쉽게 대체 할 수 있습니다 (예 : 유닛 테스트에 fstream 대신 stringstream을 사용하십시오.) 딥 템플릿 인스턴스화의 모든 복잡성과 컴파일 타임 커플 링이 필요하지 않습니다.

누구나 표준 접근 방식에 대한 권장 사항이 있습니까? 일반적인 상황 인 것처럼 보이므로 불필요하게 내 자신의 인터페이스를 발명하고 싶지는 않습니다. 예를 들어, java.nio.FileChannel과 같은 것이 이상적입니다.

지금까지 가장 좋은 해결책은 Boost.Iostreams 장치 위에 얇은 다형성 레이어를 배치하는 것입니다. 예 :

class my_istream 
{ 
public: 
    virtual std::streampos seek(stream_offset off, std::ios_base::seekdir way) = 0; 
    virtual std::streamsize read(char* s, std::streamsize n) = 0; 
    virtual void close() = 0; 
}; 

template <class T> 
class boost_istream : public my_istream 
{ 
public: 
    boost_istream(const T& device) : m_device(device) 
    { 
    } 

    virtual std::streampos seek(stream_offset off, std::ios_base::seekdir way) 
    { 
     return boost::iostreams::seek(m_device, off, way); 
    } 

    virtual std::streamsize read(char* s, std::streamsize n) 
    { 
     return boost::iostreams::read(m_device, s, n); 
    } 

    virtual void close() 
    { 
     boost::iostreams::close(m_device); 
    } 

private: 
    T m_device; 
}; 

답변

0

나는 방금 질문에서 개략적으로 설명한 것과 비슷한 추상 인터페이스 집합을 마무리했다. 이것에 대한 경량의 다형성 표준이없는 것 같습니다.

1

Qt의 QIODevice 클래스와 하위 클래스가 있습니까? 나는 그것이 당신의 요구에 맞는지는 잘 모르겠지만 아마도 그럴 가치가있다 : QIODevice.

+0

포인터를 보내 주셔서 감사합니다. Qt를 잊어 버렸습니다. 나는 그것에 의존성을 가지고 싶지 않지만, 약간의 관점을 제공한다. –