교육적인 이유로 C++ ostream을 만들려고합니다. 내 테스트는 ofstream과 같은 역할을하는 ostream을 만들 것입니다. deque 또는 vector 컨테이너에 쓸 파일에 쓰는 것 외에는 예외입니다.ostream 만들기
답변
를이 교육이기 때문에, 당신이 말한대로, 나는 그런 말았을 것입니다 방법을 보여줍니다. 그렇지 않으면 stringstream
이 실제로가는 길입니다.
벡터/deque에 쓰는 streambuf 구현을 만들고 싶습니다. (targeted a /dev/null stream 그 날의 다른 답변에서 복사) 이런 식으로 뭔가 :
template<typename Ch, typename Traits = std::char_traits<Ch>,
typename Sequence = std::vector<Ch> >
struct basic_seqbuf : std::basic_streambuf<Ch, Traits> {
typedef std::basic_streambuf<Ch, Traits> base_type;
typedef typename base_type::int_type int_type;
typedef typename base_type::traits_type traits_type;
virtual int_type overflow(int_type ch) {
if(traits_type::eq_int_type(ch, traits_type::eof()))
return traits_type::eof();
c.push_back(traits_type::to_char_type(ch));
return ch;
}
Sequence const& get_sequence() const {
return c;
}
protected:
Sequence c;
};
// convenient typedefs
typedef basic_seqbuf<char> seqbuf;
typedef basic_seqbuf<wchar_t> wseqbuf;
당신은 다음과 같이 사용할 수 있습니다 :
seqbuf s;
std::ostream os(&s);
os << "hello, i'm " << 22 << " years old" << std::endl;
std::vector<char> v = s.get_sequence();
당신이 순서로 양단 큐를 원한다면, 당신은 그렇게 할 수 있습니다 :
typedef basic_seqbuf< char, char_traits<char>, std::deque<char> > dseq_buf;
또는 이와 비슷한 ... 글쎄 테스트하지 않았습니다. 그러나 그것은 또한 좋은 일이기도합니다. 버그가 아직 포함되어 있다면, 버그를 고칠 수 있습니다.
코드 스 니펫을 보내 주셔서 감사합니다. 동일한 접근 방식을 사용하여 출력을 비활성화하려면 http://stackoverflow.com/questions/760301/implementing-a-no-op-stdostream/3261439#3261439를 사용하는 것이 좋지만 문자 단위 처리를 수행하는 것이 가장 적합한 지 궁금합니다 (' overflow'는 한 번에 하나의 char을 취합니다) 또는'basic_streambuf :: sputn (const char * s, streamsize n)'과 교차하는 방법이 있습니까? –
를 사용하여 표준 : : 이제 stringstream
#include <iostream>
#include <sstream>
int main()
{
std::stringstream s;
s << "Plop" << 5;
std::cout << s.str();
}
하지만 새 ostream에를 생성하고 싶지 않아요. 당신이 원하는 것은 새로운 타입의 streambuf를 생성하고 기존의 ostream을 사용하는 것입니다.
쉽게 할 일은 std :: basic_filebuf <>에서 상속하고 데이터 구조에 요소를 추가하기 위해 sync() 및 overflow() 메서드를 오버로드하는 것입니다.
여러분은 ostream과 같은 클래스를 작성할 필요가 없다는 점에 주목할 것입니다. 어댑터를 사용하여 목표를 달성 할 수 있습니다.
는 예를 들어,이 코드는 istream로부터 읽고 벡터에 각 요소를 삽입합니다
vector<string> V;
copy(istream_iterator<string>(cin),
istream_iterator<string>(),
back_inserter(V));
- 1. '가상 ostream 및 print (ostream 및 out) const; 구현 방법
- 2. ostream 출력에 접두사 추가
- 3. ostream 재설정, C++
- 4. ostream 콘텐츠를 조작하는 방법
- 5. ostream 필터 작성 중
- 6. NSCoding 및 ostream
- 7. Ostream << 과부화 혼란
- 8. no-op std :: ostream 구현
- 9. 연산자 << 오버로드 ostream
- 10. ostream 객체를 임시 버퍼로 리디렉션하는 방법은 무엇입니까?
- 11. std :: ostream 정밀도의 최소 소수 자릿수 설정
- 12. ostream 및 streambuf 문제를 계승하고 xsputn 및 오버플로 문제가 발생했습니다.
- 13. 정적 클래스에 대해 ostream << 연산자를 오버로드합니까?
- 14. 클래스에 대해 ostream 연산자 <<를 언제 정의합니까?
- 15. C++ 클래스는 사용자 지정 ostream, sstream과 같은 역할을 수행합니다.
- 16. C++ ostream 삽입 연산자에서 컨텍스트를 사용할 수 있도록 설정해야합니다.
- 17. 만들기 :
- 18. 파이썬에서 디렉토리 만들기/만들기 (복잡한)
- 19. "ostream"에서 파생 된 클래스에서 "operator <<"를 재정의 할 때의 문제점
- 20. 클래스 이름 뒤에 ostream & operator << (...)와 같이 사용할 경우의 앰퍼샌드는 무엇입니까?
- 21. 왜 ostream :: operator <<가 char 매개 변수의 전역 함수입니까?
- 22. Databinding To 속성 만들기 .Net 2.0에서 만들기
- 23. C : 구조체 컬렉션 만들기/정수 목록 만들기
- 24. boost :: asio로 비동기 클라이언트 만들기
- 25. NSDictionary 만들기
- 26. 만들기 텍스트는
- 27. UIScrollview 만들기
- 28. 만들기 인스턴스는
- 29. WindsorViewPageActivator 만들기
- 30. 만들기 개체
아마도 실제 질문을하기 위해 질문을 개선 할 수 있습니다. –