⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gzstream.cpp

📁 这是用vc++语言编写的程序
💻 CPP
字号:
/*This file is part of the FIRE -- Flexible Image Retrieval SystemFIRE is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2 of the License, or(at your option) any later version.FIRE is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with FIRE; if not, write to the Free SoftwareFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA*/// ============================================================================// gzstream, C++ iostream classes wrapping the zlib compression library.// Copyright (C) 2001  Deepak Bandyopadhyay, Lutz Kettner//// This library is free software; you can redistribute it and/or// modify it under the terms of the GNU Lesser General Public// License as published by the Free Software Foundation; either// version 2.1 of the License, or (at your option) any later version.//// This library is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU// Lesser General Public License for more details.//// You should have received a copy of the GNU Lesser General Public// License along with this library; if not, write to the Free Software// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA// ============================================================================//// File          : gzstream.C// Revision      : $Revision: 1.3 $// Revision_date : $Date: 2004/06/16 16:52:00 $// Author(s)     : Deepak Bandyopadhyay, Lutz Kettner// // Standard streambuf implementation following Nicolai Josuttis, "The // Standard C++ Library".// ============================================================================#include "gzstream.hpp"#include <iostream>#include <string.h>  // for memcpy#ifdef GZSTREAM_NAMESPACEnamespace GZSTREAM_NAMESPACE {#endif// ----------------------------------------------------------------------------// Internal classes to implement gzstream. See header file for user classes.// ----------------------------------------------------------------------------// --------------------------------------// class gzstreambuf:// --------------------------------------gzstreambuf* gzstreambuf::open( const char* name, int open_mode) {    if ( is_open())        return (gzstreambuf*)0;    mode = open_mode;    // no append nor read/write mode    if ((mode & std::ios::ate) || (mode & std::ios::app)        || ((mode & std::ios::in) && (mode & std::ios::out)))        return (gzstreambuf*)0;    char  fmode[10];    char* fmodeptr = fmode;    if ( mode & std::ios::in)        *fmodeptr++ = 'r';    else if ( mode & std::ios::out)        *fmodeptr++ = 'w';    *fmodeptr++ = 'b';    *fmodeptr = '\0';    file = gzopen( name, fmode);    if (file == 0)        return (gzstreambuf*)0;    opened = 1;    return this;}gzstreambuf * gzstreambuf::close() {    if ( is_open()) {        sync();        opened = 0;        if ( gzclose( file) == Z_OK)            return this;    }    return (gzstreambuf*)0;}int gzstreambuf::underflow() { // used for input buffer only    if ( gptr() && ( gptr() < egptr()))        return * reinterpret_cast<unsigned char *>( gptr());    if ( ! (mode & std::ios::in) || ! opened)        return EOF;    // Josuttis' implementation of inbuf    int n_putback = gptr() - eback();    if ( n_putback > 4)        n_putback = 4;    memcpy( buffer + (4 - n_putback), gptr() - n_putback, n_putback);    int num = gzread( file, buffer+4, bufferSize-4);    if (num <= 0) // ERROR or EOF        return EOF;    // reset buffer pointers    setg( buffer + (4 - n_putback),   // beginning of putback area          buffer + 4,                 // read position          buffer + 4 + num);          // end of buffer    // return next character    return * reinterpret_cast<unsigned char *>( gptr());    }int gzstreambuf::flush_buffer() {    // Separate the writing of the buffer from overflow() and    // sync() operation.    int w = pptr() - pbase();    if ( gzwrite( file, pbase(), w) != w)        return EOF;    pbump( -w);    return w;}int gzstreambuf::overflow( int c) { // used for output buffer only    if ( ! ( mode & std::ios::out) || ! opened)        return EOF;    if (c != EOF) {        *pptr() = c;        pbump(1);    }    if ( flush_buffer() == EOF)        return EOF;    return c;}int gzstreambuf::sync() {    // Changed to use flush_buffer() instead of overflow( EOF)    // which caused improper behavior with std::endl and flush(),    // bug reported by Vincent Ricard.    if ( pptr() && pptr() > pbase()) {        if ( flush_buffer() == EOF)            return -1;    }    return 0;}// --------------------------------------// class gzstreambase:// --------------------------------------gzstreambase::gzstreambase( const char* name, int mode) {    init( &buf);    open( name, mode);}gzstreambase::~gzstreambase() {    buf.close();}void gzstreambase::open( const char* name, int open_mode) {    if ( ! buf.open( name, open_mode))        clear( rdstate() | std::ios::badbit);}void gzstreambase::close() {    if ( buf.is_open())        if ( ! buf.close())            clear( rdstate() | std::ios::badbit);}#ifdef GZSTREAM_NAMESPACE} // namespace GZSTREAM_NAMESPACE#endif// ============================================================================// EOF //

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -