|
1 // boost/filesystem/fstream.hpp --------------------------------------------// |
|
2 |
|
3 // Copyright Beman Dawes 2002. |
|
4 // Use, modification, and distribution is subject to the Boost Software |
|
5 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at |
|
6 // http://www.boost.org/LICENSE_1_0.txt) |
|
7 |
|
8 // See library home page at http://www.boost.org/libs/filesystem |
|
9 |
|
10 //----------------------------------------------------------------------------// |
|
11 |
|
12 #ifndef BOOST_FILESYSTEM_FSTREAM_HPP |
|
13 #define BOOST_FILESYSTEM_FSTREAM_HPP |
|
14 |
|
15 #include <boost/filesystem/operations.hpp> // for 8.3 hack (see below) |
|
16 #include <boost/utility/enable_if.hpp> |
|
17 #include <boost/detail/workaround.hpp> |
|
18 |
|
19 #include <iosfwd> |
|
20 #include <fstream> |
|
21 |
|
22 #include <boost/config/abi_prefix.hpp> // must be the last #include |
|
23 |
|
24 // NOTE: fstream.hpp for Boost 1.32.0 and earlier supplied workarounds for |
|
25 // various compiler problems. They have been removed to ease development of the |
|
26 // basic i18n functionality. Once the new interface is stable, the workarounds |
|
27 // will be reinstated for any compilers that otherwise can support the rest of |
|
28 // the library after internationalization. |
|
29 |
|
30 namespace boost |
|
31 { |
|
32 namespace filesystem |
|
33 { |
|
34 namespace detail |
|
35 { |
|
36 # if defined(BOOST_WINDOWS_API) && !defined(BOOST_FILESYSTEM_NARROW_ONLY) |
|
37 # if !defined(BOOST_DINKUMWARE_STDLIB) || BOOST_DINKUMWARE_STDLIB < 405 |
|
38 // The 8.3 hack: |
|
39 // C++98 does not supply a wchar_t open, so try to get an equivalent |
|
40 // narrow char name based on the short, so-called 8.3, name. |
|
41 // Not needed for Dinkumware 405 and later as they do supply wchar_t open. |
|
42 BOOST_FILESYSTEM_DECL bool create_file_api( const std::wstring & ph, |
|
43 std::ios_base::openmode mode ); // true if succeeds |
|
44 BOOST_FILESYSTEM_DECL std::string narrow_path_api( |
|
45 const std::wstring & ph ); // return is empty if fails |
|
46 |
|
47 inline std::string path_proxy( const std::wstring & file_ph, |
|
48 std::ios_base::openmode mode ) |
|
49 // Return a non-existant path if cannot supply narrow short path. |
|
50 // An empty path doesn't work because some Dinkumware versions |
|
51 // assert the path is non-empty. |
|
52 { |
|
53 std::string narrow_ph; |
|
54 bool created_file( false ); |
|
55 if ( !exists( file_ph ) |
|
56 && (mode & std::ios_base::out) != 0 |
|
57 && create_file_api( file_ph, mode ) ) |
|
58 { |
|
59 created_file = true; |
|
60 } |
|
61 narrow_ph = narrow_path_api( file_ph ); |
|
62 if ( narrow_ph.empty() ) |
|
63 { |
|
64 if ( created_file ) remove_api( file_ph ); |
|
65 narrow_ph = "\x01"; |
|
66 } |
|
67 return narrow_ph; |
|
68 } |
|
69 # else |
|
70 // Dinkumware 405 and later does supply wchar_t functions |
|
71 inline const std::wstring & path_proxy( const std::wstring & file_ph, |
|
72 std::ios_base::openmode ) |
|
73 { return file_ph; } |
|
74 # endif |
|
75 # endif |
|
76 |
|
77 inline const std::string & path_proxy( const std::string & file_ph, |
|
78 std::ios_base::openmode ) |
|
79 { return file_ph; } |
|
80 |
|
81 } // namespace detail |
|
82 |
|
83 template < class charT, class traits = std::char_traits<charT> > |
|
84 class basic_filebuf : public std::basic_filebuf<charT,traits> |
|
85 { |
|
86 private: // disallow copying |
|
87 basic_filebuf( const basic_filebuf & ); |
|
88 const basic_filebuf & operator=( const basic_filebuf & ); |
|
89 public: |
|
90 basic_filebuf() {} |
|
91 virtual ~basic_filebuf() {} |
|
92 |
|
93 # ifndef BOOST_FILESYSTEM_NARROW_ONLY |
|
94 template<class Path> |
|
95 typename boost::enable_if<is_basic_path<Path>, |
|
96 basic_filebuf<charT,traits> *>::type |
|
97 open( const Path & file_ph, std::ios_base::openmode mode ); |
|
98 |
|
99 basic_filebuf<charT,traits> * |
|
100 open( const wpath & file_ph, std::ios_base::openmode mode ); |
|
101 # endif |
|
102 |
|
103 # if !BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) // VC++ 6.0 can't handle this |
|
104 basic_filebuf<charT,traits> * |
|
105 open( const path & file_ph, std::ios_base::openmode mode ); |
|
106 # endif |
|
107 }; |
|
108 |
|
109 template < class charT, class traits = std::char_traits<charT> > |
|
110 class basic_ifstream : public std::basic_ifstream<charT,traits> |
|
111 { |
|
112 private: // disallow copying |
|
113 basic_ifstream( const basic_ifstream & ); |
|
114 const basic_ifstream & operator=( const basic_ifstream & ); |
|
115 public: |
|
116 basic_ifstream() {} |
|
117 |
|
118 // use two signatures, rather than one signature with default second |
|
119 // argument, to workaround VC++ 7.1 bug (ID VSWhidbey 38416) |
|
120 |
|
121 # ifndef BOOST_FILESYSTEM_NARROW_ONLY |
|
122 template<class Path> |
|
123 explicit basic_ifstream( const Path & file_ph, |
|
124 typename boost::enable_if<is_basic_path<Path> >::type* dummy = 0 ); |
|
125 |
|
126 template<class Path> |
|
127 basic_ifstream( const Path & file_ph, std::ios_base::openmode mode, |
|
128 typename boost::enable_if<is_basic_path<Path> >::type* dummy = 0 ); |
|
129 |
|
130 template<class Path> |
|
131 typename boost::enable_if<is_basic_path<Path>, void>::type |
|
132 open( const Path & file_ph ); |
|
133 |
|
134 template<class Path> |
|
135 typename boost::enable_if<is_basic_path<Path>, void>::type |
|
136 open( const Path & file_ph, std::ios_base::openmode mode ); |
|
137 |
|
138 explicit basic_ifstream( const wpath & file_ph ); |
|
139 basic_ifstream( const wpath & file_ph, std::ios_base::openmode mode ); |
|
140 void open( const wpath & file_ph ); |
|
141 void open( const wpath & file_ph, std::ios_base::openmode mode ); |
|
142 # endif |
|
143 |
|
144 explicit basic_ifstream( const path & file_ph ); |
|
145 basic_ifstream( const path & file_ph, std::ios_base::openmode mode ); |
|
146 # if !BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) // VC++ 6.0 can't handle this |
|
147 void open( const path & file_ph ); |
|
148 void open( const path & file_ph, std::ios_base::openmode mode ); |
|
149 # endif |
|
150 virtual ~basic_ifstream() {} |
|
151 }; |
|
152 |
|
153 template < class charT, class traits = std::char_traits<charT> > |
|
154 class basic_ofstream : public std::basic_ofstream<charT,traits> |
|
155 { |
|
156 private: // disallow copying |
|
157 basic_ofstream( const basic_ofstream & ); |
|
158 const basic_ofstream & operator=( const basic_ofstream & ); |
|
159 public: |
|
160 basic_ofstream() {} |
|
161 |
|
162 // use two signatures, rather than one signature with default second |
|
163 // argument, to workaround VC++ 7.1 bug (ID VSWhidbey 38416) |
|
164 |
|
165 # ifndef BOOST_FILESYSTEM_NARROW_ONLY |
|
166 |
|
167 template<class Path> |
|
168 explicit basic_ofstream( const Path & file_ph, |
|
169 typename boost::enable_if<is_basic_path<Path> >::type* dummy = 0 ); |
|
170 explicit basic_ofstream( const wpath & file_ph ); |
|
171 |
|
172 template<class Path> |
|
173 basic_ofstream( const Path & file_ph, std::ios_base::openmode mode, |
|
174 typename boost::enable_if<is_basic_path<Path> >::type* dummy = 0 ); |
|
175 basic_ofstream( const wpath & file_ph, std::ios_base::openmode mode ); |
|
176 |
|
177 template<class Path> |
|
178 typename boost::enable_if<is_basic_path<Path>, void>::type |
|
179 open( const Path & file_ph ); |
|
180 void open( const wpath & file_ph ); |
|
181 |
|
182 template<class Path> |
|
183 typename boost::enable_if<is_basic_path<Path>, void>::type |
|
184 open( const Path & file_ph, std::ios_base::openmode mode ); |
|
185 void open( const wpath & file_ph, std::ios_base::openmode mode ); |
|
186 |
|
187 # endif |
|
188 |
|
189 explicit basic_ofstream( const path & file_ph ); |
|
190 basic_ofstream( const path & file_ph, std::ios_base::openmode mode ); |
|
191 # if !BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) // VC++ 6.0 can't handle this |
|
192 void open( const path & file_ph ); |
|
193 void open( const path & file_ph, std::ios_base::openmode mode ); |
|
194 # endif |
|
195 virtual ~basic_ofstream() {} |
|
196 }; |
|
197 |
|
198 template < class charT, class traits = std::char_traits<charT> > |
|
199 class basic_fstream : public std::basic_fstream<charT,traits> |
|
200 { |
|
201 private: // disallow copying |
|
202 basic_fstream( const basic_fstream & ); |
|
203 const basic_fstream & operator=( const basic_fstream & ); |
|
204 public: |
|
205 basic_fstream() {} |
|
206 |
|
207 // use two signatures, rather than one signature with default second |
|
208 // argument, to workaround VC++ 7.1 bug (ID VSWhidbey 38416) |
|
209 |
|
210 # ifndef BOOST_FILESYSTEM_NARROW_ONLY |
|
211 |
|
212 template<class Path> |
|
213 explicit basic_fstream( const Path & file_ph, |
|
214 typename boost::enable_if<is_basic_path<Path> >::type* dummy = 0 ); |
|
215 explicit basic_fstream( const wpath & file_ph ); |
|
216 |
|
217 template<class Path> |
|
218 basic_fstream( const Path & file_ph, std::ios_base::openmode mode, |
|
219 typename boost::enable_if<is_basic_path<Path> >::type* dummy = 0 ); |
|
220 basic_fstream( const wpath & file_ph, std::ios_base::openmode mode ); |
|
221 |
|
222 template<class Path> |
|
223 typename boost::enable_if<is_basic_path<Path>, void>::type |
|
224 open( const Path & file_ph ); |
|
225 void open( const wpath & file_ph ); |
|
226 |
|
227 template<class Path> |
|
228 typename boost::enable_if<is_basic_path<Path>, void>::type |
|
229 open( const Path & file_ph, std::ios_base::openmode mode ); |
|
230 void open( const wpath & file_ph, std::ios_base::openmode mode ); |
|
231 |
|
232 # endif |
|
233 |
|
234 explicit basic_fstream( const path & file_ph ); |
|
235 basic_fstream( const path & file_ph, std::ios_base::openmode mode ); |
|
236 # if !BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) // VC++ 6.0 can't handle this |
|
237 void open( const path & file_ph ); |
|
238 void open( const path & file_ph, std::ios_base::openmode mode ); |
|
239 # endif |
|
240 virtual ~basic_fstream() {} |
|
241 |
|
242 }; |
|
243 |
|
244 typedef basic_filebuf<char> filebuf; |
|
245 typedef basic_ifstream<char> ifstream; |
|
246 typedef basic_ofstream<char> ofstream; |
|
247 typedef basic_fstream<char> fstream; |
|
248 |
|
249 # ifndef BOOST_FILESYSTEM_NARROW_ONLY |
|
250 typedef basic_filebuf<wchar_t> wfilebuf; |
|
251 typedef basic_ifstream<wchar_t> wifstream; |
|
252 typedef basic_fstream<wchar_t> wfstream; |
|
253 typedef basic_ofstream<wchar_t> wofstream; |
|
254 # endif |
|
255 |
|
256 # ifndef BOOST_FILESYSTEM_NARROW_ONLY |
|
257 |
|
258 // basic_filebuf definitions -----------------------------------------------// |
|
259 |
|
260 template <class charT, class traits> |
|
261 template<class Path> |
|
262 typename boost::enable_if<is_basic_path<Path>, |
|
263 basic_filebuf<charT,traits> *>::type |
|
264 basic_filebuf<charT,traits>::open( const Path & file_ph, |
|
265 std::ios_base::openmode mode ) |
|
266 { |
|
267 return (std::basic_filebuf<charT,traits>::open( detail::path_proxy( |
|
268 file_ph.external_file_string(), mode ).c_str(), mode ) |
|
269 == 0) ? 0 : this; |
|
270 } |
|
271 |
|
272 template <class charT, class traits> |
|
273 basic_filebuf<charT,traits> * |
|
274 basic_filebuf<charT, traits>::open( const wpath & file_ph, |
|
275 std::ios_base::openmode mode ) |
|
276 { |
|
277 return this->BOOST_NESTED_TEMPLATE open<wpath>( file_ph, mode ); |
|
278 } |
|
279 |
|
280 // basic_ifstream definitions ----------------------------------------------// |
|
281 |
|
282 template <class charT, class traits> template<class Path> |
|
283 basic_ifstream<charT,traits>::basic_ifstream(const Path & file_ph, |
|
284 typename boost::enable_if<is_basic_path<Path> >::type* ) |
|
285 : std::basic_ifstream<charT,traits>( |
|
286 detail::path_proxy( file_ph.external_file_string(), |
|
287 std::ios_base::in ).c_str(), std::ios_base::in ) {} |
|
288 |
|
289 template <class charT, class traits> |
|
290 basic_ifstream<charT,traits>::basic_ifstream( const wpath & file_ph ) |
|
291 : std::basic_ifstream<charT,traits>( |
|
292 detail::path_proxy( file_ph.external_file_string(), |
|
293 std::ios_base::in ).c_str(), std::ios_base::in ) {} |
|
294 |
|
295 template <class charT, class traits> template<class Path> |
|
296 basic_ifstream<charT,traits>::basic_ifstream( const Path & file_ph, |
|
297 std::ios_base::openmode mode, |
|
298 typename boost::enable_if<is_basic_path<Path> >::type* ) |
|
299 : std::basic_ifstream<charT,traits>( |
|
300 detail::path_proxy( file_ph.external_file_string(), |
|
301 mode ).c_str(), mode | std::ios_base::in ) {} |
|
302 |
|
303 template <class charT, class traits> |
|
304 basic_ifstream<charT,traits>::basic_ifstream( const wpath & file_ph, |
|
305 std::ios_base::openmode mode ) |
|
306 : std::basic_ifstream<charT,traits>( |
|
307 detail::path_proxy( file_ph.external_file_string(), |
|
308 mode ).c_str(), mode | std::ios_base::in ) {} |
|
309 |
|
310 template <class charT, class traits> template<class Path> |
|
311 typename boost::enable_if<is_basic_path<Path>, void>::type |
|
312 basic_ifstream<charT,traits>::open( const Path & file_ph ) |
|
313 { |
|
314 std::basic_ifstream<charT,traits>::open( |
|
315 detail::path_proxy( file_ph.external_file_string(), |
|
316 std::ios_base::in ).c_str(), std::ios_base::in ); |
|
317 } |
|
318 |
|
319 template <class charT, class traits> |
|
320 void basic_ifstream<charT,traits>::open( const wpath & file_ph ) |
|
321 { |
|
322 std::basic_ifstream<charT,traits>::open( |
|
323 detail::path_proxy( file_ph.external_file_string(), |
|
324 std::ios_base::in ).c_str(), std::ios_base::in ); |
|
325 } |
|
326 |
|
327 template <class charT, class traits> template<class Path> |
|
328 typename boost::enable_if<is_basic_path<Path>, void>::type |
|
329 basic_ifstream<charT,traits>::open( const Path & file_ph, |
|
330 std::ios_base::openmode mode ) |
|
331 { |
|
332 std::basic_ifstream<charT,traits>::open( |
|
333 detail::path_proxy( file_ph.external_file_string(), |
|
334 mode ).c_str(), mode | std::ios_base::in ); |
|
335 } |
|
336 |
|
337 template <class charT, class traits> |
|
338 void basic_ifstream<charT,traits>::open( const wpath & file_ph, |
|
339 std::ios_base::openmode mode ) |
|
340 { |
|
341 std::basic_ifstream<charT,traits>::open( |
|
342 detail::path_proxy( file_ph.external_file_string(), |
|
343 mode ).c_str(), mode | std::ios_base::in ); |
|
344 } |
|
345 |
|
346 // basic_ofstream definitions ----------------------------------------------// |
|
347 |
|
348 template <class charT, class traits> template<class Path> |
|
349 basic_ofstream<charT,traits>::basic_ofstream(const Path & file_ph, |
|
350 typename boost::enable_if<is_basic_path<Path> >::type* ) |
|
351 : std::basic_ofstream<charT,traits>( |
|
352 detail::path_proxy( file_ph.external_file_string(), |
|
353 std::ios_base::out ).c_str(), std::ios_base::out ) {} |
|
354 |
|
355 template <class charT, class traits> |
|
356 basic_ofstream<charT,traits>::basic_ofstream( const wpath & file_ph ) |
|
357 : std::basic_ofstream<charT,traits>( |
|
358 detail::path_proxy( file_ph.external_file_string(), |
|
359 std::ios_base::out ).c_str(), std::ios_base::out ) {} |
|
360 |
|
361 template <class charT, class traits> template<class Path> |
|
362 basic_ofstream<charT,traits>::basic_ofstream( const Path & file_ph, |
|
363 std::ios_base::openmode mode, |
|
364 typename boost::enable_if<is_basic_path<Path> >::type* ) |
|
365 : std::basic_ofstream<charT,traits>( |
|
366 detail::path_proxy( file_ph.external_file_string(), |
|
367 mode ).c_str(), mode | std::ios_base::out ) {} |
|
368 |
|
369 template <class charT, class traits> |
|
370 basic_ofstream<charT,traits>::basic_ofstream( const wpath & file_ph, |
|
371 std::ios_base::openmode mode ) |
|
372 : std::basic_ofstream<charT,traits>( |
|
373 detail::path_proxy( file_ph.external_file_string(), |
|
374 mode ).c_str(), mode | std::ios_base::out ) {} |
|
375 |
|
376 template <class charT, class traits> template<class Path> |
|
377 typename boost::enable_if<is_basic_path<Path>, void>::type |
|
378 basic_ofstream<charT,traits>::open( const Path & file_ph ) |
|
379 { |
|
380 std::basic_ofstream<charT,traits>::open( |
|
381 detail::path_proxy( file_ph.external_file_string(), |
|
382 std::ios_base::out ).c_str(), std::ios_base::out ); |
|
383 } |
|
384 |
|
385 template <class charT, class traits> |
|
386 void basic_ofstream<charT,traits>::open( const wpath & file_ph ) |
|
387 { |
|
388 std::basic_ofstream<charT,traits>::open( |
|
389 detail::path_proxy( file_ph.external_file_string(), |
|
390 std::ios_base::out ).c_str(), std::ios_base::out ); |
|
391 } |
|
392 |
|
393 template <class charT, class traits> template<class Path> |
|
394 typename boost::enable_if<is_basic_path<Path>, void>::type |
|
395 basic_ofstream<charT,traits>::open( const Path & file_ph, |
|
396 std::ios_base::openmode mode ) |
|
397 { |
|
398 std::basic_ofstream<charT,traits>::open( |
|
399 detail::path_proxy( file_ph.external_file_string(), |
|
400 mode ).c_str(), mode | std::ios_base::out ); |
|
401 } |
|
402 |
|
403 template <class charT, class traits> |
|
404 void basic_ofstream<charT,traits>::open( const wpath & file_ph, |
|
405 std::ios_base::openmode mode ) |
|
406 { |
|
407 std::basic_ofstream<charT,traits>::open( |
|
408 detail::path_proxy( file_ph.external_file_string(), |
|
409 mode ).c_str(), mode | std::ios_base::out ); |
|
410 } |
|
411 |
|
412 // basic_fstream definitions -----------------------------------------------// |
|
413 |
|
414 template <class charT, class traits> template<class Path> |
|
415 basic_fstream<charT,traits>::basic_fstream(const Path & file_ph, |
|
416 typename boost::enable_if<is_basic_path<Path> >::type* ) |
|
417 : std::basic_fstream<charT,traits>( |
|
418 detail::path_proxy( file_ph.external_file_string(), |
|
419 std::ios_base::in|std::ios_base::out ).c_str(), |
|
420 std::ios_base::in|std::ios_base::out ) {} |
|
421 |
|
422 template <class charT, class traits> |
|
423 basic_fstream<charT,traits>::basic_fstream( const wpath & file_ph ) |
|
424 : std::basic_fstream<charT,traits>( |
|
425 detail::path_proxy( file_ph.external_file_string(), |
|
426 std::ios_base::in|std::ios_base::out ).c_str(), |
|
427 std::ios_base::in|std::ios_base::out ) {} |
|
428 |
|
429 template <class charT, class traits> template<class Path> |
|
430 basic_fstream<charT,traits>::basic_fstream( const Path & file_ph, |
|
431 std::ios_base::openmode mode, |
|
432 typename boost::enable_if<is_basic_path<Path> >::type* ) |
|
433 : std::basic_fstream<charT,traits>( |
|
434 detail::path_proxy( file_ph.external_file_string(), |
|
435 mode ).c_str(), mode | std::ios_base::in | std::ios_base::out ) {} |
|
436 |
|
437 template <class charT, class traits> |
|
438 basic_fstream<charT,traits>::basic_fstream( const wpath & file_ph, |
|
439 std::ios_base::openmode mode ) |
|
440 : std::basic_fstream<charT,traits>( |
|
441 detail::path_proxy( file_ph.external_file_string(), |
|
442 mode ).c_str(), mode | std::ios_base::in | std::ios_base::out ) {} |
|
443 |
|
444 template <class charT, class traits> template<class Path> |
|
445 typename boost::enable_if<is_basic_path<Path>, void>::type |
|
446 basic_fstream<charT,traits>::open( const Path & file_ph ) |
|
447 { |
|
448 std::basic_fstream<charT,traits>::open( |
|
449 detail::path_proxy( file_ph.external_file_string(), |
|
450 std::ios_base::in|std::ios_base::out ).c_str(), |
|
451 std::ios_base::in|std::ios_base::out ); |
|
452 } |
|
453 |
|
454 template <class charT, class traits> |
|
455 void basic_fstream<charT,traits>::open( const wpath & file_ph ) |
|
456 { |
|
457 std::basic_fstream<charT,traits>::open( |
|
458 detail::path_proxy( file_ph.external_file_string(), |
|
459 std::ios_base::in|std::ios_base::out ).c_str(), |
|
460 std::ios_base::in|std::ios_base::out ); |
|
461 } |
|
462 |
|
463 template <class charT, class traits> template<class Path> |
|
464 typename boost::enable_if<is_basic_path<Path>, void>::type |
|
465 basic_fstream<charT,traits>::open( const Path & file_ph, |
|
466 std::ios_base::openmode mode ) |
|
467 { |
|
468 std::basic_fstream<charT,traits>::open( |
|
469 detail::path_proxy( file_ph.external_file_string(), |
|
470 mode ).c_str(), mode | std::ios_base::in | std::ios_base::out ); |
|
471 } |
|
472 |
|
473 template <class charT, class traits> |
|
474 void basic_fstream<charT,traits>::open( const wpath & file_ph, |
|
475 std::ios_base::openmode mode ) |
|
476 { |
|
477 std::basic_fstream<charT,traits>::open( |
|
478 detail::path_proxy( file_ph.external_file_string(), |
|
479 mode ).c_str(), mode | std::ios_base::in | std::ios_base::out ); |
|
480 } |
|
481 |
|
482 # endif |
|
483 |
|
484 # if !BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) // VC++ 6.0 can't handle this |
|
485 template <class charT, class traits> |
|
486 basic_filebuf<charT,traits> * |
|
487 basic_filebuf<charT, traits>::open( const path & file_ph, |
|
488 std::ios_base::openmode mode ) |
|
489 { |
|
490 return std::basic_filebuf<charT,traits>::open( |
|
491 file_ph.file_string().c_str(), mode ) == 0 ? 0 : this; |
|
492 } |
|
493 # endif |
|
494 |
|
495 template <class charT, class traits> |
|
496 basic_ifstream<charT,traits>::basic_ifstream( const path & file_ph ) |
|
497 : std::basic_ifstream<charT,traits>( |
|
498 file_ph.file_string().c_str(), std::ios_base::in ) {} |
|
499 |
|
500 template <class charT, class traits> |
|
501 basic_ifstream<charT,traits>::basic_ifstream( const path & file_ph, |
|
502 std::ios_base::openmode mode ) |
|
503 : std::basic_ifstream<charT,traits>( |
|
504 file_ph.file_string().c_str(), mode ) {} |
|
505 |
|
506 # if !BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) // VC++ 6.0 can't handle this |
|
507 template <class charT, class traits> |
|
508 void basic_ifstream<charT,traits>::open( const path & file_ph ) |
|
509 { |
|
510 std::basic_ifstream<charT,traits>::open( |
|
511 file_ph.file_string().c_str(), std::ios_base::in ); |
|
512 } |
|
513 |
|
514 template <class charT, class traits> |
|
515 void basic_ifstream<charT,traits>::open( const path & file_ph, |
|
516 std::ios_base::openmode mode ) |
|
517 { |
|
518 std::basic_ifstream<charT,traits>::open( |
|
519 file_ph.file_string().c_str(), mode ); |
|
520 } |
|
521 # endif |
|
522 |
|
523 template <class charT, class traits> |
|
524 basic_ofstream<charT,traits>::basic_ofstream( const path & file_ph ) |
|
525 : std::basic_ofstream<charT,traits>( |
|
526 file_ph.file_string().c_str(), std::ios_base::out ) {} |
|
527 |
|
528 template <class charT, class traits> |
|
529 basic_ofstream<charT,traits>::basic_ofstream( const path & file_ph, |
|
530 std::ios_base::openmode mode ) |
|
531 : std::basic_ofstream<charT,traits>( |
|
532 file_ph.file_string().c_str(), mode ) {} |
|
533 |
|
534 # if !BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) // VC++ 6.0 can't handle this |
|
535 template <class charT, class traits> |
|
536 void basic_ofstream<charT,traits>::open( const path & file_ph ) |
|
537 { |
|
538 std::basic_ofstream<charT,traits>::open( |
|
539 file_ph.file_string().c_str(), std::ios_base::out ); |
|
540 } |
|
541 |
|
542 template <class charT, class traits> |
|
543 void basic_ofstream<charT,traits>::open( const path & file_ph, |
|
544 std::ios_base::openmode mode ) |
|
545 { |
|
546 std::basic_ofstream<charT,traits>::open( |
|
547 file_ph.file_string().c_str(), mode ); |
|
548 } |
|
549 # endif |
|
550 |
|
551 template <class charT, class traits> |
|
552 basic_fstream<charT,traits>::basic_fstream( const path & file_ph ) |
|
553 : std::basic_fstream<charT,traits>( |
|
554 file_ph.file_string().c_str(), |
|
555 std::ios_base::in|std::ios_base::out ) {} |
|
556 |
|
557 |
|
558 template <class charT, class traits> |
|
559 basic_fstream<charT,traits>::basic_fstream( const path & file_ph, |
|
560 std::ios_base::openmode mode ) |
|
561 : std::basic_fstream<charT,traits>( |
|
562 file_ph.file_string().c_str(), mode ) {} |
|
563 |
|
564 # if !BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) // VC++ 6.0 can't handle this |
|
565 template <class charT, class traits> |
|
566 void basic_fstream<charT,traits>::open( const path & file_ph ) |
|
567 { |
|
568 std::basic_fstream<charT,traits>::open( |
|
569 file_ph.file_string().c_str(), std::ios_base::in|std::ios_base::out ); |
|
570 } |
|
571 |
|
572 template <class charT, class traits> |
|
573 void basic_fstream<charT,traits>::open( const path & file_ph, |
|
574 std::ios_base::openmode mode ) |
|
575 { |
|
576 std::basic_fstream<charT,traits>::open( |
|
577 file_ph.file_string().c_str(), mode ); |
|
578 } |
|
579 # endif |
|
580 } // namespace filesystem |
|
581 } // namespace boost |
|
582 |
|
583 #include <boost/config/abi_suffix.hpp> // pops abi_prefix.hpp pragmas |
|
584 #endif // BOOST_FILESYSTEM_FSTREAM_HPP |