<!--
    Licensed to the Apache Software  Foundation (ASF) under one or more
    contributor  license agreements.  See  the NOTICE  file distributed
    with  this  work  for  additional information  regarding  copyright
    ownership.   The ASF  licenses this  file to  you under  the Apache
    License, Version  2.0 (the  License); you may  not use  this file
    except in  compliance with the License.   You may obtain  a copy of
    the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the  License is distributed on an  "AS IS" BASIS,
    WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
    implied.   See  the License  for  the  specific language  governing
    permissions and limitations under the License.

    Copyright 1999-2007 Rogue Wave Software, Inc.
-->

<HTML>
<HEAD>
<TITLE>Iostreams</TITLE>
<LINK REL=StyleSheet HREF="../rw.css" TYPE="text/css" TITLE="Apache stdcxx Stylesheet"></HEAD>
<BODY BGCOLOR=#FFFFFF>
<A HREF="26-9.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><A HREF="27.html"><IMG SRC="images/bnext.gif" WIDTH=25 HEIGHT=21 ALT="Next file" BORDER=O></A><DIV CLASS="DOCUMENTNAME"><B>Apache C++ Standard Library User's Guide</B></DIV>
<H1>Part VIII: Iostreams</H1>
<H2>Chapters in This Part</H2>
<H3><A HREF="27.html">Chapter 27: The Architecture of Iostreams</A></H3>
<H3><A HREF="28.html">Chapter 28: Formatted Input and Output</A></H3>
<H3><A HREF="29.html">Chapter 29: Error State of Streams</A></H3>
<H3><A HREF="30.html">Chapter 30: File Input and Output</A></H3>
<H3><A HREF="31.html">Chapter 31: Input and Output In Memory</A></H3>
<H3><A HREF="32.html">Chapter 32: Input and Output of User Types</A></H3>
<H3><A HREF="33.html">Chapter 33: Manipulators</A></H3>
<H3><A HREF="34.html">Chapter 34: Streams and Stream Buffers</A></H3>
<H3><A HREF="35.html">Chapter 35: Synchronizing Streams</A></H3>
<H3><A HREF="36.html">Chapter 36: Stream Storage for Private Use</A></H3>
<H3><A HREF="37.html">Chapter 37: Registration of Callback Functions</A></H3>
<H3><A HREF="38.html">Chapter 38: Creating New Stream Classes by Derivation</A></H3>
<H3><A HREF="39.html">Chapter 39: Stream Buffers</A></H3>
<H3><A HREF="40.html">Chapter 40: Defining A Code Conversion Facet</A></H3>
<H3><A HREF="41.html">Chapter 41: Defining Your Own Character Types</A></H3>
<H3><A HREF="42.html">Chapter 42: Imbuing Locales</A></H3>
<H3><A HREF="43.html">Chapter 43: Stream Iterators</A></H3>
<H3><A HREF="44.html">Chapter 44: Iostreams and Multithreading</A></H3>
<H3><A HREF="45.html">Chapter 45: Standard vs. Traditional Iostreams</A></H3>
<H3><A HREF="46.html">Chapter 46: Standard vs. Apache C++ Standard Library Iostreams</A></H3>


<BR>
<HR>
<A HREF="26-9.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><A HREF="27.html"><IMG SRC="images/bnext.gif" WIDTH=20 HEIGHT=21 ALT="Next file" BORDER=O></A>

<!-- Google Analytics tracking code -->
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
    _uacct = "UA-1775151-1";
    urchinTracker();
</script>
<!-- end of Google Analytics tracking code -->

</BODY>
</HTML>
