<!--
    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>File Input and Output</TITLE>
<LINK REL=StyleSheet HREF="../rw.css" TYPE="text/css" TITLE="Apache stdcxx Stylesheet"></HEAD>
<BODY BGCOLOR=#FFFFFF>
<A HREF="29-3.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="30-1.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>Chapter 30: File Input and Output</H1>
<UL>
<UL><LI><A HREF="30-1.html">30.1 About File Streams</A></LI></UL>
<UL><UL><LI><A HREF="30-1.html#3011">30.1.1 Code Conversion in Wide Character Streams</A></LI></UL></UL>
<UL><LI><A HREF="30-2.html">30.2 Working with File Streams</A></LI></UL>
<UL><UL><LI><A HREF="30-2.html#3021">30.2.1 Creating and Opening File Stream Objects</A></LI></UL></UL>
<UL><UL><LI><A HREF="30-2.html#3022">30.2.2 Checking a File Stream's Status</A></LI></UL></UL>
<UL><UL><LI><A HREF="30-2.html#3023">30.2.3 Closing a File Stream</A></LI></UL></UL>
<UL><LI><A HREF="30-3.html">30.3 The Open Mode</A></LI></UL>
<UL><UL><LI><A HREF="30-3.html#3031">30.3.1 The Open Mode Flags</A></LI></UL></UL>
<UL><UL><UL><LI><A HREF="30-3.html#3031-1">30.3.1.1 The in and out Open Modes</A></LI></UL></UL></UL>
<UL><UL><UL><LI><A HREF="30-3.html#3031-2">30.3.1.2 The Open modes ate, app, and trunc</A></LI></UL></UL></UL>
<UL><UL><UL><LI><A HREF="30-3.html#3031-3">30.3.1.3 The binary Open Mode</A></LI></UL></UL></UL>
<UL><UL><LI><A HREF="30-3.html#3032">30.3.2 Combining Open Modes</A></LI></UL></UL>
<UL><UL><LI><A HREF="30-3.html#3033">30.3.3 Default Open Modes</A></LI></UL></UL>
<UL><LI><A HREF="30-4.html">30.4 Binary and Text Mode</A></LI></UL>
<UL><LI><A HREF="30-5.html">30.5 File Positioning</A></LI></UL>
<UL><UL><LI><A HREF="30-5.html#3051">30.5.1 How Positioning Works with the Iostream Architecture</A></LI></UL></UL>

</UL>

<BR>
<HR>
<A HREF="29-3.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="30-1.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>
