﻿<?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++博客-一路走来，只有C++和香烟最实在！</title><link>http://www.cppblog.com/vliuchao/</link><description>Just Dive Into！</description><language>zh-cn</language><lastBuildDate>Tue, 14 Apr 2026 20:58:44 GMT</lastBuildDate><pubDate>Tue, 14 Apr 2026 20:58:44 GMT</pubDate><ttl>60</ttl><item><title>MySQL在linux中的安装和后续</title><link>http://www.cppblog.com/vliuchao/archive/2011/04/24/144899.html</link><dc:creator>Richard Liu</dc:creator><author>Richard Liu</author><pubDate>Sun, 24 Apr 2011 06:06:00 GMT</pubDate><guid>http://www.cppblog.com/vliuchao/archive/2011/04/24/144899.html</guid><wfw:comment>http://www.cppblog.com/vliuchao/comments/144899.html</wfw:comment><comments>http://www.cppblog.com/vliuchao/archive/2011/04/24/144899.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/vliuchao/comments/commentRss/144899.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vliuchao/services/trackbacks/144899.html</trackback:ping><description><![CDATA[<p>centos的安装盘带了mysql的安装，安装以后，mysql实际上还是需要配置的，前两天折腾了半天，写下过程来供以后在搞的时候备忘：<br>1 安装centos是自定义安装软件包,选择服务器中的Mysql<br>2 安装以后，需要做一些配置，首先在centos的界面选择 管理 服务（services）开启MySql的服务，当然也可以 services mysqld start,不过在终端用命令开启下一次重启还需要再输入，还是再界面配置不错的，网上看了一下似乎也可以拷贝文件到etc的某一个目录也可以实现开机启动服务，不过有界面使用，何必折腾那玩意。<br>3 此时的mysql通过MySQL-Front或mysql administrator连接mysql的时候发生错误ERROR 1130: Host ***.***.***.*** is not allowed to connect to this MySQL server<br>&nbsp; 说明所连接的用户帐号没有远程连接的权限，只能在本机(localhost)登录。需更改 mysql 数据库里的 user表里的 host项把localhost改称%<br>4具体步骤：登陆到mysql<br>1）mysql&gt;&nbsp;use mysql；<br>按照别人提供的方式update的时候，出现错误。<br>mysql&gt; update user set host='%' where user = 'root';<br>ERROR 1062 (23000): Duplicate entry '%-root' for key 'PRIMARY'<br>然后查看了下数据库的host信息如下：<br>2）mysql&gt; select host from user where user = 'root';<br>+-----------------------+<br>| host |<br>+-----------------------+<br>| % | <br>| 127.0.0.1 | <br>| localhost.localdomain | <br>+-----------------------+<br>3 rows in set (0.00 sec)<br>host已经有了%这个值，所以直接运行命令：<br>3）mysql&gt;flush privileges;<br>ps：别忘了每次输入后面的;<br>5 再用mysql administrator连接.，用户名root密码为空,可以连接上了 建立本机用户和远程访问用户就可以了。</p>
<img src ="http://www.cppblog.com/vliuchao/aggbug/144899.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vliuchao/" target="_blank">Richard Liu</a> 2011-04-24 14:06 <a href="http://www.cppblog.com/vliuchao/archive/2011/04/24/144899.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RTMP协议详解（三）</title><link>http://www.cppblog.com/vliuchao/archive/2009/12/30/104422.html</link><dc:creator>Richard Liu</dc:creator><author>Richard Liu</author><pubDate>Tue, 29 Dec 2009 16:15:00 GMT</pubDate><guid>http://www.cppblog.com/vliuchao/archive/2009/12/30/104422.html</guid><wfw:comment>http://www.cppblog.com/vliuchao/comments/104422.html</wfw:comment><comments>http://www.cppblog.com/vliuchao/archive/2009/12/30/104422.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.cppblog.com/vliuchao/comments/commentRss/104422.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vliuchao/services/trackbacks/104422.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/vliuchao/archive/2009/12/30/104422.html'>阅读全文</a><img src ="http://www.cppblog.com/vliuchao/aggbug/104422.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vliuchao/" target="_blank">Richard Liu</a> 2009-12-30 00:15 <a href="http://www.cppblog.com/vliuchao/archive/2009/12/30/104422.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RTMP协议详解（二）</title><link>http://www.cppblog.com/vliuchao/archive/2009/12/29/104323.html</link><dc:creator>Richard Liu</dc:creator><author>Richard Liu</author><pubDate>Mon, 28 Dec 2009 16:45:00 GMT</pubDate><guid>http://www.cppblog.com/vliuchao/archive/2009/12/29/104323.html</guid><wfw:comment>http://www.cppblog.com/vliuchao/comments/104323.html</wfw:comment><comments>http://www.cppblog.com/vliuchao/archive/2009/12/29/104323.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/vliuchao/comments/commentRss/104323.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vliuchao/services/trackbacks/104323.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/vliuchao/archive/2009/12/29/104323.html'>阅读全文</a><img src ="http://www.cppblog.com/vliuchao/aggbug/104323.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vliuchao/" target="_blank">Richard Liu</a> 2009-12-29 00:45 <a href="http://www.cppblog.com/vliuchao/archive/2009/12/29/104323.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RTMP协议详解（一）</title><link>http://www.cppblog.com/vliuchao/archive/2009/12/27/104163.html</link><dc:creator>Richard Liu</dc:creator><author>Richard Liu</author><pubDate>Sat, 26 Dec 2009 16:53:00 GMT</pubDate><guid>http://www.cppblog.com/vliuchao/archive/2009/12/27/104163.html</guid><wfw:comment>http://www.cppblog.com/vliuchao/comments/104163.html</wfw:comment><comments>http://www.cppblog.com/vliuchao/archive/2009/12/27/104163.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/vliuchao/comments/commentRss/104163.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vliuchao/services/trackbacks/104163.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=" utf-8="">
<meta name="ProgId" content="Word.Document">
<meta name="Generator" content="Microsoft Word 12">
<meta name="Originator" content="Microsoft Word 12">
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml">
<link rel="themeData" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx">
<link rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"><!--[if gte mso 9]><xml>
<w:worddocument>
<w:view>Normal</w:view>
<w:zoom>0</w:zoom>
<w:trackmoves/>
<w:trackformatting/>
<w:punctuationkerning/>
<w:drawinggridverticalspacing>7.8 磅</w:drawinggridverticalspacing>
<w:displayhorizontaldrawinggridevery>0</w:displayhorizontaldrawinggridevery>
<w:displayverticaldrawinggridevery>2</w:displayverticaldrawinggridevery>
<w:validateagainstschemas/>
<w:saveifxmlinvalid>false</w:saveifxmlinvalid>
<w:ignoremixedcontent>false</w:ignoremixedcontent>
<w:alwaysshowplaceholdertext>false</w:alwaysshowplaceholdertext>
<w:donotpromoteqf/>
<w:lidthemeother>EN-US</w:lidthemeother>
<w:lidthemeasian>ZH-CN</w:lidthemeasian>
<w:lidthemecomplexscript>X-NONE</w:lidthemecomplexscript>
<w:compatibility>
<w:spaceforul/>
<w:balancesinglebytedoublebytewidth/>
<w:donotleavebackslashalone/>
<w:ultrailspace/>
<w:donotexpandshiftreturn/>
<w:adjustlineheightintable/>
<w:breakwrappedtables/>
<w:snaptogridincell/>
<w:wraptextwithpunct/>
<w:useasianbreakrules/>
<w:dontgrowautofit/>
<w:splitpgbreakandparamark/>
<w:dontvertaligncellwithsp/>
<w:dontbreakconstrainedforcedtables/>
<w:dontvertalignintxbx/>
<w:word11kerningpairs/>
<w:cachedcolbalance/>
<w:usefelayout/>
</w:compatibility>
<w:browserlevel>MicrosoftInternetExplorer4</w:browserlevel>
<m:mathpr>
<m:mathfont m:val="Cambria Math"/>
<m:brkbin m:val="before"/>
<m:brkbinsub m:val="&#45;-"/>
<m:smallfrac m:val="off"/>
<m:dispdef/>
<m:lmargin m:val="0"/>
<m:rmargin m:val="0"/>
<m:defjc m:val="centerGroup"/>
<m:wrapindent m:val="1440"/>
<m:intlim m:val="subSup"/>
<m:narylim m:val="undOvr"/>
</m:mathpr></w:worddocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:latentstyles deflockedstate="false" defunhidewhenused="true"
DefSemiHidden="true" defqformat="false" defpriority="99"
LatentStyleCount="267">
<w:lsdexception locked="false" priority="0" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Normal"/>
<w:lsdexception locked="false" priority="9" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="heading 1"/>
<w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"/>
<w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"/>
<w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"/>
<w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"/>
<w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"/>
<w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"/>
<w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"/>
<w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"/>
<w:lsdexception locked="false" priority="39" name="toc 1"/>
<w:lsdexception locked="false" priority="39" name="toc 2"/>
<w:lsdexception locked="false" priority="39" name="toc 3"/>
<w:lsdexception locked="false" priority="39" name="toc 4"/>
<w:lsdexception locked="false" priority="39" name="toc 5"/>
<w:lsdexception locked="false" priority="39" name="toc 6"/>
<w:lsdexception locked="false" priority="39" name="toc 7"/>
<w:lsdexception locked="false" priority="39" name="toc 8"/>
<w:lsdexception locked="false" priority="39" name="toc 9"/>
<w:lsdexception locked="false" priority="35" qformat="true" name="caption"/>
<w:lsdexception locked="false" priority="10" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Title"/>
<w:lsdexception locked="false" priority="1" name="Default Paragraph Font"/>
<w:lsdexception locked="false" priority="11" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Subtitle"/>
<w:lsdexception locked="false" priority="22" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Strong"/>
<w:lsdexception locked="false" priority="20" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Emphasis"/>
<w:lsdexception locked="false" priority="59" semihidden="false"
UnhideWhenUsed="false" name="Table Grid"/>
<w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"/>
<w:lsdexception locked="false" priority="1" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="No Spacing"/>
<w:lsdexception locked="false" priority="60" semihidden="false"
UnhideWhenUsed="false" name="Light Shading"/>
<w:lsdexception locked="false" priority="61" semihidden="false"
UnhideWhenUsed="false" name="Light List"/>
<w:lsdexception locked="false" priority="62" semihidden="false"
UnhideWhenUsed="false" name="Light Grid"/>
<w:lsdexception locked="false" priority="63" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 1"/>
<w:lsdexception locked="false" priority="64" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 2"/>
<w:lsdexception locked="false" priority="65" semihidden="false"
UnhideWhenUsed="false" name="Medium List 1"/>
<w:lsdexception locked="false" priority="66" semihidden="false"
UnhideWhenUsed="false" name="Medium List 2"/>
<w:lsdexception locked="false" priority="67" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 1"/>
<w:lsdexception locked="false" priority="68" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 2"/>
<w:lsdexception locked="false" priority="69" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 3"/>
<w:lsdexception locked="false" priority="70" semihidden="false"
UnhideWhenUsed="false" name="Dark List"/>
<w:lsdexception locked="false" priority="71" semihidden="false"
UnhideWhenUsed="false" name="Colorful Shading"/>
<w:lsdexception locked="false" priority="72" semihidden="false"
UnhideWhenUsed="false" name="Colorful List"/>
<w:lsdexception locked="false" priority="73" semihidden="false"
UnhideWhenUsed="false" name="Colorful Grid"/>
<w:lsdexception locked="false" priority="60" semihidden="false"
UnhideWhenUsed="false" name="Light Shading Accent 1"/>
<w:lsdexception locked="false" priority="61" semihidden="false"
UnhideWhenUsed="false" name="Light List Accent 1"/>
<w:lsdexception locked="false" priority="62" semihidden="false"
UnhideWhenUsed="false" name="Light Grid Accent 1"/>
<w:lsdexception locked="false" priority="63" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 1 Accent 1"/>
<w:lsdexception locked="false" priority="64" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 2 Accent 1"/>
<w:lsdexception locked="false" priority="65" semihidden="false"
UnhideWhenUsed="false" name="Medium List 1 Accent 1"/>
<w:lsdexception locked="false" unhidewhenused="false" name="Revision"/>
<w:lsdexception locked="false" priority="34" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="List Paragraph"/>
<w:lsdexception locked="false" priority="29" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Quote"/>
<w:lsdexception locked="false" priority="30" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Intense Quote"/>
<w:lsdexception locked="false" priority="66" semihidden="false"
UnhideWhenUsed="false" name="Medium List 2 Accent 1"/>
<w:lsdexception locked="false" priority="67" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 1 Accent 1"/>
<w:lsdexception locked="false" priority="68" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 2 Accent 1"/>
<w:lsdexception locked="false" priority="69" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 3 Accent 1"/>
<w:lsdexception locked="false" priority="70" semihidden="false"
UnhideWhenUsed="false" name="Dark List Accent 1"/>
<w:lsdexception locked="false" priority="71" semihidden="false"
UnhideWhenUsed="false" name="Colorful Shading Accent 1"/>
<w:lsdexception locked="false" priority="72" semihidden="false"
UnhideWhenUsed="false" name="Colorful List Accent 1"/>
<w:lsdexception locked="false" priority="73" semihidden="false"
UnhideWhenUsed="false" name="Colorful Grid Accent 1"/>
<w:lsdexception locked="false" priority="60" semihidden="false"
UnhideWhenUsed="false" name="Light Shading Accent 2"/>
<w:lsdexception locked="false" priority="61" semihidden="false"
UnhideWhenUsed="false" name="Light List Accent 2"/>
<w:lsdexception locked="false" priority="62" semihidden="false"
UnhideWhenUsed="false" name="Light Grid Accent 2"/>
<w:lsdexception locked="false" priority="63" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 1 Accent 2"/>
<w:lsdexception locked="false" priority="64" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 2 Accent 2"/>
<w:lsdexception locked="false" priority="65" semihidden="false"
UnhideWhenUsed="false" name="Medium List 1 Accent 2"/>
<w:lsdexception locked="false" priority="66" semihidden="false"
UnhideWhenUsed="false" name="Medium List 2 Accent 2"/>
<w:lsdexception locked="false" priority="67" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 1 Accent 2"/>
<w:lsdexception locked="false" priority="68" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 2 Accent 2"/>
<w:lsdexception locked="false" priority="69" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 3 Accent 2"/>
<w:lsdexception locked="false" priority="70" semihidden="false"
UnhideWhenUsed="false" name="Dark List Accent 2"/>
<w:lsdexception locked="false" priority="71" semihidden="false"
UnhideWhenUsed="false" name="Colorful Shading Accent 2"/>
<w:lsdexception locked="false" priority="72" semihidden="false"
UnhideWhenUsed="false" name="Colorful List Accent 2"/>
<w:lsdexception locked="false" priority="73" semihidden="false"
UnhideWhenUsed="false" name="Colorful Grid Accent 2"/>
<w:lsdexception locked="false" priority="60" semihidden="false"
UnhideWhenUsed="false" name="Light Shading Accent 3"/>
<w:lsdexception locked="false" priority="61" semihidden="false"
UnhideWhenUsed="false" name="Light List Accent 3"/>
<w:lsdexception locked="false" priority="62" semihidden="false"
UnhideWhenUsed="false" name="Light Grid Accent 3"/>
<w:lsdexception locked="false" priority="63" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 1 Accent 3"/>
<w:lsdexception locked="false" priority="64" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 2 Accent 3"/>
<w:lsdexception locked="false" priority="65" semihidden="false"
UnhideWhenUsed="false" name="Medium List 1 Accent 3"/>
<w:lsdexception locked="false" priority="66" semihidden="false"
UnhideWhenUsed="false" name="Medium List 2 Accent 3"/>
<w:lsdexception locked="false" priority="67" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 1 Accent 3"/>
<w:lsdexception locked="false" priority="68" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 2 Accent 3"/>
<w:lsdexception locked="false" priority="69" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 3 Accent 3"/>
<w:lsdexception locked="false" priority="70" semihidden="false"
UnhideWhenUsed="false" name="Dark List Accent 3"/>
<w:lsdexception locked="false" priority="71" semihidden="false"
UnhideWhenUsed="false" name="Colorful Shading Accent 3"/>
<w:lsdexception locked="false" priority="72" semihidden="false"
UnhideWhenUsed="false" name="Colorful List Accent 3"/>
<w:lsdexception locked="false" priority="73" semihidden="false"
UnhideWhenUsed="false" name="Colorful Grid Accent 3"/>
<w:lsdexception locked="false" priority="60" semihidden="false"
UnhideWhenUsed="false" name="Light Shading Accent 4"/>
<w:lsdexception locked="false" priority="61" semihidden="false"
UnhideWhenUsed="false" name="Light List Accent 4"/>
<w:lsdexception locked="false" priority="62" semihidden="false"
UnhideWhenUsed="false" name="Light Grid Accent 4"/>
<w:lsdexception locked="false" priority="63" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 1 Accent 4"/>
<w:lsdexception locked="false" priority="64" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 2 Accent 4"/>
<w:lsdexception locked="false" priority="65" semihidden="false"
UnhideWhenUsed="false" name="Medium List 1 Accent 4"/>
<w:lsdexception locked="false" priority="66" semihidden="false"
UnhideWhenUsed="false" name="Medium List 2 Accent 4"/>
<w:lsdexception locked="false" priority="67" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 1 Accent 4"/>
<w:lsdexception locked="false" priority="68" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 2 Accent 4"/>
<w:lsdexception locked="false" priority="69" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 3 Accent 4"/>
<w:lsdexception locked="false" priority="70" semihidden="false"
UnhideWhenUsed="false" name="Dark List Accent 4"/>
<w:lsdexception locked="false" priority="71" semihidden="false"
UnhideWhenUsed="false" name="Colorful Shading Accent 4"/>
<w:lsdexception locked="false" priority="72" semihidden="false"
UnhideWhenUsed="false" name="Colorful List Accent 4"/>
<w:lsdexception locked="false" priority="73" semihidden="false"
UnhideWhenUsed="false" name="Colorful Grid Accent 4"/>
<w:lsdexception locked="false" priority="60" semihidden="false"
UnhideWhenUsed="false" name="Light Shading Accent 5"/>
<w:lsdexception locked="false" priority="61" semihidden="false"
UnhideWhenUsed="false" name="Light List Accent 5"/>
<w:lsdexception locked="false" priority="62" semihidden="false"
UnhideWhenUsed="false" name="Light Grid Accent 5"/>
<w:lsdexception locked="false" priority="63" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 1 Accent 5"/>
<w:lsdexception locked="false" priority="64" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 2 Accent 5"/>
<w:lsdexception locked="false" priority="65" semihidden="false"
UnhideWhenUsed="false" name="Medium List 1 Accent 5"/>
<w:lsdexception locked="false" priority="66" semihidden="false"
UnhideWhenUsed="false" name="Medium List 2 Accent 5"/>
<w:lsdexception locked="false" priority="67" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 1 Accent 5"/>
<w:lsdexception locked="false" priority="68" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 2 Accent 5"/>
<w:lsdexception locked="false" priority="69" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 3 Accent 5"/>
<w:lsdexception locked="false" priority="70" semihidden="false"
UnhideWhenUsed="false" name="Dark List Accent 5"/>
<w:lsdexception locked="false" priority="71" semihidden="false"
UnhideWhenUsed="false" name="Colorful Shading Accent 5"/>
<w:lsdexception locked="false" priority="72" semihidden="false"
UnhideWhenUsed="false" name="Colorful List Accent 5"/>
<w:lsdexception locked="false" priority="73" semihidden="false"
UnhideWhenUsed="false" name="Colorful Grid Accent 5"/>
<w:lsdexception locked="false" priority="60" semihidden="false"
UnhideWhenUsed="false" name="Light Shading Accent 6"/>
<w:lsdexception locked="false" priority="61" semihidden="false"
UnhideWhenUsed="false" name="Light List Accent 6"/>
<w:lsdexception locked="false" priority="62" semihidden="false"
UnhideWhenUsed="false" name="Light Grid Accent 6"/>
<w:lsdexception locked="false" priority="63" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 1 Accent 6"/>
<w:lsdexception locked="false" priority="64" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 2 Accent 6"/>
<w:lsdexception locked="false" priority="65" semihidden="false"
UnhideWhenUsed="false" name="Medium List 1 Accent 6"/>
<w:lsdexception locked="false" priority="66" semihidden="false"
UnhideWhenUsed="false" name="Medium List 2 Accent 6"/>
<w:lsdexception locked="false" priority="67" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 1 Accent 6"/>
<w:lsdexception locked="false" priority="68" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 2 Accent 6"/>
<w:lsdexception locked="false" priority="69" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 3 Accent 6"/>
<w:lsdexception locked="false" priority="70" semihidden="false"
UnhideWhenUsed="false" name="Dark List Accent 6"/>
<w:lsdexception locked="false" priority="71" semihidden="false"
UnhideWhenUsed="false" name="Colorful Shading Accent 6"/>
<w:lsdexception locked="false" priority="72" semihidden="false"
UnhideWhenUsed="false" name="Colorful List Accent 6"/>
<w:lsdexception locked="false" priority="73" semihidden="false"
UnhideWhenUsed="false" name="Colorful Grid Accent 6"/>
<w:lsdexception locked="false" priority="19" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Subtle Emphasis"/>
<w:lsdexception locked="false" priority="21" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Intense Emphasis"/>
<w:lsdexception locked="false" priority="31" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Subtle Reference"/>
<w:lsdexception locked="false" priority="32" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Intense Reference"/>
<w:lsdexception locked="false" priority="33" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Book Title"/>
<w:lsdexception locked="false" priority="37" name="Bibliography"/>
<w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"/>
</w:latentstyles>
</xml><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:1;
mso-generic-font-family:roman;
mso-font-format:other;
mso-font-pitch:variable;
mso-font-signature:0 0 0 0 0 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:-1610611985 1073750139 0 0 159 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;
mso-font-kerning:1.0pt;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:595.3pt 841.9pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:42.55pt;
mso-footer-margin:49.6pt;
mso-paper-source:0;
layout-grid:15.6pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}
</style>
<![endif]-->
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">Real Time
Messaging Protocol</span><span style="font-family: 宋体;">（实时消息传送协议协议</span><span lang="EN-US">)</span><span style="font-family: 宋体;">是</span><span lang="EN-US">Adobe Systems</span><span style="font-family: 宋体;">公司为</span><span lang="EN-US">Flash</span><span style="font-family: 宋体;">播放器和服务器之间音频、视频和数据传输开发的私有协议。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">具体使用</span><span lang="EN-US">RTMP</span><span style="font-family: 宋体;">的</span><span lang="EN-US">AS</span><span style="font-family: 宋体;">代码大概如下：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">　　</span><span lang="EN-US">var videoInstance:Video = your_video_instance;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">　　</span><span lang="EN-US">var nc:NetConnection = new NetConnection();<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">　　</span><span lang="EN-US">var connected:Boolean = nc.connect("rtmp://localhost/myapp");<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">　　</span><span lang="EN-US">var ns:NetStream = new NetStream(nc);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">　　</span><span lang="EN-US">videoInstance.attachVideo(ns);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent: 20.25pt;"><span lang="EN-US">ns.play("flvName");</span></p>
<p class="MsoNormal" style="text-indent: 20.25pt;"><span lang="EN-US">Adobe</span><span style="font-family: 宋体;">也在官方网站已经提供了</span><span lang="EN-US">RTMP</span><span style="font-family: 宋体;">协议的官方文档说明，为什么要写这个系列文章最大的原因只是对前一段工作的一个总结和回顾，最近两个月，实现了一个</span><span lang="EN-US">RTMP Server</span><span style="font-family: 宋体;">的</span><span lang="EN-US">c++</span><span style="font-family: 宋体;">版本，把公司的流媒体服务和</span><span lang="EN-US">flash</span><span style="font-family: 宋体;">无缝对接起来。希望我的文字能给后来研究这个协议的同学有一定的帮助。</span></p>
<p class="MsoNormal" style="text-indent: 20.25pt;"><span lang="EN-US">RTMP</span><span style="font-family: 宋体;">协议是一个基于</span><span lang="EN-US">TCP</span><span style="font-family: 宋体;">的高层协议族，当然这个玩意据说还有</span><span lang="EN-US">UDP</span><span style="font-family: 宋体;">协议版本的，不过现在还没有出来，好像</span><span lang="EN-US">Adobe</span><span style="font-family: 宋体;">下一版本的</span><span lang="EN-US">FMS</span><span style="font-family: 宋体;">会提供支持。下文将要描述的是</span><span lang="EN-US">TCP</span><span style="font-family: 宋体;">协议版本的协议。</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp; </span>RTMP</span><span style="font-family: 宋体;">协议的概要理解：</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">RTMP</span><span style="font-family: 宋体;">协议是为了和</span><span lang="EN-US">flash</span><span style="font-family: 宋体;">之间交换信令以及媒体数据。为了提高使用效率信令和媒体数据都是使用相同的机制。因为是相同的机制</span><span lang="EN-US">Adobe</span><span style="font-family: 宋体;">就整出来了一些比较搞人的概念，当然每个协议第一次接触都是比较难理解的。</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">在</span><span lang="EN-US">RTMP</span><span style="font-family: 宋体;">协议中信令和媒体数据都称之为</span><span lang="EN-US">Message</span><span style="font-family: 宋体;">，在网络中传输这些</span><span lang="EN-US">Message</span><span style="font-family: 宋体;">，为了区分它们肯定是要加一个</span><span lang="EN-US">Message <span>&nbsp;</span>head</span><span style="font-family: 宋体;">的，所以</span><span lang="EN-US">RTMP</span><span style="font-family: 宋体;">协议也有一个</span><span lang="EN-US">Message
head</span><span style="font-family: 宋体;">，还有一个问题因为</span><span lang="EN-US">RTMP</span><span style="font-family: 宋体;">协议是基于</span><span lang="EN-US">TCP</span><span style="font-family: 宋体;">的，由于</span><span lang="EN-US">TCP</span><span style="font-family: 宋体;">的包长度是有限制的（一般来说不超过</span><span lang="EN-US">1500</span><span style="font-family: 宋体;">个字节），而</span><span lang="EN-US">RTMP</span><span style="font-family: 宋体;">的</span><span lang="EN-US">Message</span><span style="font-family: 宋体;">长度是有可能很大的，像一个视频帧的包可能会有几十甚至几千</span><span lang="EN-US">K</span><span style="font-family: 宋体;">，这个问题就必然有一个分片的问题，在</span><span lang="EN-US">RTMP</span><span style="font-family: 宋体;">协议中对应的说法就是</span><span lang="EN-US">chunk</span><span style="font-family: 宋体;">，每一个</span><span lang="EN-US">Message + head</span><span style="font-family: 宋体;">都是由一个和多个</span><span lang="EN-US">chunk</span><span style="font-family: 宋体;">组成的。到这里对</span><span lang="EN-US">RTMP</span><span style="font-family: 宋体;">协议的概要理解就算完了。</span></p><img src ="http://www.cppblog.com/vliuchao/aggbug/104163.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vliuchao/" target="_blank">Richard Liu</a> 2009-12-27 00:53 <a href="http://www.cppblog.com/vliuchao/archive/2009/12/27/104163.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>精确地计时方式，可以用来评判算法的运行时间</title><link>http://www.cppblog.com/vliuchao/archive/2009/05/28/86052.html</link><dc:creator>Richard Liu</dc:creator><author>Richard Liu</author><pubDate>Thu, 28 May 2009 15:17:00 GMT</pubDate><guid>http://www.cppblog.com/vliuchao/archive/2009/05/28/86052.html</guid><wfw:comment>http://www.cppblog.com/vliuchao/comments/86052.html</wfw:comment><comments>http://www.cppblog.com/vliuchao/archive/2009/05/28/86052.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/vliuchao/comments/commentRss/86052.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vliuchao/services/trackbacks/86052.html</trackback:ping><description><![CDATA[
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><span style="color: rgb(0, 128, 128);">&#160;&#160; &#160;在做涉及到算法的时候，想验证一下算法的实现优劣的时候总是需要一个算法的计算时间的判断的，可惜Windows和linux等操作系统提供的记时貌似都不是很准，这个可能和现在的操作系统的时间片轮转有关吧，也可能是我比较老土啦，反正我一直在x86体系的机器上是没有找到太好的计时方式的，最近偶然和同事聊天的时候知道了一个比较精确地记时方式，感觉不错哦，使用的是CPU指令级别的判定应该是比较准的哦，Windows系统的代码如下</span></div><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">1</span>&#160;<span style="color: #000000; ">&#160;&#160;inline&#160;unsigned&#160;__int64&#160;GetCycleCount()&#160;<br></span><span style="color: #008080; ">2</span>&#160;<span style="color: #000000; ">{&#160;<br></span><span style="color: #008080; ">3</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;__asm&#160;_emit&#160;</span><span style="color: #000000; ">0x0F</span><span style="color: #000000; ">&#160;<br></span><span style="color: #008080; ">4</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;__asm&#160;_emit&#160;</span><span style="color: #000000; ">0x31</span><span style="color: #000000; ">&#160;<br></span><span style="color: #008080; ">5</span>&#160;<span style="color: #000000; ">}&#160;</span></div><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; ">简单的几句，在VC下面是可以编译通过的哦，算出来的结果是系统开机以来的CPU时钟节拍数，理论上说这个结果应该是比较准的哦，至于是不是CPU时钟节拍那我也不是很清楚啦？感觉好像是这么个名词哦，以前学的组成原理忘得差不多了哦，不过我可以确定的是算出来的最终结果的计量单位是一个CPU时钟周期的八分之一。</div><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; ">&#160;&#160; &#160;同样的在linux系统下面也有类似的方式，对应的实现方法</div><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><div style="background-color: rgb(238, 238, 238); border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; ">&#160;&#160;__inline__ unsigned long long int rdtsc()</div><div style="background-color: rgb(238, 238, 238); border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; ">&#160;&#160; {</div><div style="background-color: rgb(238, 238, 238); border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; ">&#160;&#160; &#160; __asm__ volatile (".byte 0x0f, 0x31");</div><div style="background-color: rgb(238, 238, 238); border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; ">&#160;&#160; }</div></div><img src ="http://www.cppblog.com/vliuchao/aggbug/86052.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vliuchao/" target="_blank">Richard Liu</a> 2009-05-28 23:17 <a href="http://www.cppblog.com/vliuchao/archive/2009/05/28/86052.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多线程编程学习笔记（1）- 进程和线程的异同</title><link>http://www.cppblog.com/vliuchao/archive/2009/01/10/71677.html</link><dc:creator>Richard Liu</dc:creator><author>Richard Liu</author><pubDate>Sat, 10 Jan 2009 13:17:00 GMT</pubDate><guid>http://www.cppblog.com/vliuchao/archive/2009/01/10/71677.html</guid><wfw:comment>http://www.cppblog.com/vliuchao/comments/71677.html</wfw:comment><comments>http://www.cppblog.com/vliuchao/archive/2009/01/10/71677.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/vliuchao/comments/commentRss/71677.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vliuchao/services/trackbacks/71677.html</trackback:ping><description><![CDATA[进程和线程的相似之处：<div>线程和进程都有ID，寄存器组，状态，优先权，信息块。</div><div>线程和进程都与父进程共享资源。</div><div>线程和进程在创建以后都是独立的实体。</div><div><span  style="color: rgb(255, 0, 0);">进程和线程的创建者对其拥有控制权。</span></div><div><span  style="color: rgb(255, 0, 0);">进程和线程都可以在创建以后修改属性和创建新的资源。<br></span></div><div><span  style="color: rgb(255, 0, 0);">进程和线程都不可以访问其他与自己无关的进程和线程的资源。<br></span></div><div><span  style="color: rgb(255, 0, 0);">进程和线程的不同之处：<br></span></div><div><span  style="color: rgb(255, 0, 0);">进程有一个自己的地址空间，线程没有自己的地址空间。</span></div><div><span  style="color: rgb(255, 0, 0);">父进程和子进程通信必须使用进程间的通信机制，而父进程和子线程进行通信就可以直接通信，同一进程的线程可以直接写入和读取读取进程的变量。</span></div><div><span  style="color: rgb(255, 0, 0);">子进程不可以对其他子进程进行影响，子线程可以对其他子线程进行影响。</span></div><div><span  style="color: rgb(255, 0, 0);">子进程不可以对父进程施加控制，进程的所有子线程都可以对主线程施加控制，并影响整个进程。</span></div><img src ="http://www.cppblog.com/vliuchao/aggbug/71677.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vliuchao/" target="_blank">Richard Liu</a> 2009-01-10 21:17 <a href="http://www.cppblog.com/vliuchao/archive/2009/01/10/71677.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC中一个小技巧---获取窗口所有的同类控件</title><link>http://www.cppblog.com/vliuchao/archive/2008/12/24/70276.html</link><dc:creator>Richard Liu</dc:creator><author>Richard Liu</author><pubDate>Wed, 24 Dec 2008 13:40:00 GMT</pubDate><guid>http://www.cppblog.com/vliuchao/archive/2008/12/24/70276.html</guid><wfw:comment>http://www.cppblog.com/vliuchao/comments/70276.html</wfw:comment><comments>http://www.cppblog.com/vliuchao/archive/2008/12/24/70276.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/vliuchao/comments/commentRss/70276.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vliuchao/services/trackbacks/70276.html</trackback:ping><description><![CDATA[<br>&nbsp;&nbsp; 最近写一个小的工具，用到MFC做界面，窗口中有很多Edit控件，来处理用户的输入值，在初始状态是不可见的，按下Button应该有一个响应显示所有Edit控件，刚开始的时候想直接调用 ShowWindow了事，可是实在是控件太多了哦，一个一个写确实很麻烦哦，不知道有什么好方法，问了一下非哥，想不到真的有一种好的方法可以解决这样的需求，非哥不愧为MFC活化石<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: #000000">CWnd&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pWnd&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetWindow(&nbsp;GW_CHILD&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(&nbsp;pWnd&nbsp;)<br><img id=Codehighlighter1_56_184_Open_Image onclick="this.style.display='none'; Codehighlighter1_56_184_Open_Text.style.display='none'; Codehighlighter1_56_184_Closed_Image.style.display='inline'; Codehighlighter1_56_184_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_56_184_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_56_184_Closed_Text.style.display='none'; Codehighlighter1_56_184_Open_Image.style.display='inline'; Codehighlighter1_56_184_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_56_184_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_184_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;pWnd</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">IsKindOf(&nbsp;RUNTIME_CLASS(CEdit)&nbsp;)&nbsp;)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pWnd</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">ShowWindow(SW_SHOW);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pWnd&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pWnd</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetWindow(&nbsp;GW_HWNDNEXT&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
上面的代码实现了显示窗口中所有的CEdit控件，先是获取当前窗口的子窗口，在判断是否是CEdit类的实例，<br>ShowWindow，在得到子窗口的兄弟节点，哎！MFC有时还是比较有意思的哦！
<img src ="http://www.cppblog.com/vliuchao/aggbug/70276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vliuchao/" target="_blank">Richard Liu</a> 2008-12-24 21:40 <a href="http://www.cppblog.com/vliuchao/archive/2008/12/24/70276.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开发航片处理工具的一点感受</title><link>http://www.cppblog.com/vliuchao/archive/2008/12/22/70111.html</link><dc:creator>Richard Liu</dc:creator><author>Richard Liu</author><pubDate>Mon, 22 Dec 2008 15:13:00 GMT</pubDate><guid>http://www.cppblog.com/vliuchao/archive/2008/12/22/70111.html</guid><wfw:comment>http://www.cppblog.com/vliuchao/comments/70111.html</wfw:comment><comments>http://www.cppblog.com/vliuchao/archive/2008/12/22/70111.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/vliuchao/comments/commentRss/70111.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vliuchao/services/trackbacks/70111.html</trackback:ping><description><![CDATA[&#160;&#160; 看到电脑上一张张美丽的航片的时候，终于是出来哦，哎！最近忙活了大半个月俺终于还是把这个工具整出来了哦。回想起来开发这个工具的时候的种种，说实话 真是折磨人哦，几易其稿，系统的架构就改过好几次哦，基本上是一个星期改一次。<div>在这个过程中收获还是不少的哦，痛并快乐着，不能不佩服老大的架构的思想，在英明神武的老大的指导下开发出一个基本上比较符合面向对象的软件，其中的编程思想的冲击是巨大的哦，颠覆了我以前做程序的很多固有观点。</div><div>首先来说说该工具的需求，对已有的大尺寸的航片进行切割，切割出给定宽高的航片，在提层合并航片。具体来说就是如果有一张1024 * 1024的航片切割成8 * 8张 128*128大小的航片为第零层，提层比率为2，则第1层就是原航片的256*256大小的，但是要保存为128 *128的航片 这样的航片有4 *4张，依次类推，第2层 第 3层...，还有这些航片的编号以LLXXXYYY编号，坐标原点为航片左下角，ll为层数，XXX为X轴上航片编号，YYY为Y轴上的航片的编号。</div><div>刚开始听到这个需求的时候确实是没有什么头绪，研究了一下libtiff就开始搞了哦，刚开始的时候很快就把航片的读写搞定了，以为会很快就解决问题啦，闷着头在那里狂写代码，第一版交给老大，被鄙视的不行哦，首先因为需求没有理解清楚，自己理解的图像编号和老大所说的图像编号的顺序不同哦，回过来改代码发现居然无从下手，还有就是老大要生成航片处理的结果，也无法在代码中体现。说实话当时心里还是比较嘀咕的，觉得老大交代问题没有交代清楚，后来老大说的一句话还是比较有道理的，客户的需求是不断变化的，你要是想让用户来适应你的设计是不可能的，你的设计应该是自适应的，能够应对客户不断变化的需求。听完这句话，只有无语接着在那里写代码，等我写的七七八八了，老大有空看了一下我的代码，继续鄙视我哦，为何？模块划分不清，UI层中有太多航片处理的逻辑，航片处理模块中也有太多的航片编号的逻辑。一句话 整个代码只是为做实现这个功能，毫无扩展性，如果以后在在上面添加功能基本上是没有可能。</div><div>哎！老大当时这样说了，让我修改代码，当时真是想死的心都有了哦，修改也不知道怎么下手，和老大探讨了半天，终于是定下了架构，呵呵当然啦，主要还是老大定的架构。这次交流收获还是不少的哦。</div><div>做软件首先应该定下的是输入和输出，确定数据的流向。从UI层定义输入，确定尽可能少的输入参数，从输出确定数据，输入参数到输出之间确定数据的流向，对数据的流向进行功能上的划分，确定不同的模块，模块之间尽可能少的耦合性，如果一个数据和操作是相互关联的则可以视为一个对象，对象的设计应该考虑到扩展性，尽可能的从一个基类派生，为以后扩展提供基础，使用工厂模式来确定不同的对象。还有就是UI与底层数据处理模块应该没有关联，通过一个处理模块来出来UI和底层模块之间的交换。</div><div>&#160;&#160;哎，这样做下来，我的工具有5个模块，一个处理编号生成的模块A，一个参数保存的模块B，一个处理航片读写的模块C，一个生成切割航片的模块D，一个与UI交互和与底层交互的模块E，它们之间的依赖关系为 E依赖于A D， A依赖于B， D依赖于C，这样模块间依赖清楚，接口也定义的明确。</div><div>收获哦！有一种豁然开朗的感觉，以后有机会独立开发的时候应该多想想这样的问题，争取早日有所成就哦！</div><img src ="http://www.cppblog.com/vliuchao/aggbug/70111.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vliuchao/" target="_blank">Richard Liu</a> 2008-12-22 23:13 <a href="http://www.cppblog.com/vliuchao/archive/2008/12/22/70111.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VS2005开发DLL工程</title><link>http://www.cppblog.com/vliuchao/archive/2008/12/21/69962.html</link><dc:creator>Richard Liu</dc:creator><author>Richard Liu</author><pubDate>Sat, 20 Dec 2008 16:40:00 GMT</pubDate><guid>http://www.cppblog.com/vliuchao/archive/2008/12/21/69962.html</guid><wfw:comment>http://www.cppblog.com/vliuchao/comments/69962.html</wfw:comment><comments>http://www.cppblog.com/vliuchao/archive/2008/12/21/69962.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/vliuchao/comments/commentRss/69962.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vliuchao/services/trackbacks/69962.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不知道现在还有没有人在开发DLL，其实VS下面开发C++的DLL还是很方便的，而且Release的时候也很方便，只要把模块的只能划分清楚，封装好不同的DLL工程，在一个主工程里面引用这些不同的DLL工程还是很不错的，这样发布的时候有一个主工程的EXE 和不同的DLL就可以了，不论是调试还是Release都比较简单，下面就简单说说开发的过程。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先要有一个解决方案，我想这个怎么搞就不用我在这里废话了哦，生成一个项目作为界面，同时这个项目也是主项目。在该解决方案下面添加实现不同功能的各种项目，这些项目在向导中选择的时候选择为win32 项目，在为win32项目的应用程序设置中选择DLL就可以建立一个DLL工程了，在DLL工程中添加自己写的头文件和CPP文件，这样就建立了一个DLL不过现在还没有导出DLL。<br>&nbsp;&nbsp;&nbsp;&nbsp; 要生成一个DLL还必须添加导出函数的宏， __declspec(dllexport)和__declspec(dllimport) 这里有一个小的技巧，就是利用工程的预编译宏来设置如果有一个工程名为Test，在要导出的类前面加上如下的代码
<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">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#ifdef&nbsp;TEST_EXPORTS<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;TEST_API&nbsp;&nbsp;__declspec(dllexport)</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#else</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;TEST_API&nbsp;__declspec(dllimport)</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#endif</span></div>
如果要导出的类名为class exportA;则可以在头文件中类的声明可以这样写class TEST_API&nbsp;exportA结可以把整个类导出了，在主工程中引用导出类exportA 只要包含该头文件就可以了，为什么会这样这是因为使用了上面的预编译头的缘故哦，在DLL工程中存在TEST_EXPORTS宏，所以在DLL工程中是类导出，在其他引用该工程的工程中包含搞头文件因为不存在TEST_EXPORTS宏，所以是类导入，呵呵 比较巧妙吧，其实看看网上的很多开源的库生成DLL的好像很多也使用了该方法，不过可能可能开源库很少是用VS开发的，所以不知道他们具体是怎么搞的。但是确实看到很多的开源库的配置文件性质的投文件中使用了这个技巧的。<br>&nbsp;&nbsp;&nbsp;&nbsp; 上面说的还有一个问题就是在其他工程中包含DLL工程还存在问题，无法引用导出的类，应该还有一个工作要做那就是应该包含DLL工程生成的lib 和dll文件加上导出类的头文件就可以直接使用DLL工程中的类了哦，不过如果是自己开发还是最好把DLL工程和要引用DLL的工程作为一个解决方案的啦，这样方便调试的，这里有几个问题要注意：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 项目依赖一定要设置好，至于怎么设置 那我就不说了哦，呵呵 在项目右键总是会的哦<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 项目引用要设置哦，比如说工程A使用了exportA类，那就一定要设置引用，引用工程Test，怎么设置，在A的通用属性中的引用中设置啦。<br>&nbsp;&nbsp;&nbsp; ok这样就可以开发出使用DLL的工程了哦，Release的时候含有一大堆的DLL给用户搞得很专业的样子哦，呵呵！PS：可能有人说导出类会暴露很多细节给用户啦，呵呵这个其实也好解决的哦，看看OCI的封装就会知道哦，使用私有类就可以隐藏所有的私有方法和属性的哦，具体怎么搞？呵呵去看看exception C++上关于IMPL的啦 上面有很好的说明撒。
<img src ="http://www.cppblog.com/vliuchao/aggbug/69962.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vliuchao/" target="_blank">Richard Liu</a> 2008-12-21 00:40 <a href="http://www.cppblog.com/vliuchao/archive/2008/12/21/69962.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中的流(1)</title><link>http://www.cppblog.com/vliuchao/archive/2008/12/12/69301.html</link><dc:creator>Richard Liu</dc:creator><author>Richard Liu</author><pubDate>Fri, 12 Dec 2008 14:43:00 GMT</pubDate><guid>http://www.cppblog.com/vliuchao/archive/2008/12/12/69301.html</guid><wfw:comment>http://www.cppblog.com/vliuchao/comments/69301.html</wfw:comment><comments>http://www.cppblog.com/vliuchao/archive/2008/12/12/69301.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/vliuchao/comments/commentRss/69301.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vliuchao/services/trackbacks/69301.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">流在</span><span lang=EN-US>C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的地位是很重要的，流的概念随</span><span lang=EN-US>C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序设计语言问世以来就存在，</span><span lang=EN-US>ANSI C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中</span><span lang=EN-US>C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">流大概占三分之一的比重，从中可以看出流的重要。</span></p>
<p class=MsoNormal style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在学校的时候接触</span><span lang=EN-US>C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，其实学习的第一个</span><span lang=EN-US>hello world</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序就使用了流<br></p>
</span>&nbsp;
<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">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">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">argv[])<br></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img id=Codehighlighter1_76_106_Open_Image onclick="this.style.display='none'; Codehighlighter1_76_106_Open_Text.style.display='none'; Codehighlighter1_76_106_Closed_Image.style.display='inline'; Codehighlighter1_76_106_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_76_106_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_76_106_Closed_Text.style.display='none'; Codehighlighter1_76_106_Open_Image.style.display='inline'; Codehighlighter1_76_106_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_76_106_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_76_106_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">hello&nbsp;world</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br></span><span style="COLOR: #008080">8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
&nbsp;其中的cout就是标准IO流，往标准终端输出，输出类型为const char数组，但是也可以输出数值，不论是int型还是浮点数都可以输出，输出到标准终端的都是字符型数组。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对应cout的有cin为从标准输入设备得到输入，简单的示例如下<br>&nbsp;
<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">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><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><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></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<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><br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">argv[])<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img id=Codehighlighter1_76_126_Open_Image onclick="this.style.display='none'; Codehighlighter1_76_126_Open_Text.style.display='none'; Codehighlighter1_76_126_Closed_Image.style.display='inline'; Codehighlighter1_76_126_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_76_126_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_76_126_Closed_Text.style.display='none'; Codehighlighter1_76_126_Open_Image.style.display='inline'; Codehighlighter1_76_126_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_76_126_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_76_126_Open_Text><span style="COLOR: #000000">{<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;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;X;<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Y;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;cin</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">X</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">Y;<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;X</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">Y</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<p>上个示例中中从标准输入设备，如键盘输入数值可以赋值给int变量 X ，Y值，间隔输入用回车来隔开。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 简单的说了一下C++的流，那具体来说说什么是流，流可以从输入输出方面来理解，就是用来传递数据的的一个无结构的字节序列、字符序列、或者任意同等大小的单位的数据序列，就像一个流动的管道来承载数据，估计这就是为什么叫做流的缘故吧，俺猜的哦!</p>
<p>&nbsp;&nbsp;&nbsp; 标准C++支持流IO，也就是流形式的IO，对于流形式的IO实际形式的接口隐藏在IO流的接口中，对流IO的用户来说与IO交互的就是字符流，呵呵记住哦，就是字符流，不是字节流也不是位流哦，这里字符流有两种形式，一种char型的，一种的wchar_t型的。上面说到的cin和cout方法就是用来和流IO进行交互的，当然还有cerr和clog这个以后专门来讲讲哦。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在实际的编程中还会用到另外一种形式的流——串，这个也是流的一种，具体怎么来定义串，俺也不知道哦，等什么时候找到经典定义了在来说说哦。这里就讲讲几个用串的经典用法，编程的时候经常用到的几个方法。<br></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"><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">sstream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><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>template&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><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>std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;&nbsp;ToString(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;T</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;_value)<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img id=Codehighlighter1_77_137_Open_Image onclick="this.style.display='none'; Codehighlighter1_77_137_Open_Text.style.display='none'; Codehighlighter1_77_137_Closed_Image.style.display='inline'; Codehighlighter1_77_137_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_77_137_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_77_137_Closed_Text.style.display='none'; Codehighlighter1_77_137_Open_Image.style.display='inline'; Codehighlighter1_77_137_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_77_137_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_77_137_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>std::ostringstream&nbsp;o;&nbsp;&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>o&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;_value;&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></span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">(o.str());<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"><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><br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>template&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>T&nbsp;FromString(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;_value)<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img id=Codehighlighter1_199_260_Open_Image onclick="this.style.display='none'; Codehighlighter1_199_260_Open_Text.style.display='none'; Codehighlighter1_199_260_Closed_Image.style.display='inline'; Codehighlighter1_199_260_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_199_260_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_199_260_Closed_Text.style.display='none'; Codehighlighter1_199_260_Open_Image.style.display='inline'; Codehighlighter1_199_260_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_199_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_199_260_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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>std::istringstream&nbsp;i(_value);&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>T&nbsp;t;<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>i&nbsp;</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">&nbsp;t;&nbsp;<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">(t);<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>上面两个函数可以实现在C++中的字符串转数值和数值转字符串，至于为什么能实现转换，这就是因为流的实现形式一般都是分为四个步骤的：<br>1&nbsp; 格式化解析<br>2 缓冲<br>3 编码转换<br>4 传递<br>上面的两个函数没有涉及到编码转换的问题，这个由local类来实现的，会在后续的文章来接着分析啦，在这里在丢一个常用的数值转字符串的常用方法来结束本文哦，<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"><span style="COLOR: #008080">&nbsp;1</span><img id=Codehighlighter1_0_204_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_204_Open_Text.style.display='none'; Codehighlighter1_0_204_Closed_Image.style.display='inline'; Codehighlighter1_0_204_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_0_204_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_204_Closed_Text.style.display='none'; Codehighlighter1_0_204_Open_Image.style.display='inline'; Codehighlighter1_0_204_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span id=Codehighlighter1_0_204_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">/**/</span><span id=Codehighlighter1_0_204_Open_Text><span style="COLOR: #808080">///</span><span style="COLOR: #008000">对齐数&nbsp;_value是要转换的数值，_alignLen是对齐<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">的长度,这个方法的应用还是比较多的哦，像输入10&nbsp;1&nbsp;<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">100这类数值前面要用0补齐即010，001，100这样的形<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">式，用串来实现就不用用if判断了&gt;100,&gt;10,&gt;1的情况<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">这还只是三位数的情况，要是十位数或者更多，我估计用<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">if来判断那还不是疯了哦，还是用我这个函数好哦，只要<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">一个参数什么都搞定</span><span style="COLOR: #808080"></span></span><br><span style="COLOR: #008080">&nbsp;8</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">sstream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><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>template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">typename&nbsp;T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;GetAlignment(T&nbsp;_value,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_alignLen)<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img id=Codehighlighter1_289_430_Open_Image onclick="this.style.display='none'; Codehighlighter1_289_430_Open_Text.style.display='none'; Codehighlighter1_289_430_Closed_Image.style.display='inline'; Codehighlighter1_289_430_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_289_430_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_289_430_Closed_Text.style.display='none'; Codehighlighter1_289_430_Open_Image.style.display='inline'; Codehighlighter1_289_430_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_289_430_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_289_430_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>ostringstream&nbsp;returnNum;<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>returnNum.width(_alignLen);<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>returnNum.fill(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>returnNum</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">_value;<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>returnNum.width(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;(returnNum.str());<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>&nbsp;今天就说到这里哦，下次对流进行详细的剖析哦！
<img src ="http://www.cppblog.com/vliuchao/aggbug/69301.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vliuchao/" target="_blank">Richard Liu</a> 2008-12-12 22:43 <a href="http://www.cppblog.com/vliuchao/archive/2008/12/12/69301.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>