/*
* A C + + I / O streams interface to the zlib gz * functions
*
* by Ludwig Schwardt < schwardt @ sun . ac . za >
* original version by Kevin Ruland < kevin @ rodin . wustl . edu >
*
* This version is standard - compliant and compatible with gcc 3 . x .
*/
#ifndef ZFSTREAM_H
#define ZFSTREAM_H
#include <istream> // not iostream, since we don't need cin/cout
#include <ostream>
#include "zlib.h"
/*****************************************************************************/
/**
* @ brief Gzipped file stream buffer class .
*
* This class implements basic_filebuf for gzipped files . It doesn ' t yet support
* seeking ( allowed by zlib but slow / limited ) , putback and read / write access
* ( tricky ) . Otherwise , it attempts to be a drop - in replacement for the standard
* file streambuf .
*/
class gzfilebuf : public std::streambuf
{
public :
// Default constructor.
gzfilebuf();
// Destructor.
virtual
~gzfilebuf();
/**
* @ brief Set compression level and strategy on the fly .
* @ param comp_level Compression level ( see zlib . h for allowed values )
* @ param comp_strategy Compression strategy ( see zlib . h for allowed values )
* @ return Z_OK on success , Z_STREAM_ERROR otherwise .
*
* Unfortunately , these parameters cannot be modified separately , as the
* previous zfstream version assumed . Since the strategy is seldom changed ,
* it can default and setcompression ( level ) then becomes like the old
* setcompressionlevel ( level ) .
*/
int
setcompression(int comp_level,
int comp_strategy = Z_DEFAULT_STRATEGY);
/**
* @ brief Check if file is open .
* @ return True if file is open .
*/
bool
is_open() const { return (file != NULL); }
/**
* @ brief Open gzipped file .
* @ param name File name .
* @ param mode Open mode flags .
* @ return @ c this on success , NULL on failure .
*/
gzfilebuf*
open(const char * name,
std::ios_base::openmode mode);
/**
* @ brief Attach to already open gzipped file .
* @ param fd File descriptor .
* @ param mode Open mode flags .
* @ return @ c this on success , NULL on failure .
*/
gzfilebuf*
attach(int fd,
std::ios_base::openmode mode);
/**
* @ brief Close gzipped file .
* @ return @ c this on success , NULL on failure .
*/
gzfilebuf*
close();
protected :
/**
* @ brief Convert ios open mode int to mode string used by zlib .
* @ return True if valid mode flag combination .
*/
bool
open_mode(std::ios_base::openmode mode,
char * c_mode) const ;
/**
* @ brief Number of characters available in stream buffer .
* @ return Number of characters .
*
* This indicates number of characters in get area of stream buffer .
* These characters can be read without accessing the gzipped file .
*/
virtual std::streamsize
showmanyc();
/**
* @ brief Fill get area from gzipped file .
* @ return First character in get area on success , EOF on error .
*
* This actually reads characters from gzipped file to stream
* buffer . Always buffered .
*/
virtual int_type
underflow();
/**
* @ brief Write put area to gzipped file .
* @ param c Extra character to add to buffer contents .
* @ return Non - EOF on success , EOF on error .
*
* This actually writes characters in stream buffer to
* gzipped file . With unbuffered output this is done one
* character at a time .
*/
virtual int_type
overflow(int_type c = traits_type::eof());
/**
* @ brief Installs external stream buffer .
* @ param p Pointer to char buffer .
* @ param n Size of external buffer .
* @ return @ c this on success , NULL on failure .
*
* Call setbuf ( 0 , 0 ) to enable unbuffered output .
*/
virtual std::streambuf*
setbuf(char_type* p,
std::streamsize n);
/**
* @ brief Flush stream buffer to file .
* @ return 0 on success , - 1 on error .
*
* This calls underflow ( EOF ) to do the job .
*/
virtual int
sync();
//
// Some future enhancements
//
// virtual int_type uflow();
// virtual int_type pbackfail(int_type c = traits_type::eof());
// virtual pos_type
// seekoff(off_type off,
// std::ios_base::seekdir way,
// std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out);
// virtual pos_type
// seekpos(pos_type sp,
// std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out);
private :
/**
* @ brief Allocate internal buffer .
*
* This function is safe to call multiple times . It will ensure
* that a proper internal buffer exists if it is required . If the
* buffer already exists or is external , the buffer pointers will be
* reset to their original state .
*/
void
enable_buffer();
/**
* @ brief Destroy internal buffer .
*
* This function is safe to call multiple times . It will ensure
* that the internal buffer is deallocated if it exists . In any
* case , it will also reset the buffer pointers .
*/
void
disable_buffer();
/**
* Underlying file pointer .
*/
gzFile file;
/**
* Mode in which file was opened .
*/
std::ios_base::openmode io_mode;
/**
* @ brief True if this object owns file descriptor .
*
* This makes the class responsible for closing the file
* upon destruction .
*/
bool own_fd;
/**
* @ brief Stream buffer .
*
* For simplicity this remains allocated on the free store for the
* entire life span of the gzfilebuf object , unless replaced by setbuf .
*/
char_type* buffer;
/**
* @ brief Stream buffer size .
*
* Defaults to system default buffer size ( typically 8192 bytes ) .
* Modified by setbuf .
*/
std::streamsize buffer_size;
/**
* @ brief True if this object owns stream buffer .
*
* This makes the class responsible for deleting the buffer
* upon destruction .
*/
bool own_buffer;
};
/*****************************************************************************/
/**
* @ brief Gzipped file input stream class .
*
* This class implements ifstream for gzipped files . Seeking and putback
* is not supported yet .
*/
class gzifstream : public std::istream
{
public :
// Default constructor
gzifstream();
/**
* @ brief Construct stream on gzipped file to be opened .
* @ param name File name .
* @ param mode Open mode flags ( forced to contain ios : : in ) .
*/
explicit
gzifstream(const char * name,
std::ios_base::openmode mode = std::ios_base::in);
/**
* @ brief Construct stream on already open gzipped file .
* @ param fd File descriptor .
* @ param mode Open mode flags ( forced to contain ios : : in ) .
*/
explicit
gzifstream(int fd,
std::ios_base::openmode mode = std::ios_base::in);
/**
* Obtain underlying stream buffer .
*/
gzfilebuf*
rdbuf() const
{ return const_cast <gzfilebuf*>(&sb); }
/**
* @ brief Check if file is open .
* @ return True if file is open .
*/
bool
is_open() { return sb.is_open(); }
/**
* @ brief Open gzipped file .
* @ param name File name .
* @ param mode Open mode flags ( forced to contain ios : : in ) .
*
* Stream will be in state good ( ) if file opens successfully ;
* otherwise in state fail ( ) . This differs from the behavior of
* ifstream , which never sets the state to good ( ) and therefore
* won ' t allow you to reuse the stream for a second file unless
* you manually clear ( ) the state . The choice is a matter of
* convenience .
*/
void
open(const char * name,
std::ios_base::openmode mode = std::ios_base::in);
/**
* @ brief Attach to already open gzipped file .
* @ param fd File descriptor .
* @ param mode Open mode flags ( forced to contain ios : : in ) .
*
* Stream will be in state good ( ) if attach succeeded ; otherwise
* in state fail ( ) .
*/
void
attach(int fd,
std::ios_base::openmode mode = std::ios_base::in);
/**
* @ brief Close gzipped file .
*
* Stream will be in state fail ( ) if close failed .
*/
void
close();
private :
/**
* Underlying stream buffer .
*/
gzfilebuf sb;
};
/*****************************************************************************/
/**
* @ brief Gzipped file output stream class .
*
* This class implements ofstream for gzipped files . Seeking and putback
* is not supported yet .
*/
class gzofstream : public std::ostream
{
public :
// Default constructor
gzofstream();
/**
* @ brief Construct stream on gzipped file to be opened .
* @ param name File name .
* @ param mode Open mode flags ( forced to contain ios : : out ) .
*/
explicit
gzofstream(const char * name,
std::ios_base::openmode mode = std::ios_base::out);
/**
* @ brief Construct stream on already open gzipped file .
* @ param fd File descriptor .
* @ param mode Open mode flags ( forced to contain ios : : out ) .
*/
explicit
gzofstream(int fd,
std::ios_base::openmode mode = std::ios_base::out);
/**
* Obtain underlying stream buffer .
*/
gzfilebuf*
rdbuf() const
{ return const_cast <gzfilebuf*>(&sb); }
/**
* @ brief Check if file is open .
* @ return True if file is open .
*/
bool
is_open() { return sb.is_open(); }
/**
* @ brief Open gzipped file .
* @ param name File name .
* @ param mode Open mode flags ( forced to contain ios : : out ) .
*
* Stream will be in state good ( ) if file opens successfully ;
* otherwise in state fail ( ) . This differs from the behavior of
* ofstream , which never sets the state to good ( ) and therefore
* won ' t allow you to reuse the stream for a second file unless
* you manually clear ( ) the state . The choice is a matter of
* convenience .
*/
void
open(const char * name,
std::ios_base::openmode mode = std::ios_base::out);
/**
* @ brief Attach to already open gzipped file .
* @ param fd File descriptor .
* @ param mode Open mode flags ( forced to contain ios : : out ) .
*
* Stream will be in state good ( ) if attach succeeded ; otherwise
* in state fail ( ) .
*/
void
attach(int fd,
std::ios_base::openmode mode = std::ios_base::out);
/**
* @ brief Close gzipped file .
*
* Stream will be in state fail ( ) if close failed .
*/
void
close();
private :
/**
* Underlying stream buffer .
*/
gzfilebuf sb;
};
/*****************************************************************************/
/**
* @ brief Gzipped file output stream manipulator class .
*
* This class defines a two - argument manipulator for gzofstream . It is used
* as base for the setcompression ( int , int ) manipulator .
*/
template <typename T1, typename T2>
class gzomanip2
{
public :
// Allows insertor to peek at internals
template <typename Ta, typename Tb>
friend gzofstream&
operator <<(gzofstream&,
const gzomanip2<Ta,Tb>&);
// Constructor
gzomanip2(gzofstream& (*f)(gzofstream&, T1, T2),
T1 v1,
T2 v2);
private :
// Underlying manipulator function
gzofstream&
(*func)(gzofstream&, T1, T2);
// Arguments for manipulator function
T1 val1;
T2 val2;
};
/*****************************************************************************/
// Manipulator function thunks through to stream buffer
inline gzofstream&
setcompression(gzofstream &gzs, int l, int s = Z_DEFAULT_STRATEGY)
{
(gzs.rdbuf())->setcompression(l, s);
return gzs;
}
// Manipulator constructor stores arguments
template <typename T1, typename T2>
inline
gzomanip2<T1,T2>::gzomanip2(gzofstream &(*f)(gzofstream &, T1, T2),
T1 v1,
T2 v2)
: func(f), val1(v1), val2(v2)
{ }
// Insertor applies underlying manipulator function to stream
template <typename T1, typename T2>
inline gzofstream&
operator <<(gzofstream& s, const gzomanip2<T1,T2>& m)
{ return (*m.func)(s, m.val1, m.val2); }
// Insert this onto stream to simplify setting of compression level
inline gzomanip2<int ,int >
setcompression(int l, int s = Z_DEFAULT_STRATEGY)
{ return gzomanip2<int ,int >(&setcompression, l, s); }
#endif // ZFSTREAM_H
Messung V0.5 in Prozent C=91 H=93 G=91
¤ Dauer der Verarbeitung: 0.14 Sekunden
(vorverarbeitet am 2026-06-17)
¤
*© Formatika GbR, Deutschland