iostream 상속객체 구현 조언해주세요.

purewell의 이미지

iostream 객체를 가지고 있으면
실제 인스턴스가 fstream이든 stringstream이든 상관 없습니다.
(oop니 당연한거지만)

문제는 다음과 같은 상황을 C++ 표준 객체인 iostream 따위를
상속해서 구현하고 싶습니다. 그런데 막상 자료가 충분치 않습니다.

구현하고자 하는 내용.

상속 받은 객체가 각각 zistream, zostream, ziostream일 때,

zistream zis;
zis.open("압축된파일.gz");
if (!zis.is_open()) return false;

ofstream ofs;
ofs.open("평문파일.txt");
if (!ofs.is_open()) return false;

char buf[1024];
while (!zis.eof())
{
  zis.read(buf, sizeof(buf));  // 물론 읽은 데이터 크기가 버퍼크기가 아닐 수도 있지만 대충대충 skip~
  ofs.write(buf, sizeof(buf));
}

...
doldori의 이미지

class zistream : public std::ifstream
{
public:
    zistream() { }
    explicit zistream(const char* filename,
                      std::ios_base::openmode mode = std::ios_base::in)
        : std::ifstream(filename, mode) { }

private:
    zistream(const zistream&);
    zistream& operator=(const zistream&);
};
purewell의 이미지

doldori wrote:
class zistream : public std::ifstream
{
public:
    zistream() { }
    explicit zistream(const char* filename,
                      std::ios_base::openmode mode = std::ios_base::in)
        : std::ifstream(filename, mode) { }

private:
    zistream(const zistream&);
    zistream& operator=(const zistream&);
};

ㅡ_-);; read/write 구현은요? 그냥 read/write virtual로 구현해야하나요?

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

doldori의 이미지

read/write는 ifstream/ofstream 클래스에 있으니 그냥 쓰면 되는데요?
뭔가 특별한 기능을 원하시는 건가요?

purewell의 이미지

doldori wrote:
read/write는 ifstream/ofstream 클래스에 있으니 그냥 쓰면 되는데요?
뭔가 특별한 기능을 원하시는 건가요?

네.

z*stream은 gzip으로 압축된 파일에서
내용을 읽고 쓰기 위해 만드려는 클래스입니다.

그러므로 read/write할 때 파일에 그냥 쓰는게 아니라
압축알고리즘에 의해 압축/해제가 이뤄져야합니다.

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

cinsk의 이미지

iostream의 대부분의 class는 상속받아서 쓸 수 있도록 design된 class들이 아닙니다. 자세한 것은 Standard C++ IOStreams and Locales을 참고하시기 바랍니다. 읽은 지 오래되서 어설픈 설명을 하는 것보다, 책 추천이 나을 듯 싶군요.

:wink:

익명 사용자의 이미지

저라면... iostream 객체를 상속받지않고...
객체안에 참조로 iostream 을 가지도록 감싸겠습니다.

int zistream::read() {
return decompress(iostr->read());
}

등등...

prolinko의 이미지

위의 예제 코드만 실행 되게 위해서는 read()만 override해서 눈가림식으로만들수도 있지만, 표준 stream의 조건을 만족하기 위해서는 std::streambuf을 상속받은 zistreambuf을 구현하고 이것을 rdbuf로 사용하는 zistream(istream을 상속받아서..)을 구현해야 될 것 같습니다.

stream 클래스 들은 거의 특정 streambuf 를 랩핑해서 IO를 위한 인터페이스를 제공하는 역할을 하므로. zistreambuf만 잘 구현하면 zistream에 작성해야 될 부분은 몇줄 안될 것 같습니다.

prolinko의 이미지

열심히 설명하고 나서 찾아봤더니 벌서 구현된 것이 있군요. :oops:

http://www.zlib.net/

zlib 소스를 받아보시면 contrib/iostream/ 에 들어있습니다.

익명 사용자의 이미지

prolinko wrote:
위의 예제 코드만 실행 되게 위해서는 read()만 override해서 눈가림식으로만들수도 있지만, 표준 stream의 조건을 만족하기 위해서는 std::streambuf을 상속받은 zistreambuf을 구현하고 이것을 rdbuf로 사용하는 zistream(istream을 상속받아서..)을 구현해야 될 것 같습니다.

stream 클래스 들은 거의 특정 streambuf 를 랩핑해서 IO를 위한 인터페이스를 제공하는 역할을 하므로. zistreambuf만 잘 구현하면 zistream에 작성해야 될 부분은 몇줄 안될 것 같습니다.

켜~
윗분들 모두모두
감사합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.