1 #ifndef BOOSTER_NOWIDE_FSTREAM_H
2 #define BOOSTER_NOWIDE_FSTREAM_H
4 #include <booster/config.h>
5 #include <booster/nowide/convert.h>
9 #if defined BOOSTER_WIN_NATIVE || defined BOOSTER_WORKAROUND_BROKEN_GCC_ON_DARWIN
10 #include <booster/streambuf.h>
11 #include <booster/nowide/cstdio.h>
21 #if !defined BOOSTER_WIN_NATIVE && !defined(BOOSTER_WORKAROUND_BROKEN_GCC_ON_DARWIN)
23 using std::basic_ifstream;
24 using std::basic_ofstream;
25 using std::basic_fstream;
26 using std::basic_filebuf;
33 #if defined(BOOSTER_WIN_NATIVE) || defined(BOOSTER_DOXYGEN_DOCS) || defined(BOOSTER_WORKAROUND_BROKEN_GCC_ON_DARWIN)
35 #if defined BOOSTER_MSVC
37 template<
typename CharType,
typename Traits = std::
char_traits<CharType> >
38 class basic_filebuf :
public std::basic_filebuf<CharType,Traits> {
40 typedef std::basic_filebuf<CharType,Traits> my_base_type;
41 basic_filebuf *open(
char const *s,std::ios_base::openmode mode)
44 if(my_base_type::open(
convert(s).c_str(),mode)) {
49 catch(bad_utf
const &e) {
61 stdio_iodev(stdio_iodev
const &);
62 void operator=(stdio_iodev
const &);
64 stdio_iodev(FILE *f) :
69 size_t read(
char *p,
size_t n)
71 return fread(p,1,n,file_);
73 size_t write(
char const *p,
size_t n)
75 size_t res = fwrite(p,1,n,file_);
83 fseek(file_,pos,SEEK_CUR);
86 fseek(file_,pos,SEEK_SET);
89 fseek(file_,pos,SEEK_END);
107 template<
typename CharType,
typename Traits = std::
char_traits<CharType> >
124 basic_filebuf *open(
char const *s,std::ios_base::openmode mode)
127 wchar_t const *smode = get_mode(mode);
137 FILE *f = _wfopen(name.c_str(),smode);
140 std::auto_ptr<io_device> dev(
new details::stdio_iodev(f));
151 return res ?
this : 0;
158 static wchar_t const *get_mode(std::ios_base::openmode mode)
166 if(mode == (std::ios_base::out))
168 if(mode == (std::ios_base::out | std::ios_base::app))
170 if(mode == (std::ios_base::app))
172 if(mode == (std::ios_base::out | std::ios_base::trunc))
174 if(mode == (std::ios_base::in))
176 if(mode == (std::ios_base::in | std::ios_base::out))
178 if(mode == (std::ios_base::in | std::ios_base::out | std::ios_base::trunc))
180 if(mode == (std::ios_base::in | std::ios_base::out | std::ios_base::app))
182 if(mode == (std::ios_base::in | std::ios_base::app))
184 if(mode == (std::ios_base::binary | std::ios_base::out))
186 if(mode == (std::ios_base::binary | std::ios_base::out | std::ios_base::app))
188 if(mode == (std::ios_base::binary | std::ios_base::app))
190 if(mode == (std::ios_base::binary | std::ios_base::out | std::ios_base::trunc))
192 if(mode == (std::ios_base::binary | std::ios_base::in))
194 if(mode == (std::ios_base::binary | std::ios_base::in | std::ios_base::out))
196 if(mode == (std::ios_base::binary | std::ios_base::in | std::ios_base::out | std::ios_base::trunc))
198 if(mode == (std::ios_base::binary | std::ios_base::in | std::ios_base::out | std::ios_base::app))
200 if(mode == (std::ios_base::binary | std::ios_base::in | std::ios_base::app))
213 template<
typename CharType,
typename Traits = std::
char_traits<CharType> >
218 typedef std::basic_istream<CharType,Traits> internal_stream_type;
223 buf_.reset(static_cast<internal_buffer_type *>(internal_stream_type::rdbuf()));
225 explicit basic_ifstream(
char const *file_name,std::ios_base::openmode mode = std::ios_base::in) :
228 buf_.reset(static_cast<internal_buffer_type *>(internal_stream_type::rdbuf()));
229 open(file_name,mode);
231 void open(
char const *file_name,std::ios_base::openmode mode = std::ios_base::in)
233 if(!buf_->open(file_name,mode | std::ios_base::in)) {
234 this->setstate(std::ios_base::failbit);
242 return buf_->is_open();
246 return buf_->is_open();
251 this->setstate(std::ios_base::failbit);
266 std::auto_ptr<internal_buffer_type> buf_;
273 template<
typename CharType,
typename Traits = std::
char_traits<CharType> >
278 typedef std::basic_ostream<CharType,Traits> internal_stream_type;
283 buf_.reset(static_cast<internal_buffer_type *>(internal_stream_type::rdbuf()));
285 explicit basic_ofstream(
char const *file_name,std::ios_base::openmode mode = std::ios_base::out) :
288 buf_.reset(static_cast<internal_buffer_type *>(internal_stream_type::rdbuf()));
289 open(file_name,mode);
291 void open(
char const *file_name,std::ios_base::openmode mode = std::ios_base::out)
293 if(!buf_->open(file_name,mode | std::ios_base::out)) {
294 this->setstate(std::ios_base::failbit);
302 return buf_->is_open();
306 return buf_->is_open();
311 this->setstate(std::ios_base::failbit);
326 std::auto_ptr<internal_buffer_type> buf_;
333 template<
typename CharType,
typename Traits = std::
char_traits<CharType> >
338 typedef std::basic_iostream<CharType,Traits> internal_stream_type;
343 buf_.reset(static_cast<internal_buffer_type *>(internal_stream_type::rdbuf()));
345 explicit basic_fstream(
char const *file_name,std::ios_base::openmode mode = std::ios_base::out | std::ios_base::in) :
348 buf_.reset(static_cast<internal_buffer_type *>(internal_stream_type::rdbuf()));
349 open(file_name,mode);
351 void open(
char const *file_name,std::ios_base::openmode mode = std::ios_base::out | std::ios_base::out)
353 if(!buf_->open(file_name,mode)) {
354 this->setstate(std::ios_base::failbit);
362 return buf_->is_open();
366 return buf_->is_open();
371 this->setstate(std::ios_base::failbit);
386 std::auto_ptr<internal_buffer_type> buf_;
Definition: fstream.h:274
this is an implementation of generic streambuffer
Definition: streambuf.h:70
This class is a base class of generic I/O device that can be used in very simple manner with booster:...
Definition: streambuf.h:19
BOOSTER_API std::string convert(wchar_t const *s)
Definition: fstream.h:334
pos_type
Definition: streambuf.h:24
basic_filebuf< char > filebuf
Definition: fstream.h:393
basic_ofstream< char > ofstream
Definition: fstream.h:401
Definition: fstream.h:108
Definition: fstream.h:115
Definition: fstream.h:214
basic_ifstream< char > ifstream
Definition: fstream.h:397
basic_fstream< char > fstream
Definition: fstream.h:405
This exception is thrown if invalid UTF-8 or UTF-16 is given as input.
Definition: convert.h:14