2010-03-06 6 views
1

seekg/seekp를 통해 관리되는 별도 get/put 위치로 std :: iostream 인터페이스를 사용하여 임의 액세스 바이너리 파일을 업데이트하려고합니다. 모든 것이 stringstream에서 잘 작동하지만, Boost.Iostream (특히 boost :: iostreams :: stream < boost :: iostreams :: file_descriptor >)을 사용하여 파일 설명자 기반 스트림을 만들면 get/put 위치는 더 이상 독립적이지 않습니다.file_descriptor를 사용하여 dual-seekable Boost Iostream을 생성 할 수 있습니까?

Modes의 설명서에서 "Dual-seekable"스트림을 찾고 있다고 생각합니다. 문서에서는 Mode가 stream의 템플릿 매개 변수 인 "주로 내부 용"임을 보여 주지만 더 이상 맞지 않습니다. 대신, 모드 (? 일명 카테고리) 장치에서 직접 가져온 것입니다

template< typename Device, 
      typename Tr = ..., 
      typename Alloc = ...> 
struct stream : detail::stream_base<Device, Tr, Alloc> { 
public: 
    typedef typename char_type_of<Device>::type char_type; 
    struct category 
     : mode_of<Device>::type, 
      closable_tag, 
      detail::stream_traits<Device, Tr>::stream_tag 
     { }; 

차 질문 : 시크하지만 이중되지 태그가 같은 file_descriptor 같은 장치에서 듀얼 시크 동작을 (얻을 수있는 방법이 있나요 - 선택 가능)?

보조 질문 : seekg/seekp의 독립성에 대한 일반적인 보장이 있습니까? 웹 검색에서 stringstream이 독립적 인 것처럼 보이지만 fstream은 그렇지 않을 수도 있습니다. 그러나 나는 권위있는 것을 찾을 수 없다.

답변

1

bidirectional_seekable boost::iostreams::device을 구성하면 iostreams::seek 함수의 도움으로 수정할 수있는 두 개의 개별 get/put 위치를 지원합니다. 당신은 (읽기, 쓰기, 추구), 자세한 내용은 예제와 문서를 볼 수있는 세 가지 기능을 작성하여 스트림 로직을 구현해야

struct binary_seekable_device 
: boost::iostreams::device<boost::iostreams::bidirectional_seekable> 
{ 
    explicit binary_seekable_device(int fd) 
     : fd(fd), pos_read(0), pos_write(0) {} 

    std::streamsize read(char *s, std::streamsize n); 
    std::streamsize write(char const *s, std::streamsize n); 
    std::streampos seek(boost::iostreams::stream_offset off, 
     std::ios::seekdir way, std::ios::openmode which); 

    int fd; 
    std::size_t pos_read; 
    std::size_t pos_write; 
}; 

: 같은

대략이 보일 것입니다. 중요한 점은 매개 변수 std::ios::openmode which을 통해 업데이트해야하는 위치 (읽기, 쓰기 또는 둘 다)를 알 수 있습니다. s는 스트림 인스턴스입니다

int fd = open(...); 
boost::iostream::stream<binary_seekable_device> s(fd); 

당신이이 파일 작업을 필요로 할 수 있습니다 : 부스트 :: IOSTREAMS :: 스트림을 인스턴스화하는 동안

이제이 장치를 사용합니다.

+1

Boost.Iostream 코드에 대한 답변과 추가 정보를 바탕으로 boost :: iostreams :: file_descriptor의 자체 버전을 롤백해야하는 것처럼 들립니다. 한편으로 구현할 수있는 방법은 3 가지뿐입니다. 다른 한편으로는 Windows/POSIX 이식성을 위해 모든 "#ifdef BOOST_IOSTREAMS_WINDOWS"항목을 복제해야합니다. (이 스트림은 OS 고유의 API를 사용하여 만든 임시 파일에 액세스하는 데 사용됩니다.) 어쨌든 도움을 주셔서 감사합니다! –

관련 문제