나는 C++에서 랜덤 액세스 바이너리 I/O를위한 다형성 인터페이스로 std::istream
및 ostream
을 사용하고 대한 권장하지만, 다양한 방법으로 최적 보인다는 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;
};
포인터를 보내 주셔서 감사합니다. Qt를 잊어 버렸습니다. 나는 그것에 의존성을 가지고 싶지 않지만, 약간의 관점을 제공한다. –