<!--
    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>wcin</TITLE>
<LINK REL=StyleSheet HREF="../rw.css" TYPE="text/css" TITLE="Apache stdcxx Stylesheet"></HEAD>
<BODY BGCOLOR=#FFFFFF>
<A HREF="wcerr.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="wclog.html"><IMG SRC="images/bnext.gif" WIDTH=25 HEIGHT=21 ALT="Next file" BORDER=O></A><DIV CLASS="DOCUMENTNAME"><B>Apache C++ Standard Library Reference Guide</B></DIV>
<H2>wcin</H2>
<P><B>Library:</B>&nbsp;&nbsp;<A HREF="2-11.html">Input/output</A></P><UL>
<LI><A HREF="#sec1">Local Index</A></LI>
<LI><A HREF="#sec2">Summary</A></LI>
<LI><A HREF="#sec3">Synopsis</A></LI>
<LI><A HREF="#sec4">Description</A></LI>
<LI><A HREF="#sec5">Warnings</A></LI>
<LI><A HREF="#sec6">See Also</A></LI>
<LI><A HREF="#sec7">Standards Conformance</A></LI>
</UL>
<A NAME="sec1"><H3>Local Index</H3></A>
No Entries
<A NAME="sec2"><H3>Summary</H3></A>
<P>A predefined stream that controls input from a stream buffer associated with the object <SAMP>stdin</SAMP> declared in <SAMP>&lt;cstdio&gt;</SAMP></P>
<A NAME="sec3"><H3>Synopsis</H3></A>

<PRE>#include &lt;iostream&gt;

namespace std {
  extern wistream wcin;
}
</PRE>
<A NAME="sec4"><H3>Description</H3></A>
<P>The object <SAMP>wcin</SAMP> controls input from a stream buffer associated with the object <SAMP>stdin</SAMP> declared in <SAMP>&lt;cstdio&gt;.</SAMP> By default the standard C and C++ streams are synchronized, but performance improvement can be achieved by using the <B><I><A HREF="ios-base.html">ios_base</A></I></B> member function <SAMP>synch_with_stdio</SAMP> to desynchronize them. </P>
<P>After the object <SAMP>wcin</SAMP> is initialized, <SAMP>wcin.tie()</SAMP> returns <SAMP>&amp;wcout</SAMP>, which implies that <SAMP>wcin</SAMP> and <SAMP>wcout</SAMP> are synchronized. <SAMP>wcin</SAMP> uses the locale <B><I><A HREF="codecvt.html">codecvt</A></I></B> facet to convert the tiny characters extracted from <SAMP>stdin</SAMP> to the wide characters stored in the <SAMP>wcin</SAMP> buffer. </P>
<A NAME="sec5"><H3>Warnings</H3></A>
<P>Keep in mind that while the manipulator <SAMP>endl</SAMP> flushes the stream buffer, outputting the character <SAMP>L'\n'</SAMP> is <I>not</I> guaranteed to flush the stream buffer. You should output  the <SAMP>L'\n'</SAMP> character without <SAMP>endl</SAMP> only if you do not need the buffer flushed. Note that outputting the <SAMP>L'\n'</SAMP> character in such cases, and hence not forcing a buffer flush, may result in a performance improvement. It greatly improves performance when C and C++ streams are not synchronized.</P>
<A NAME="sec6"><H3>See Also</H3></A>
<P><B><I><A HREF="basic-istream.html">basic_istream</A></I></B>, <B><I><A HREF="basic-iostream.html">basic_iostream</A></I></B>, <B><I><A HREF="basic-filebuf.html">basic_filebuf</A></I></B>, <B><I><A HREF="cin.html">cin</A></I></B>, <B><I><A HREF="cout.html">cout</A></I></B>, <B><I><A HREF="cerr.html">cerr</A></I></B>, <B><I><A HREF="clog.html">clog</A></I></B>, <B><I><A HREF="wcout.html">wcout</A></I></B>, <B><I><A HREF="wcerr.html">wcerr</A></I></B>, <B><I><A HREF="wclog.html">wclog</A></I></B>, <B><I><A HREF="ios-base.html">ios_base</A></I></B>, <B><I><A HREF="basic-ios.html">basic_ios</A></I></B></P>
<A NAME="sec7"><H3>Standards Conformance</H3></A>
<P><I>ISO/IEC 14882:1998 -- International Standard for Information Systems --Programming Language C++, Section 27.3.2</I></P>

<BR>
<HR>
<A HREF="wcerr.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="wclog.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>
