﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-wifecooky-随笔分类-C，C++</title><link>http://www.cppblog.com/wifecooky/category/13482.html</link><description>学一点，记一点</description><language>zh-cn</language><lastBuildDate>Mon, 08 Nov 2010 04:45:08 GMT</lastBuildDate><pubDate>Mon, 08 Nov 2010 04:45:08 GMT</pubDate><ttl>60</ttl><item><title>关于运行时类型识别typeid </title><link>http://www.cppblog.com/wifecooky/archive/2010/11/08/132955.html</link><dc:creator>楚天清秋</dc:creator><author>楚天清秋</author><pubDate>Mon, 08 Nov 2010 01:23:00 GMT</pubDate><guid>http://www.cppblog.com/wifecooky/archive/2010/11/08/132955.html</guid><wfw:comment>http://www.cppblog.com/wifecooky/comments/132955.html</wfw:comment><comments>http://www.cppblog.com/wifecooky/archive/2010/11/08/132955.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wifecooky/comments/commentRss/132955.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wifecooky/services/trackbacks/132955.html</trackback:ping><description><![CDATA[<p>在程序中，当我们对多态类的基类指针使用typeid，就可以在运行时确定指针指向对象的实际类型，并输出对象类型的名字。</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;cstdlib&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;iostream&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;typeinfo&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;&nbsp;std;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_104_144_Open_Image onclick="this.style.display='none'; Codehighlighter1_104_144_Open_Text.style.display='none'; Codehighlighter1_104_144_Closed_Image.style.display='inline'; Codehighlighter1_104_144_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_104_144_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_104_144_Closed_Text.style.display='none'; Codehighlighter1_104_144_Open_Image.style.display='inline'; Codehighlighter1_104_144_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;&nbsp;B</span><span id=Codehighlighter1_104_144_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_104_144_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;:<br><img id=Codehighlighter1_141_142_Open_Image onclick="this.style.display='none'; Codehighlighter1_141_142_Open_Text.style.display='none'; Codehighlighter1_141_142_Closed_Image.style.display='inline'; Codehighlighter1_141_142_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_141_142_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_141_142_Closed_Text.style.display='none'; Codehighlighter1_141_142_Open_Image.style.display='inline'; Codehighlighter1_141_142_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;&nbsp;fun()</span><span id=Codehighlighter1_141_142_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_141_142_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_167_197_Open_Image onclick="this.style.display='none'; Codehighlighter1_167_197_Open_Text.style.display='none'; Codehighlighter1_167_197_Closed_Image.style.display='inline'; Codehighlighter1_167_197_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_167_197_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_167_197_Closed_Text.style.display='none'; Codehighlighter1_167_197_Open_Image.style.display='inline'; Codehighlighter1_167_197_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;&nbsp;D:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;&nbsp;B</span><span id=Codehighlighter1_167_197_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_167_197_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;:<br><img id=Codehighlighter1_194_195_Open_Image onclick="this.style.display='none'; Codehighlighter1_194_195_Open_Text.style.display='none'; Codehighlighter1_194_195_Closed_Image.style.display='inline'; Codehighlighter1_194_195_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_194_195_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_194_195_Closed_Text.style.display='none'; Codehighlighter1_194_195_Open_Image.style.display='inline'; Codehighlighter1_194_195_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;&nbsp;fun()</span><span id=Codehighlighter1_194_195_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_194_195_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;main()<br><img id=Codehighlighter1_213_597_Open_Image onclick="this.style.display='none'; Codehighlighter1_213_597_Open_Text.style.display='none'; Codehighlighter1_213_597_Closed_Image.style.display='inline'; Codehighlighter1_213_597_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_213_597_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_213_597_Closed_Text.style.display='none'; Codehighlighter1_213_597_Open_Image.style.display='inline'; Codehighlighter1_213_597_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_213_597_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_213_597_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;B&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;p;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;D&nbsp;ob;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="COLOR: #000000">=&amp;</span><span style="COLOR: #000000">&nbsp;ob;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;typeid(*p).name()=&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;typeid(&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;p).name()&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(typeid(&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;p)&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;typeid(D))<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;typeid(*p)==typeid(D)&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;typeid(p).name()=&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;typeid(p).name()&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(typeid(p)&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;typeid(B&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;))<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;typeid(p)==typeid(B*)&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;system(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;pause&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>这段code在VC++6.0中编译时，提示如下<br>warning C4541: 'typeid' used on polymorphic type 'class B' with /GR-; unpredictable behavior may result<br>编译后运行时错误。不知是不是此版本的VC++不符合C++标准？<br><br>在Devcpp（g++）中编译运行得到的结果是<br>typeid(*p).name()=1D<br>typeid(*p)==typeid(D)<br>typeid(p).name()=P1B<br>typeid(p)==typeid(B*)<br>说明用typeid作用于*p得到的的确是D类型，而用typeid作用于p得到的依然是B类的指针类型<br><br>如果typeid被作用于非多态类指针，那么我们得到的是指针被声明的类型，也就是说，此时typeid并不会返回指针所指向对象的实际类型。<br>如果将class B中的virtual去掉，在编译运行得到的结果是<br>typeid(*p).name()=1B<br>typeid(p).name()=P1B<br>typeid(p)==typeid(B*)<br><br>由此可见，在任何时刻都可以用基类指针指向派生类对象，而用typeid(*p)确定p指向的对象时，只当基类为多态类时才能真正确定p在运行时指向的实际类型。<br><br>VC默认不启动RTTI，即&#8220;运行时期类型识别&#8221;，如果在你的程序用到了RTTI，比如typeid，你必须明确告诉编译器启动RTTI，这样VC才能正确编译 <br>选择菜单Project-&gt;settings-&gt;c/c++-&gt;category-&gt;c++ language,将Enable Run-Time Type Infomation(RTTI)选中 <br>
<img src ="http://www.cppblog.com/wifecooky/aggbug/132955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wifecooky/" target="_blank">楚天清秋</a> 2010-11-08 09:23 <a href="http://www.cppblog.com/wifecooky/archive/2010/11/08/132955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cout重定向到文件 (转)</title><link>http://www.cppblog.com/wifecooky/archive/2010/08/15/123470.html</link><dc:creator>楚天清秋</dc:creator><author>楚天清秋</author><pubDate>Sat, 14 Aug 2010 16:16:00 GMT</pubDate><guid>http://www.cppblog.com/wifecooky/archive/2010/08/15/123470.html</guid><wfw:comment>http://www.cppblog.com/wifecooky/comments/123470.html</wfw:comment><comments>http://www.cppblog.com/wifecooky/archive/2010/08/15/123470.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wifecooky/comments/commentRss/123470.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wifecooky/services/trackbacks/123470.html</trackback:ping><description><![CDATA[<p>cout默认是与监视器（屏幕）相连，cout出来的内容会输出到屏幕上，通常是会在命令行窗口之中。但有时，我们希望将cout出来的具体日志、错误信息写到某个文件之中，而屏幕上仅仅显示出当前进行的任务，以及程序运行状态等信息。我们可以使用下面重定向的方式来实现：</p>
<span style="COLOR: #008080">1</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">stdafx.h</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">2</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">3</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">fstream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">4</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #008080">5</span> <span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> argc, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> argv[])<br></span><span style="COLOR: #008080">6</span> <span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">7</span> <span style="COLOR: #000000">&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000"> std;<br></span><span style="COLOR: #008080">8</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #008080">9</span> <span style="COLOR: #000000">&nbsp;&nbsp;&nbsp; cout </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Hello, Let's begin a test of cout to file.</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> endl;<br></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000">&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 保存cout流缓冲区指针</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">11</span> <span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp; streambuf</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> coutBuf </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> cout.rdbuf();<br></span><span style="COLOR: #008080">12</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #008080">13</span> <span style="COLOR: #000000">&nbsp;&nbsp;&nbsp; ofstream of(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">out.txt</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">14</span> <span style="COLOR: #000000">&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 获取文件out.txt流缓冲区指针</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">15</span> <span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp; streambuf</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> fileBuf </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> of.rdbuf();<br></span><span style="COLOR: #008080">16</span> <span style="COLOR: #000000">&nbsp;&nbsp;&nbsp; <br></span><span style="COLOR: #008080">17</span> <span style="COLOR: #000000">&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 设置cout流缓冲区指针为out.txt的流缓冲区指针</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">18</span> <span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp; cout.rdbuf(fileBuf);<br></span><span style="COLOR: #008080">19</span> <span style="COLOR: #000000">&nbsp;&nbsp;&nbsp; cout </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Name </span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Chen</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> endl;<br></span><span style="COLOR: #008080">20</span> <span style="COLOR: #000000">&nbsp;&nbsp;&nbsp; cout </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Sex&nbsp; </span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Female</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> endl;<br></span><span style="COLOR: #008080">21</span> <span style="COLOR: #000000">&nbsp;&nbsp;&nbsp; cout </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">E-mail</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Chen@qq.com</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> endl;<br></span><span style="COLOR: #008080">22</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #008080">23</span> <span style="COLOR: #000000">&nbsp;&nbsp;&nbsp; of.flush();<br></span><span style="COLOR: #008080">24</span> <span style="COLOR: #000000">&nbsp;&nbsp;&nbsp; of.close();<br></span><span style="COLOR: #008080">25</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #008080">26</span> <span style="COLOR: #000000">&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 恢复cout原来的流缓冲区指针</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">27</span> <span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp; cout.rdbuf(coutBuf);<br></span><span style="COLOR: #008080">28</span> <span style="COLOR: #000000">&nbsp;&nbsp;&nbsp; cout </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Write Personal Information over...</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> endl;<br></span><span style="COLOR: #008080">29</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #008080">30</span> <span style="COLOR: #000000">&nbsp;&nbsp;&nbsp; system(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">PAUSE</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">31</span> <span style="COLOR: #000000">&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">32</span> <span style="COLOR: #000000">}</span> 
<img src ="http://www.cppblog.com/wifecooky/aggbug/123470.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wifecooky/" target="_blank">楚天清秋</a> 2010-08-15 00:16 <a href="http://www.cppblog.com/wifecooky/archive/2010/08/15/123470.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>判断两个数组中是否存在相同的数字</title><link>http://www.cppblog.com/wifecooky/archive/2010/06/09/117459.html</link><dc:creator>楚天清秋</dc:creator><author>楚天清秋</author><pubDate>Wed, 09 Jun 2010 04:16:00 GMT</pubDate><guid>http://www.cppblog.com/wifecooky/archive/2010/06/09/117459.html</guid><wfw:comment>http://www.cppblog.com/wifecooky/comments/117459.html</wfw:comment><comments>http://www.cppblog.com/wifecooky/archive/2010/06/09/117459.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wifecooky/comments/commentRss/117459.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wifecooky/services/trackbacks/117459.html</trackback:ping><description><![CDATA[<span style="COLOR: #0000ff">给定两个排好序的数组，怎样高效得判断这两个数组中存在相同的数字？</span><br><br><br>&nbsp;O(n)算法。因为两个数组都是排好序的。所以只要一次遍历就行了。首先设两个下标，分别初始化为两个数组的起始地址，依次向前推进 。推进的规则是比较两个 数组中的数字，小的那个数组的下标向前推进一步，直到任何一个数组的下标到达数组末尾时，如果这时还没碰到相同的数字，说明数组中没有相同的数字。<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;findcommon(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a[],&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;size1,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;b[],&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;size2)<br><img id=Codehighlighter1_56_281_Open_Image onclick="this.style.display='none'; Codehighlighter1_56_281_Open_Text.style.display='none'; Codehighlighter1_56_281_Closed_Image.style.display='inline'; Codehighlighter1_56_281_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_56_281_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_56_281_Closed_Text.style.display='none'; Codehighlighter1_56_281_Open_Image.style.display='inline'; Codehighlighter1_56_281_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_56_281_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_56_281_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">size1&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;j</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">size2)<br><img id=Codehighlighter1_112_260_Open_Image onclick="this.style.display='none'; Codehighlighter1_112_260_Open_Text.style.display='none'; Codehighlighter1_112_260_Closed_Image.style.display='inline'; Codehighlighter1_112_260_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_112_260_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_112_260_Closed_Text.style.display='none'; Codehighlighter1_112_260_Open_Image.style.display='inline'; Codehighlighter1_112_260_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_112_260_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_112_260_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(a[i]</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">b[j])<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(a[i]</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">b[j])<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(a[i]</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">b[j])<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<img src ="http://www.cppblog.com/wifecooky/aggbug/117459.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wifecooky/" target="_blank">楚天清秋</a> 2010-06-09 12:16 <a href="http://www.cppblog.com/wifecooky/archive/2010/06/09/117459.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浮点数在计算机中存储方式 </title><link>http://www.cppblog.com/wifecooky/archive/2010/06/02/117000.html</link><dc:creator>楚天清秋</dc:creator><author>楚天清秋</author><pubDate>Wed, 02 Jun 2010 04:17:00 GMT</pubDate><guid>http://www.cppblog.com/wifecooky/archive/2010/06/02/117000.html</guid><wfw:comment>http://www.cppblog.com/wifecooky/comments/117000.html</wfw:comment><comments>http://www.cppblog.com/wifecooky/archive/2010/06/02/117000.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wifecooky/comments/commentRss/117000.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wifecooky/services/trackbacks/117000.html</trackback:ping><description><![CDATA[<a href="http://www.cnblogs.com/jillzhang/archive/2007/06/24/793901.html"><br>http://www.cnblogs.com/jillzhang/archive/2007/06/24/793901.html</a>
<img src ="http://www.cppblog.com/wifecooky/aggbug/117000.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wifecooky/" target="_blank">楚天清秋</a> 2010-06-02 12:17 <a href="http://www.cppblog.com/wifecooky/archive/2010/06/02/117000.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于sizeof(类)的大小</title><link>http://www.cppblog.com/wifecooky/archive/2010/06/01/116933.html</link><dc:creator>楚天清秋</dc:creator><author>楚天清秋</author><pubDate>Tue, 01 Jun 2010 14:09:00 GMT</pubDate><guid>http://www.cppblog.com/wifecooky/archive/2010/06/01/116933.html</guid><wfw:comment>http://www.cppblog.com/wifecooky/comments/116933.html</wfw:comment><comments>http://www.cppblog.com/wifecooky/archive/2010/06/01/116933.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/wifecooky/comments/commentRss/116933.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wifecooky/services/trackbacks/116933.html</trackback:ping><description><![CDATA[<p>#include &lt;iostream.h&gt;</p>
<p>class A <br>{};</p>
<p>class B<br>{};</p>
<p><span style="COLOR: #ff0000">class C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //情况1</span><br><span style="COLOR: #0000ff">//class C:public A</span> <span style="COLOR: #0000ff">//情况2<br></span>{<br>&nbsp;virtual void fun()=0;<br>};</p>
<p>class D:public B,public C<br>{<br>};</p>
<p>int main()<br>{<br>&nbsp;cout&lt;&lt;sizeof(D)&lt;&lt;endl;<br>&nbsp;return 0;<br>}<br></p>
情况1时sizeof(D)为4，<br>情况2时sizeof(D)为8，<br><br>啥原因，谁解释下？ 
<img src ="http://www.cppblog.com/wifecooky/aggbug/116933.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wifecooky/" target="_blank">楚天清秋</a> 2010-06-01 22:09 <a href="http://www.cppblog.com/wifecooky/archive/2010/06/01/116933.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> c++虚函数表探究</title><link>http://www.cppblog.com/wifecooky/archive/2010/05/10/114986.html</link><dc:creator>楚天清秋</dc:creator><author>楚天清秋</author><pubDate>Mon, 10 May 2010 05:26:00 GMT</pubDate><guid>http://www.cppblog.com/wifecooky/archive/2010/05/10/114986.html</guid><wfw:comment>http://www.cppblog.com/wifecooky/comments/114986.html</wfw:comment><comments>http://www.cppblog.com/wifecooky/archive/2010/05/10/114986.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wifecooky/comments/commentRss/114986.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wifecooky/services/trackbacks/114986.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: C++中的虚函数的作用主要是实现了多态的机制。关于多态，简而言之就是用父类型别的指针指向其子类的实例，然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”，这是一种泛型技术。所谓泛型技术，说白了就是试图使用不变的代码来实现可变的算法。比如：模板技术，RTTI技术，虚函数技术，要么是试图做到在编译时决议，要么试图做到运行时决议。 <br>&nbsp;&nbsp;<a href='http://www.cppblog.com/wifecooky/archive/2010/05/10/114986.html'>阅读全文</a><img src ="http://www.cppblog.com/wifecooky/aggbug/114986.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wifecooky/" target="_blank">楚天清秋</a> 2010-05-10 13:26 <a href="http://www.cppblog.com/wifecooky/archive/2010/05/10/114986.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是智能指针(Solmyr 的小品文系列之五：垃圾收集)</title><link>http://www.cppblog.com/wifecooky/archive/2010/04/13/112478.html</link><dc:creator>楚天清秋</dc:creator><author>楚天清秋</author><pubDate>Tue, 13 Apr 2010 09:36:00 GMT</pubDate><guid>http://www.cppblog.com/wifecooky/archive/2010/04/13/112478.html</guid><wfw:comment>http://www.cppblog.com/wifecooky/comments/112478.html</wfw:comment><comments>http://www.cppblog.com/wifecooky/archive/2010/04/13/112478.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wifecooky/comments/commentRss/112478.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wifecooky/services/trackbacks/112478.html</trackback:ping><description><![CDATA[Solmyr 的小品文系列之五：垃圾收集 转自pchome <br>午餐时间。 <br><br>zero 坐在餐桌前，机械的重复&#8220;夹菜 -&gt; 咀嚼 -&gt; 吞咽&#8221;的动作序列，脸上用无形的大字写着：我心不在焉。在他的对面坐着 Solmyr ，慢条斯理的吃着他那份午餐，维持着他一贯很有修养的形象 ——— 或者按照 zero 这些熟悉他本质的人的说法：假象。 <br><br>&#8220;怎么了 zero ？胃口不好么？&#8221;，基本填饱肚子之后，Solmyr 觉得似乎应该关心一下他的学徒了。 <br><br>&#8220;呃，没什么，只是 &#8230;&#8230; Solmyr ，C++ 为什么不支持垃圾收集呢？（注：垃圾收集是一种机制，保证动态分配了的内存块会自动释放，Java 等
<div class=cnt><nobr style="COLOR: rgb(102,0,255); BORDER-BOTTOM: 0px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" target="_blank">语言</nobr>支持这一机制。）&#8221; <br><br>Solmyr 叹了口气，用一种平静的眼神盯着 zero ：&#8220;是不是在 BBS 上和人吵 C++ 和 Java 哪个更好？而且吵输了？我早告诉过你，这种争论再无聊不过了。&#8221; <br><br>&#8220;呃 &#8230;&#8230; 是&#8221;，zero 不得不承认 ——— Solmyr 的眼神虽然一点也不锐利，但是却莫名其妙的让 zero 产生了微微的恐惧感。 <br><br>&#8220;而且，谁告诉你 C++ 不支持垃圾收集的？&#8221; <br><br>&#8220;啊！Solmyr 你不是开玩笑吧？！&#8221; <br><br>&#8220;zero 你得转变一下观念。我问你，C++ 支不支持可以动态改变大小的数组？&#8221; <br><br>&#8220;这 &#8230;&#8230; 好象也没有吧？&#8221; <br><br>&#8220;那 vector 是什么东西？&#8221; <br><br>&#8220;呃 &#8230;&#8230;&#8221; <br><br>&#8220;支持一种特性，并不是说非得把这个特性加到<nobr style="COLOR: rgb(102,0,255); BORDER-BOTTOM: rgb(102,0,255) 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" target="_blank">语法</nobr>里去，我们也可以选择用现有的语言机制实现一个库来支持这个特征。以垃圾收集为例，这里我们的任务是要保证每一个被动态分配的内存块都能够被释放，也就是说 &#8230;&#8230;&#8221;，Solmyr 不知从哪里找出了一张纸、一支笔，写到： <br><br>int* p = new int; // 1 <br>delete p; // 2 <br><br>&#8220;也就是说，对于每一个 1 ，我们要保证有一个 2 被调用，1 和 2 必须成对出现。我来问你，C++ 中有什么东西是由语言本身保证一定成对出现的？&#8221; <br><br>&#8220;&#8230;&#8230;&#8221;，zero 露出了努力搜索记忆的表情，不过很明显一无所获。 <br><br>&#8220;提示一下，和类的创建有关。&#8221; <br><br>&#8220;哦！构造函数与析构函数！&#8221; <br><br>&#8220;正确。可惜普通指针没有构造函数与析构函数，所以我们必须要写一个类来加一层<nobr style="COLOR: rgb(102,0,255); BORDER-BOTTOM: rgb(102,0,255) 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" target="_blank">包装</nobr>，最简单的就象这样：&#8221; <br><br>class my_intptr <br>{ <br>public: <br>int* m_p; <br><br>my_intptr(int* p){ m_p = p; } <br>~my_intptr(){ delete m_p; } <br>}; <br><br>&#8230;&#8230;&#8230;&#8230; <br><br>my_intptr pi(new int); <br>*(pi.m_p) = 10; <br><br>&#8230;&#8230;&#8230;&#8230; <br><br>&#8220;这里我们可以放心的使用 my_intptr ，不用担心内存泄漏的问题：一旦 pi 这个变量被销毁，我们知道 pi.p 指向的内存块一定会被释放。不过如果每次使用 my_intptr 都得去访问它的成员未免太麻烦了。为此，可以给这个类加上重载的 * 运算符：&#8221; <br><br>class my_intptr <br>{ <br>private: <br>int* m_p; <br><br>public: <br>my_intptr(int* p){ m_p = p; } <br>~my_intptr(){ delete m_p; } <br><br>int&amp; operator*(){ return *m_p; } <br>}; <br><br>&#8230;&#8230;&#8230;&#8230; <br><br>my_intptr pi; <br>*pi = 10; <br>int a = *pi; <br><br>&#8230;&#8230;&#8230;&#8230; <br><br>&#8220;现在是不是看起来 my_intptr 就像是一个真正的指针了？正因为如此，这种技术被称为智能指针。现在我问你，这个类还缺少哪些东西？&#8221; <br><br>zero 皱着眉头，眼睛一眨一眨，看上去就像一台慢速<nobr style="COLOR: rgb(102,0,255); BORDER-BOTTOM: 0px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" target="_blank">电脑</nobr>正在辛苦的往它的硬盘上拷贝文件。良久，zero 抬起头来，不太确定的说：&#8220;是不是还缺少一个拷贝构造函数和一个赋值运算符？&#8221; <br><br>&#8220;说说为什么。&#8221;，Solmyr 显然不打算就这样放过 zero。 <br><br>&#8220;因为 &#8230;&#8230; 我记得没错的话 &#8230;&#8230; 《50 诫 》（注：指《Effective C++ 2/e》一书）中提到过，如果你的类里面有指针指向动态分配的内存，那么一定要为它写一个拷贝构造函数和一个赋值运算符 &#8230;&#8230; 因为 &#8230;&#8230; 否则的话，一旦你做了赋值，会导致两个对象的指针指向同一块内存。对了！如果是上面的类，这样一来会导致同一个指针被 delete 两次！&#8221; <br><br>&#8220;正确。那么我们应该怎样来实现呢？&#8221; <br><br>&#8220;这简单，我们用 memcpy 把<nobr style="COLOR: rgb(102,0,255); BORDER-BOTTOM: rgb(102,0,255) 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" target="_blank">目标</nobr>指针指向的内存中的内容拷贝过来。&#8221; <br><br>&#8220;如果我们的智能指针指向一个类的对象怎么办？注意，类的对象中可能有指针，不能用 memcpy。&#8221; <br><br>&#8220;那 &#8230;&#8230; 我们用拷贝构造的办法。&#8221; <br><br>&#8220;如果我们的智能指针指向的对象不能拷贝构造怎么办？它可能有一个私有的拷贝构造函数。&#8221; <br><br>&#8220;那 &#8230;&#8230;&#8221;，zero 顿了一顿，决定老实承认，&#8220;我不知道。&#8221; <br><br>&#8220;问题在哪你知道么？在于你没有把智能指针看作指针。想象一下，如果我们对一个指针做赋值，它的含义是什么？&#8221; <br><br>&#8220;呃，我明白了，在这种情况下，应该想办法让两个智能指针指向同一个对象 &#8230;&#8230; 可是 Solmyr ，这样以来岂不是仍然要对同一个对象删除两遍？&#8221; <br><br>&#8220;是的，我们得想办法<nobr style="COLOR: rgb(102,0,255); BORDER-BOTTOM: rgb(102,0,255) 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" target="_blank">解决</nobr>这 个问题，办法不只一种。比较好的一种是为每个指针维护一个引用计数值，每次赋值或者拷贝构造，就让计数值加一，这意味着指向这个内存块的智能指针又多了一 个；而每有一个智能指针被销毁，就让计数值减一，这意味着指向这个内存块的智能指针少了一个；一旦计数值为 0 ，就释放内存块。象这样：&#8221; <br><br>class my_intptr <br>{ <br>private: <br>int* m_p; <br>int* m_count; <br><br>public: <br>my_intptr(int* p) <br>{ <br>m_p = p; <br>m_count = new int; // 初始化计数值为 1 <br>*m_count = 1; <br>} <br>my_intptr(const my_intptr&amp; rhs) // 拷贝构造函数 <br>{ <br>m_p = rhs.m_p; // 指向同一块内存 <br>m_count = rhs.m_count; // 使用同一个计数值 <br>(*m_count)++; // 计数值加 1 <br>} <br>~my_intptr() <br>{ <br>(*m_count)--; // 计数值减 1 <br>if( *m_count == 0 ) // 已经没有别的指针指向该内存块了 <br>{ <br>delete m_p; <br>delete m_count; <br>} <br>} <br><br>my_intptr&amp; operator=(const my_intptr&amp; rhs) <br>{ <br>if( m_p == rhs.m_p ) // 首先判断是否本来就指向同一内存块 <br>return *this; // 是则直接返回 <br><br>(*m_count)--; // 计数值减 1 ，因为该指针不再指向原来内存块了 <br>if( *m_count == 0 ) // 已经没有别的指针指向原来内存块了 <br>{ <br>delete m_p; <br>delete m_count; <br>} <br><br>m_p = rhs.m_p; // 指向同一块内存 <br>m_count = rhs.m_count; // 使用同一个计数值 <br>(*m_count)++; // 计数值加 1 <br>} <br><br>&#8230;&#8230;&#8230;&#8230; <br>}; <br><br>&#8220;其他部分没有什么太大变化，我不费事了。现在想象一下我们怎样使用这种智能指针？&#8221;，Solmyr 放下了笔，再次拿起了筷子，有些惋惜的发现他爱吃的肉丸子已经冷了。 <br><br>zero 想象着，有些迟疑。&#8220;我们 &#8230;&#8230; 可以用 new int 表达式作为构造函数的参数来构造一个智能指针，然后 &#8230;&#8230; 然后我们可以任意的赋值，&#8221;，他开始抓住了思路，越说越快，&#8220;任意的用已经存在的智能指针来构造新的智能指针，智能指针的赋值运算符、拷贝构造函数和析构 会保证计数值始终等于指向该内存块的智能指针数。&#8221;zero 似乎明白了他看到了怎样的<nobr style="COLOR: rgb(102,0,255); BORDER-BOTTOM: rgb(102,0,255) 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" target="_blank">功能</nobr>， 开始激动起来：&#8220;然后一旦计数值为 0 被分配的内存块就会释放！也就是说 &#8230;&#8230; 有指针指向内存块，它就不释放，一旦没有，它就自动释放！太棒了！我们只要一开始正确的初始化智能指针，就可以象普通指针那样使用它，而且完全不用担心内 存释放的问题！太棒了！&#8221;zero 激动的大叫：&#8220;这就是垃圾收集！Solmyr ！我们在饭桌上实现了一个垃圾收集器！&#8221; <br><br>Solmyr 很明显没有分享 zero 的激动：&#8220;我在吃饭，你能不能不要大叫&#8216;饭桌上实现了一个垃圾收集器&#8217;这种倒胃口的话？&#8221;顿了一顿，Solmyr 带着他招牌式的坏笑，以一种可恶的口吻说道：&#8220;而且请注意一下自己的形象。&#8221; <br><br>&#8220;嗯？&#8221;，zero 回过神来，发现自己不知什么时候站了起来，而整个餐厅里的人都在看着他嘿嘿偷笑，这让他感觉自己像个傻瓜。 <br><br>zero 红着脸坐下，压低了声音问 Solmyr ：&#8220;不过 Solmyr ，这确实是一个的垃圾收集机制啊，只要我们把这个类改成 &#8230;&#8230; 嗯 &#8230;&#8230; 改成模板类，象这样：&#8221;zero 抓过了纸笔，写到： <br><br>template &lt;typename T&gt; <br>class my_ptr <br>{ <br>private: <br>T* m_p; <br>int* m_count; <br>&#8230;&#8230;&#8230;&#8230; <br>}; <br><br>&#8220;它不就能支持任意类型的指针了吗？我们就可以把它用在任何地方。&#8221; <br><br>Solmyr 摇了摇头：&#8220;不，你把问题想的太简单了。对于简单的类型，这个类确实可以处理的很好，但实际情况是很复杂的。考虑一个典型情况：类 Derived 是类 Base 的派生类，我们希望这样赋值：&#8221; <br><br>Base* pb; <br>Derived pd; <br>&#8230;&#8230;&#8230;&#8230; <br>pb = pd; <br><br>&#8220;你倒说说看，这种情况，怎样改用上面这个智能指针来处理？&#8221; <br><br>&#8220;&#8230;&#8230;&#8221;，zero 沉默了。 <br><br>&#8220;要实现一个完整的垃圾收集机制并不容易，因为有许多细节要考虑。&#8221;，Solmyr 开始总结了，&#8220;不过，基本思路就是上面说的这些。值得庆幸的是，目前已经有了一个相当成熟的&#8216;引用计数&#8217;智能指针，boost::shared_ptr。 大多数情况下，我们都可以使用它。另外，除了智能指针之外，还有一些<nobr style="COLOR: rgb(102,0,255); BORDER-BOTTOM: rgb(102,0,255) 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" target="_blank">技术</nobr>也能够帮助我们避开释放内存的问题，比如内存池。但是，关键在于 ——— &#8221; <br><br>Solmyr 再度用那种平静的眼神盯着 zero ： <br><br>&#8220;身为 C/C++ 程序员，必须有创造力。那种躺在语言机制上不思进取的人，那种必须要靠语法强制才知道怎样编程的人，那种没有别人告诉他该干什么就无所适从的人，不适合这门语言。</div>
<img src ="http://www.cppblog.com/wifecooky/aggbug/112478.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wifecooky/" target="_blank">楚天清秋</a> 2010-04-13 17:36 <a href="http://www.cppblog.com/wifecooky/archive/2010/04/13/112478.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>template必须定义于头文件中[转]</title><link>http://www.cppblog.com/wifecooky/archive/2010/04/12/112339.html</link><dc:creator>楚天清秋</dc:creator><author>楚天清秋</author><pubDate>Mon, 12 Apr 2010 08:23:00 GMT</pubDate><guid>http://www.cppblog.com/wifecooky/archive/2010/04/12/112339.html</guid><wfw:comment>http://www.cppblog.com/wifecooky/comments/112339.html</wfw:comment><comments>http://www.cppblog.com/wifecooky/archive/2010/04/12/112339.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wifecooky/comments/commentRss/112339.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wifecooky/services/trackbacks/112339.html</trackback:ping><description><![CDATA[<p align=center><strong><font size=2>template必须定义于头文件中</font></strong></p>
<p>最近在项目中遇到了一个奇怪的问题。</p>
<p>在程序中，A模块用到了一个模版函数，这个模版函数外部不需要调用，因此在*.cpp中定义并实现之。</p>
<p>编译的时候奇怪的现象发生了（VC6 sp5），在debug下，一切正常；在release下，在写这个模块的人那里可以正常编译且运行正常。可拿到我这来的时候，就编译不过了。我们几个师兄弟都没辙了，只能等老板来解决了。</p>
<p>&#8220;template必须定义于头文件中！&#8221;老板如是告诉我们。</p>
<p>试之，果不其然！</p>
<p>今日又看《C++标准程序库》，在p10页注释4，有记载：&#8220;目前template必须定义于头文件中....."。</p>
<img src ="http://www.cppblog.com/wifecooky/aggbug/112339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wifecooky/" target="_blank">楚天清秋</a> 2010-04-12 16:23 <a href="http://www.cppblog.com/wifecooky/archive/2010/04/12/112339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何判断文件是否存在？</title><link>http://www.cppblog.com/wifecooky/archive/2010/04/12/112286.html</link><dc:creator>楚天清秋</dc:creator><author>楚天清秋</author><pubDate>Mon, 12 Apr 2010 01:17:00 GMT</pubDate><guid>http://www.cppblog.com/wifecooky/archive/2010/04/12/112286.html</guid><wfw:comment>http://www.cppblog.com/wifecooky/comments/112286.html</wfw:comment><comments>http://www.cppblog.com/wifecooky/archive/2010/04/12/112286.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wifecooky/comments/commentRss/112286.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wifecooky/services/trackbacks/112286.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">sys</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">stat.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">io.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;FileExist(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;FileName)&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img id=Codehighlighter1_87_167_Open_Image onclick="this.style.display='none'; Codehighlighter1_87_167_Open_Text.style.display='none'; Codehighlighter1_87_167_Closed_Image.style.display='inline'; Codehighlighter1_87_167_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_87_167_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_87_167_Closed_Text.style.display='none'; Codehighlighter1_87_167_Open_Image.style.display='inline'; Codehighlighter1_87_167_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_87_167_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_87_167_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;stat&nbsp;my_stat;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;(stat(FileName,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">my_stat)&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;IsDirectory(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;FileName)&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img id=Codehighlighter1_220_359_Open_Image onclick="this.style.display='none'; Codehighlighter1_220_359_Open_Text.style.display='none'; Codehighlighter1_220_359_Closed_Image.style.display='inline'; Codehighlighter1_220_359_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_220_359_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_220_359_Closed_Text.style.display='none'; Codehighlighter1_220_359_Open_Image.style.display='inline'; Codehighlighter1_220_359_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_220_359_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_220_359_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;stat&nbsp;my_stat;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(stat(FileName,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">my_stat)&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;((my_stat.st_mode&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;S_IFDIR)&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<p>在程序中获得普通文件，目录，管道，socket，字符，块（）的属性。</p>
<p>函数原型<br>#include &lt;sys/stat.h&gt;</p>
<p>int stat(const char *restrict pathname, struct stat *restrict buf);<br>提供文件名字，获取文件对应属性。把相应的属性存放到 buf中。</p>
<p>2 文件对应的属性<br>struct stat {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mode_t&nbsp;&nbsp;&nbsp;&nbsp; st_mode;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //文件对应的模式，文件，目录等<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ino_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; st_ino;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //inode节点号<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dev_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; st_dev;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设备号码<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dev_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; st_rdev;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //特殊设备号码<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nlink_t&nbsp;&nbsp;&nbsp; st_nlink;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //文件的连接数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uid_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; st_uid;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //文件所有者<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gid_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; st_gid;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //文件所有者对应的组<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; off_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; st_size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //普通文件，对应的文件字节数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; time_t&nbsp;&nbsp;&nbsp;&nbsp; st_atime;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //文件最后被访问的时间<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; time_t&nbsp;&nbsp;&nbsp;&nbsp; st_mtime;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //文件内容最后被修改的时间<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; time_t&nbsp;&nbsp;&nbsp;&nbsp; st_ctime;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //文件状态改变时间<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; blksize_t st_blksize;&nbsp;&nbsp;&nbsp; //文件内容对应的块大小<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; blkcnt_t&nbsp;&nbsp; st_blocks;&nbsp;&nbsp;&nbsp;&nbsp; //文件内容对应的块数量<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<br>可以通过上面提供的函数，返回一个结构体，保存着文件的信息。</p>
<p>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/fxpbupt/archive/2008/11/17/3313427.aspx">http://blog.csdn.net/fxpbupt/archive/2008/11/17/3313427.aspx</a></p>
<img src ="http://www.cppblog.com/wifecooky/aggbug/112286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wifecooky/" target="_blank">楚天清秋</a> 2010-04-12 09:17 <a href="http://www.cppblog.com/wifecooky/archive/2010/04/12/112286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>