1<?xml version="1.0" encoding="UTF-8" standalone="no"?> 2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Chapter 27. Input and Output</title><meta name="generator" content="DocBook XSL Stylesheets Vsnapshot" /><meta name="keywords" content="ISO C++, library" /><meta name="keywords" content="ISO C++, runtime, library" /><link rel="home" href="../index.html" title="The GNU C++ Library" /><link rel="up" href="extensions.html" title="Part III. Extensions" /><link rel="prev" href="ext_iterators.html" title="Chapter 26. Iterators" /><link rel="next" href="ext_demangling.html" title="Chapter 28. Demangling" /></head><body><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 27. Input and Output</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ext_iterators.html">Prev</a> </td><th width="60%" align="center">Part III. 3 Extensions 4 5</th><td width="20%" align="right"> <a accesskey="n" href="ext_demangling.html">Next</a></td></tr></table><hr /></div><div class="chapter"><div class="titlepage"><div><div><h2 class="title"><a id="manual.ext.io"></a>Chapter 27. Input and Output</h2></div></div></div><div class="toc"><p><strong>Table of Contents</strong></p><dl class="toc"><dt><span class="section"><a href="ext_io.html#manual.ext.io.filebuf_derived">Derived filebufs</a></span></dt></dl></div><p> 6 Extensions allowing <code class="code">filebuf</code>s to be constructed from 7 "C" types like FILE*s and file descriptors. 8 </p><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="manual.ext.io.filebuf_derived"></a>Derived filebufs</h2></div></div></div><p>The v2 library included non-standard extensions to construct 9 <code class="code">std::filebuf</code>s from C stdio types such as 10 <code class="code">FILE*</code>s and POSIX file descriptors. 11 Today the recommended way to use stdio types with libstdc++ 12 IOStreams is via the <code class="code">stdio_filebuf</code> class (see below), 13 but earlier releases provided slightly different mechanisms. 14 </p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>3.0.x <code class="code">filebuf</code>s have another ctor with this signature: 15 <code class="code">basic_filebuf(__c_file_type*, ios_base::openmode, int_type); 16 </code> 17 This comes in very handy in a number of places, such as 18 attaching Unix sockets, pipes, and anything else which uses file 19 descriptors, into the IOStream buffering classes. The three 20 arguments are as follows: 21 </p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: circle; "><li class="listitem"><p><code class="code">__c_file_type* F </code> 22 // the __c_file_type typedef usually boils down to stdio's FILE 23 </p></li><li class="listitem"><p><code class="code">ios_base::openmode M </code> 24 // same as all the other uses of openmode 25 </p></li><li class="listitem"><p><code class="code">int_type B </code> 26 // buffer size, defaults to BUFSIZ if not specified 27 </p></li></ul></div><p> 28 For those wanting to use file descriptors instead of FILE*'s, I 29 invite you to contemplate the mysteries of C's <code class="code">fdopen()</code>. 30 </p></li><li class="listitem"><p>In library snapshot 3.0.95 and later, <code class="code">filebuf</code>s bring 31 back an old extension: the <code class="code">fd()</code> member function. The 32 integer returned from this function can be used for whatever file 33 descriptors can be used for on your platform. Naturally, the 34 library cannot track what you do on your own with a file descriptor, 35 so if you perform any I/O directly, don't expect the library to be 36 aware of it. 37 </p></li><li class="listitem"><p>Beginning with 3.1, the extra 38 <code class="classname">basic_filebuf</code> constructor and 39 the <code class="code">fd()</code> function were removed from the standard 40 filebuf. Instead, 41 <code class="filename"><ext/stdio_filebuf.h></code> 42 contains a derived class template called 43 <code class="classname">__gnu_cxx::stdio_filebuf</code>. 44 This class can be constructed from a C <code class="code">FILE*</code> or a file 45 descriptor, and provides the <code class="code">fd()</code> function. 46 </p></li></ul></div></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ext_iterators.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="extensions.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ext_demangling.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 26. Iterators </td><td width="20%" align="center"><a accesskey="h" href="../index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 28. Demangling</td></tr></table></div></body></html>