📄 multistream.h
字号:
//////////////////////////////////////////////////////////////////////////// Copyright (c) 2000, Yusuke Miyao/// You may distribute under the terms of the Artistic License.////// <id>$Id: MultiStream.h,v 1.5 2003/05/16 12:10:44 yusuke Exp $</id>/// <collection>Maximum Entropy Estimator</collection>/// <name>MultiStream.h</name>/// <overview>A stream with multiple files</overview>/////////////////////////////////////////////////////////////////////////#ifndef Amis_MultiStream_h_#define Amis_MultiStream_h_#include <amis/configure.h>#include <amis/ErrorBase.h>#include <fstream>#include <vector>AMIS_NAMESPACE_BEGIN/// <classdef>/// <name>multi_filebuf</name>/// <overview>Input buffer from multiple files</overview>/// <desc>An input buffer from multiple files extended from `filebuf'</desc>/// <body>class multi_filebuf : public std::filebuf {private: size_t pointer; std::vector< std::string > file_names;public: multi_filebuf( const std::vector< std::string >& names ) : std::filebuf() { pointer = 0; file_names = names; if ( pointer < file_names.size() ) { std::filebuf::open( file_names[ pointer ].c_str(), std::ios::in ); } } int uflow( void ) { int ret = std::filebuf::uflow(); if ( ret == EOF ) { ++pointer; if ( pointer < file_names.size() ) { std::filebuf::close(); std::filebuf::open( file_names[ pointer ].c_str(), std::ios::in ); } else { return EOF; } ret = std::filebuf::uflow(); } return ret; } int underflow( void ) { int ret = std::filebuf::underflow(); if ( ret == EOF ) { ++pointer; if ( pointer < file_names.size() ) { std::filebuf::close(); std::filebuf::open( file_names[ pointer ].c_str(), std::ios::in ); } else { return EOF; } ret = std::filebuf::underflow(); } return ret; }};/// </body>/// </classdef>/// <classdef>/// <name>MultiIFStream</name>/// <overview>Input stream from multiple files</overview>/// <desc>An input stream from multiple files</desc>/// <body>class MultiIFStream : public std::istream {public: MultiIFStream( const std::vector< std::string >& names ) : std::istream( NULL ) { multi_filebuf* buf = new multi_filebuf( names ); if ( buf->is_open() ) { init( buf ); } else { delete buf; init( NULL ); } } virtual ~MultiIFStream() { if ( rdbuf() != NULL ) { delete rdbuf(); } }};/// </body>/// </classdef>AMIS_NAMESPACE_END#endif // MultiStream_h_// end of MultiStream.h
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -