﻿<?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++博客-n's 燃烧小宇宙</title><link>http://www.cppblog.com/neverwinter/</link><description /><language>zh-cn</language><lastBuildDate>Mon, 06 Apr 2026 00:00:06 GMT</lastBuildDate><pubDate>Mon, 06 Apr 2026 00:00:06 GMT</pubDate><ttl>60</ttl><item><title>C++检查浮点类型能否转换为整型</title><link>http://www.cppblog.com/neverwinter/archive/2011/06/19/148964.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Sun, 19 Jun 2011 08:06:00 GMT</pubDate><guid>http://www.cppblog.com/neverwinter/archive/2011/06/19/148964.html</guid><wfw:comment>http://www.cppblog.com/neverwinter/comments/148964.html</wfw:comment><comments>http://www.cppblog.com/neverwinter/archive/2011/06/19/148964.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/neverwinter/comments/commentRss/148964.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/neverwinter/services/trackbacks/148964.html</trackback:ping><description><![CDATA[最近尝试用Cocoa做一个四则运算计算器来练手，类似于Windows cmd: calc的那种。<br /><br />毕竟这个东西算是我们项目组的入门练习，当年很多新人刚进来，老组长都会教他们用MFC/QT做个计算器来看看水平。由于各种原因，我当年倒是没有受到这种&#8220;礼遇&#8221;，等我真正开始做软件的时候，还是服务器端这样的纯C++代码做得比较多。但是不做不知道，一做才发现UI的逻辑还是挺复杂的，比如说，按&#8220;1&#8221;是追加到当前显示还是覆盖现有的显示呢，最后把逻辑弄清楚倒不是很麻烦，但要写出好看的代码还是有比较大的差距的。<br /><br />以上都是前言，好像比较长&#8230;&#8230;<br /><br />要说的是，在这个过程中发现的问题，计算结果是浮点数，要怎么判断其是否能无损地转换成整数，从而消除小数点后的一段无用的&#8220;0&#8221;，以更好地显示。直接上代码：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;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; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;FloatType</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;_floattype_meta<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">};<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">template</span><span style="color: #000000; ">&lt;&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;_floattype_meta</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">enum</span><span style="color: #000000; ">&nbsp;{<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXPO_OFFSET&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">23</span><span style="color: #000000; ">,<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXPO_LEN&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">8</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;};<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;uint32_t&nbsp;match_uint_type;<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">};<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">template</span><span style="color: #000000; ">&lt;&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;_floattype_meta</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">enum</span><span style="color: #000000; ">&nbsp;{<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXPO_OFFSET&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">52</span><span style="color: #000000; ">,<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXPO_LEN&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">11</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;};<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;uint64_t&nbsp;match_uint_type;<br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">};<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;FloatType</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;float_to_int<br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;_floattype_meta</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">FloatType</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;_meta;<br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">()&nbsp;(&nbsp;FloatType&nbsp;f,&nbsp;FloatType&nbsp;precision&nbsp;)<br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;_meta::match_uint_type&nbsp;EXPO_MASK&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;<br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #000000; ">~</span><span style="color: #000000; ">((</span><span style="color: #000000; ">~</span><span style="color: #000000; ">(_meta::match_uint_type)</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;_meta::EXPO_LEN&nbsp;))&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;_meta::EXPO_OFFSET;<br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_meta::match_uint_type</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pf&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(_meta::match_uint_type</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">f;<br /></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;expo&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;((</span><span style="color: #000000; ">*</span><span style="color: #000000; ">pf)&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;EXPO_MASK)&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000;">&nbsp;_meta::EXPO_OFFSET;<br /></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;uint32_t&nbsp;EXPO_FIRSTBIT_MASK&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;(_meta::EXPO_LEN</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;uint32_t&nbsp;EXPO_BOUND&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;EXPO_FIRSTBIT_MASK&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(&nbsp;expo&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;EXPO_BOUND&nbsp;)<br /></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;to_right_move&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;expo&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;EXPO_BOUND;<br /></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(&nbsp;to_right_move&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;_meta::EXPO_OFFSET&nbsp;)<br /></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; ">&nbsp;&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 /></span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;cmp_len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;_meta::EXPO_OFFSET&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;to_right_move;<br /></span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_meta::match_uint_type&nbsp;mask&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">~</span><span style="color: #000000; ">(</span><span style="color: #000000; ">~</span><span style="color: #000000; ">((_meta::match_uint_type)</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;cmp_len);<br /></span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #000000; ">&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: #000000; ">*</span><span style="color: #000000; ">pf</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">mask)&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">&nbsp;:&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">53</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">54</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">55</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;(&nbsp;f&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;precision&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;f&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">precision&nbsp;)&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">&nbsp;:&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">56</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">57</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">58</span>&nbsp;<span style="color: #000000; ">};</span></div><br />我的方法是通过浮点型的结构来进行判断。<br /><br />浮点类型一般结构如下：<br />|+/-|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exponent&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tail&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />对于float，指数部分为8字节，尾数部分为23字节。<br /><div>对于double，指数部分为11字节，尾数部分为52字节。<br />其中指数部分是采用偏移方式的，比如float的指数部分为130，偏移值为127，即实际指数为130-127。<br />更详细的请参考<a target="_blank" href="http://www.cnblogs.com/jillzhang/archive/2007/06/24/793901.html">这里</a>。</div><br />判断方法是，计算指数的值，根据偏移判断小数点后的尾数，想得比较简单，汗！<br />引入参数精度是为了判断值小于1时达到某个阈值的时候可以将后面的小数略去。<br /><br />Honestly，其实这个应该可以用sprintf，然后判断小数点后的&#8220;0&#8221;来实现的，似乎更加简单方便。<br />但是我觉得，作为一个&#8220;码农&#8221;，重造轮子也是一种趣味嘛！<img src ="http://www.cppblog.com/neverwinter/aggbug/148964.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/neverwinter/" target="_blank">nelson</a> 2011-06-19 16:06 <a href="http://www.cppblog.com/neverwinter/archive/2011/06/19/148964.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于工作关系的一些吐槽</title><link>http://www.cppblog.com/neverwinter/archive/2011/06/16/148812.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Thu, 16 Jun 2011 14:24:00 GMT</pubDate><guid>http://www.cppblog.com/neverwinter/archive/2011/06/16/148812.html</guid><wfw:comment>http://www.cppblog.com/neverwinter/comments/148812.html</wfw:comment><comments>http://www.cppblog.com/neverwinter/archive/2011/06/16/148812.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/neverwinter/comments/commentRss/148812.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/neverwinter/services/trackbacks/148812.html</trackback:ping><description><![CDATA[身处一个学生团队中，虽说会像公司一样从事项目研发、承包一些外包项目，学生就如公司的员工一样，老师有点像公司Boss又不完全是，但感觉最大的分别是人与人、人与集体之间关系维系的纽带不一样。<br /><br />好比说在公司里，抛开兴趣爱好、对公司情感等的上层因素，人与集体之间最基本的关系是合同制、契约关系。这意味着，我完成我的工作，你就要相应地支付劳动报酬，虽然有些赤裸裸的资本主义金钱利益交易的色彩，但确是最实在、最有保证的关系。如果我完成不了我的工作，你可以少付、乃至不付劳动报酬；超额完成任务，可以有相应的奖金（理想状态下）；哪天我请假了，我没有工作，那天的工资可以扣除。好比钢炼里面的&#8220;等价交换&#8221;原则，虽则不时有些残酷，却又是最自然、最透明、最公正的。这学期由于项目原因，在外面公司待了好一段时间，看到了不少外面的人对于工作的态度也是相当的坦荡荡，该请假时就请假，迟到了就扣钱。当然，这最好还是以不影响集体利益为前提。<br /><br />反观我所处环境的情况，师生之间显然不可能是雇佣关系，那是什么来维系一个团队的运作，完成一个个的项目呢？我认为是&#8220;责任&#8221;。培养成有责任感的人，也是我们所提倡的。但，我曾经听过一个过来人说的故事，某人某次小假期回家，最后几天突然生病了还比较严重，父母都劝他在家把病养好再回去做项目，他还是执意要回来，毕竟大家都在工作，他也不好意思就这样多休息几天。又如，大三那年的暑假，正值新项目开始，项目周期短、工作量大，大家都在奋战着，突然我家里发生变故，当时我想还是不要回去了，回去也没用，而且我一走，我这块的进度谁来保障，就还是留在学校赶项目，后来回想起来还是有些遗憾。我们这些人总在莫名其妙中对集体担负着这样那样的&#8220;责任&#8221;，虽然这样的责任意识长期保持着会让我们成为很不一样的人，但是与此同时我们也是活得很累的人。<br /><br />我觉得，一切以集体为重的责任意识很容易淹没了个性的存在，很多个人化的事情也因次而难以开展。由于我们的关系是抽象化的&#8220;责任&#8221;而不是更为具体的&#8220;合同&#8221;，很多事情还真是到了说不清的地步。考试、学生自然或不自然地便围绕着集体的项目来安排，有些很私人化的事情不好去做。最疲累的是不自觉无时无刻关注着这样的&#8220;责任&#8221;关系、并以一种较为&#8220;癫狂&#8221;的方式来履行。作为一个&#8220;全职&#8221;人员，朝九晚十是平常事，但有时候我觉得待不住了、坐得快要吐了，我觉得我还是不能离开，因为集体还要运作，或者说个人的不合作很容易弱化集体的凝聚力（不否认这是我写这篇文章的原因）。<br /><br />另一方面，以&#8220;责任&#8221;为纽带来带领集体，总有些异样的感觉。曾经也做到了类似项目组长之类的工作，需要管理一部分人，但总感觉在这个过程中没有什么有说服力的关系来调度手下的人。如果是合同关系下的工作，你不情我不愿，可以走可以换人，大家都乐得轻松。金钱利益是必须的，但总可以换种方式来获取它。但是换着以&#8220;责任&#8221;意识作基础，手下的人没有这个意识似乎工作都不用做了，又或者所做的不是个人所希望得到的，作为管理者我也不能给你什么、保证些什么。<br /><br />好吧，写到这里，我觉得我想描述的是一个很浓厚的&#8220;胶合层&#8221;，但以&#8220;责任&#8221;来概括似乎已经不够全面了。但依据《Unix编程艺术》，太厚的胶着层不是一种好的设计方式。简洁、透明、直接的会是更好的方式，工作也能够更好地开展。<br /><br />幸好还是有终极的个人保障机制&#8212;&#8212;you can quit！离开集体，便彻底脱离这种千丝万缕的关系。<br /><br />不说太多，仅此吐槽！<img src ="http://www.cppblog.com/neverwinter/aggbug/148812.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/neverwinter/" target="_blank">nelson</a> 2011-06-16 22:24 <a href="http://www.cppblog.com/neverwinter/archive/2011/06/16/148812.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Archlinux编译ACE时出的问题</title><link>http://www.cppblog.com/neverwinter/archive/2011/01/15/138574.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Sat, 15 Jan 2011 09:08:00 GMT</pubDate><guid>http://www.cppblog.com/neverwinter/archive/2011/01/15/138574.html</guid><wfw:comment>http://www.cppblog.com/neverwinter/comments/138574.html</wfw:comment><comments>http://www.cppblog.com/neverwinter/archive/2011/01/15/138574.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/neverwinter/comments/commentRss/138574.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/neverwinter/services/trackbacks/138574.html</trackback:ping><description><![CDATA[官方有个比较精简的编译安装指南，见<a  href="http://www.dre.vanderbilt.edu/~schmidt/DOC_ROOT/ACE/ACE-INSTALL.html">这里</a>。但是对于我所碰到的问题没有说明<br><br>提示链接时SSL的符号没有找到，但我是装好了openssl的，也特意找了一下，都安装在/usr/下<br><br>然后翻看了一下build/examples/IPC_SAP/SSL_SAP/下的Makefile，找到&#8220;LIBS = -lrt -ldl&#8221;，没有指明openssl库的链接<br><br>遂加上！～<br><br>LIBS = -lrt -ldl -lssl<br><br>编译之！～<br><br>build/test/SSL的问题同解。<br><br>不知道其他Linux发行版有没有这样的问题，还是我的配置有问题，但总算最终编译完了。<br><br><img src ="http://www.cppblog.com/neverwinter/aggbug/138574.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/neverwinter/" target="_blank">nelson</a> 2011-01-15 17:08 <a href="http://www.cppblog.com/neverwinter/archive/2011/01/15/138574.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python做Web的中文编码问题</title><link>http://www.cppblog.com/neverwinter/archive/2010/10/06/128790.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Wed, 06 Oct 2010 07:50:00 GMT</pubDate><guid>http://www.cppblog.com/neverwinter/archive/2010/10/06/128790.html</guid><wfw:comment>http://www.cppblog.com/neverwinter/comments/128790.html</wfw:comment><comments>http://www.cppblog.com/neverwinter/archive/2010/10/06/128790.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/neverwinter/comments/commentRss/128790.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/neverwinter/services/trackbacks/128790.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/neverwinter/archive/2010/10/06/128790.html'>阅读全文</a><img src ="http://www.cppblog.com/neverwinter/aggbug/128790.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/neverwinter/" target="_blank">nelson</a> 2010-10-06 15:50 <a href="http://www.cppblog.com/neverwinter/archive/2010/10/06/128790.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>new/delete operator笔记</title><link>http://www.cppblog.com/neverwinter/archive/2010/07/19/120793.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Mon, 19 Jul 2010 10:21:00 GMT</pubDate><guid>http://www.cppblog.com/neverwinter/archive/2010/07/19/120793.html</guid><wfw:comment>http://www.cppblog.com/neverwinter/comments/120793.html</wfw:comment><comments>http://www.cppblog.com/neverwinter/archive/2010/07/19/120793.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/neverwinter/comments/commentRss/120793.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/neverwinter/services/trackbacks/120793.html</trackback:ping><description><![CDATA[1.new操作符可以带多参数<br>2.没有对应的operator delete会出现warning（vs2008）<br>3.operator new/delete是类成员的情况下，用自定义的operator new创建、调用构造函数，会自动调对应的operator delete来析构<br>4.delete操作符可以带多参数，要使用自定义的operator new只能显式调用<br>5.自定义的operator delete不会自动析构对象<br><br><img src ="http://www.cppblog.com/neverwinter/aggbug/120793.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/neverwinter/" target="_blank">nelson</a> 2010-07-19 18:21 <a href="http://www.cppblog.com/neverwinter/archive/2010/07/19/120793.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于vs2008 SP1中CMFCToolBar的一些事儿</title><link>http://www.cppblog.com/neverwinter/archive/2010/05/20/115984.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Thu, 20 May 2010 15:53:00 GMT</pubDate><guid>http://www.cppblog.com/neverwinter/archive/2010/05/20/115984.html</guid><wfw:comment>http://www.cppblog.com/neverwinter/comments/115984.html</wfw:comment><comments>http://www.cppblog.com/neverwinter/archive/2010/05/20/115984.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.cppblog.com/neverwinter/comments/commentRss/115984.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/neverwinter/services/trackbacks/115984.html</trackback:ping><description><![CDATA[话说昨天解决了MFC跨线程操作控件的问题，我满以为今天可以free一回，玩玩Linux、学学Vim、再准备一下毕业论文的事情，但还是有事情要做，然后又是&#8220;被&#8221;MFC郁闷了一天。<br><br>先介绍一下总体的情况。我们项目客户端的开发环境是VS2008+SP1，用的是MFC类库，里面居然用到了CMFCToolBar、CMFCMenuBar以及Appearance变化等的SPI新特性。说&#8220;居然&#8221;是因为这些东西不是项目必要的，当时可能也以为只是名字变了用法没变，估计在工程创建的时候根本就没有考虑这些，直接按着单文档工程默认配置，next、next直接创建完的，囧！当时做的时候也只是当作测试Demo来用，也没太在意，毕竟我们项目的重点在服务器而非这个MFC客户端。<br><br>后来由于项目原因，甲方要求我们把这个客户端尽快修改成一个可以发布版本。不改不知道，一改吓一跳，当准备动手修改工具栏时才发现与以前惯的CToolBar真实差距甚大。CToolBar可以用CImageList把自定义的BMP图片放到工具栏的按钮，详细可看<a href="http://www.vckbase.com/document/viewdoc/?id=241">这里</a>，CMFCToolBar根本就不是这样的一个玩法。直接放一个CToolBar上来，在DockControlBar()的时候会出现断言错误（缺少DockBar，貌似是这个名字，汗！）。定位代码到MainFrm的EnableDocking()，现在的MainFrm的继承关系是CMainFrm-&gt;CFrameWndEx-&gt;CFrameWnd，而以前是CMainFrm-&gt;CFrameWnd，CFrameWndEx::EnableDocking()是为DockPane()服务的，而DockControlBar()需要的DockBar并不会被初始化。调用基类的CFrameWnd::EnableDocking()后再DockControlBar()不会出现断言，但是那个工具栏没有显示。而且现在新特性下在工具栏位置能够按出右键菜单，但右键菜单中根本不可能有关于该CToolBar的信息，乍看起来很不和谐~<br><br>最后，求助本地MSDN无果，貌似SP1没有包含对MSDN文档的更新；求助MSDN官网，那个真是&#8220;言简意赅&#8221;。只能说，MS你这次真的&#8220;亮&#8221;了！<br><br>以下为google + vs2008 sp1 sample + 看代码的成果：<br>
<ul>
    <li>创建默认ToolBar外的第二个ToolBar</li>
</ul>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;"></span><span style="color: #008080;">1</span> //默认工具栏<br><span style="color: #008080;">2</span> m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, <br><span style="color: #008080;">3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);<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;">m_mybar.CreateEx(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">,&nbsp;TBSTYLE_FLAT, <br></span><span style="color: #008080;">6</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WS_CHILD&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;WS_VISIBLE&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;CBRS_TOP&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;CBRS_GRIPPER&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;CBRS_TOOLTIPS&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;CBRS_FLYBY&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;CBRS_SIZE_DYNAMIC, <br></span><span style="color: #008080;">7</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CRect(</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">1</span><span style="color: #000000;">),&nbsp;<span style="color: red;">ID_MYBAR</span>);</span></div>
<br>注意，Wizard生成的工具栏Create时没有带ID，但第二个工具栏Create时最好要带ID。加了ID之后，在工具栏右键菜单才会出现第二个工具栏的CheckBox。否则，不良后果有：1、右键菜单没有该工具栏Checkbox；2、把默认工具栏和该工具栏拖出来（浮动），可以看到名字都是一样的（英文版为Standard）；3、后面要提到的UserImage不能作为按钮图标显示。<br><br>
<ul>
    <li>加载工具栏资源</li>
</ul>
我们先来看看CMFCToolBar加载工具栏的函数原型：<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">1</span>&nbsp;<span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;BOOL&nbsp;LoadToolBar(UINT&nbsp;uiResID,&nbsp;UINT&nbsp;uiColdResID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;UINT&nbsp;uiMenuResID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;BOOL&nbsp;bLocked&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;FALSE,<br></span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UINT&nbsp;uiDisabledResID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;UINT&nbsp;uiMenuDisabledResID&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;UINT&nbsp;uiHotResID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);</span></div>
可以看出，uiResID代表要加载的工具栏资源，理论上只需要这一个参数就能完成工具栏的加载。但是VS的Toolbar Editor只能编辑4bit的工具栏图标，以前CToolBar是用CImagList来加载更多bits的图标的，现在应该怎么做呢？多亏了Explore sample的例子，我发现后面的几个UINT参数就是BMP的资源，最主要的是最后一个uiHotResID，即便其他用默认值，这项赋BMP ID就能按预期的图标显示。Cold、Disable表示的是不同状态下的图标样式，带Menu的是Menu有关的图标，具体可看SP1 Feature的sample。<br>我的Demo里自定义工具栏的总创建过程：<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">1</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;"> !</span><span style="color: #000000;">m_mybar.CreateEx(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">,&nbsp;TBSTYLE_FLAT, <br></span><span style="color: #008080;">2</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WS_CHILD&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;WS_VISIBLE&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;CBRS_TOP&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;CBRS_GRIPPER&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;CBRS_TOOLTIPS&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;CBRS_FLYBY&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;CBRS_SIZE_DYNAMIC, <br></span><span style="color: #008080;">3</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CRect(</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">1</span><span style="color: #000000;">),&nbsp;ID_MYBAR)&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;"><br></span><span style="color: #008080;">4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">!</span><span style="color: #000000;">m_mybar.LoadToolBar(&nbsp;IDR_TOOLBAR1,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;FALSE,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;theApp.m_bHiColorIcons</span><span style="color: #000000;">?</span><span style="color: #000000;">IDB_BITMAP1:</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;)&nbsp;)<br></span><span style="color: #008080;">5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; {<br></span><span style="color: #008080;">6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRACE0(</span><span style="color: #000000;">"</span><span style="color: #000000;">Failed&nbsp;to&nbsp;create&nbsp;toolbar\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #008080;">7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;fail&nbsp;to&nbsp;create</span><span style="color: #008000;"><br></span><span style="color: #008080;">8</span> <span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; m_mybar.SetWindowText(_T(</span><span style="color: #000000;">"</span><span style="color: #000000;">abc</span><span style="color: #000000;">"</span><span style="color: #000000;">));</span></div>
最后的SetWindowText()设置工具栏的名称。<br>CMFCToolBar有LoadBitmap的方法，但是测试发现，用LoadToolBar只加载工具栏资源，再用LoadBitmap加载BMP资源，虽然返回值是TRUE，但显示图标为空白，没有实际效果。<br><br>
<ul>
    <li>工具栏停靠</li>
</ul>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">1 &nbsp; //</span><span style="color: #008000;">&nbsp;TODO:&nbsp;Delete&nbsp;these&nbsp;five&nbsp;lines&nbsp;if&nbsp;you&nbsp;don't&nbsp;want&nbsp;the&nbsp;toolbar&nbsp;and&nbsp;menubar&nbsp;to&nbsp;be&nbsp;dockable</span><span style="color: #008000;"><br></span><span style="color: #008080;">2</span><span style="color: #000000;">&nbsp;&nbsp; m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);<br></span><span style="color: #008080;">3</span><span style="color: #000000;">&nbsp;&nbsp; m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);<br></span><span style="color: #008080;">4</span><span style="color: #000000;">&nbsp;&nbsp; <span style="color: red;">m_mybar.EnableDocking(CBRS_ALIGN_ANY);</span><br></span><span style="color: #008080;">5</span><span style="color: #000000;">&nbsp;&nbsp; EnableDocking(CBRS_ALIGN_ANY);<br></span><span style="color: #008080;">6</span><span style="color: #000000;">&nbsp;&nbsp; DockPane(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">m_wndMenuBar);<br></span><span style="color: #008080;">7</span><span style="color: #000000;">&nbsp;&nbsp; DockPane(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">m_wndToolBar);<br></span><span style="color: #008080;">8</span><span style="color: #000000;">&nbsp;&nbsp; <span style="color: red;">DockPane(</span></span><span style="color: red;">&amp;m_mybar);</span></div>
与默认工具栏无异。<br><br>
<ul>
    <li>用户自定义图标</li>
</ul>
CMFCToolBar可以让用户自定义工具栏图标，使用静态成员函数SetUserImages()将一个CMFCToolBarImages对象设置进去，由所有CMFCToolBar对象共享。Wizard自动生成代码中有这样的例子：<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;1</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(CMFCToolBar::GetUserImages()&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;NULL)<br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;load&nbsp;user-defined&nbsp;toolbar&nbsp;images</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(m_UserImages.Load(_T(</span><span style="color: #000000;">"</span><span style="color: #000000;">.\\UserImages.bmp</span><span style="color: #000000;">"</span><span style="color: #000000;">)))<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_UserImages.SetImageSize(CSize(</span><span style="color: #000000;">16</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">16</span><span style="color: #000000;">),&nbsp;FALSE);<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMFCToolBar::SetSizes(CSize(</span><span style="color: #000000;">16</span><span style="color: #000000;">,</span><span style="color: #000000;">16</span><span style="color: #000000;">),&nbsp;CSize(</span><span style="color: #000000;">16</span><span style="color: #000000;">,</span><span style="color: #000000;">16</span><span style="color: #000000;">));<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMFCToolBar::SetUserImages(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">m_UserImages);<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
这个例子加载了工程路径下的一个BMP，其他方法可以查看MSDN，与CImageList有点点类似。<br>使用CMFCToolBar::ReplaceButton()可以替换已有的工具栏按钮，以下是我的Demo中的代码：<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">1</span> &nbsp; &nbsp; <span style="color: #000000;">m_mybar.ReplaceButton(&nbsp;ID_QTLOGO,&nbsp;CMFCToolBarButton(ID_QTLOGO,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;_T(</span><span style="color: #000000;">"</span><span style="color: #000000;">123</span><span style="color: #000000;">"</span><span style="color: #000000;">),&nbsp;TRUE)&nbsp;);</span></div>
第一个参数ID_QTLOGO为自定义工具栏上的一个按钮，后面是一个<span style="color: #000000;">CMFCToolBarButton的临时对象。</span><span style="color: #000000;">CMFCToolBarButton构造函数第一个参数为替换</span>后的ID，第三个参数为名称，第二个参数为图标的索引(zero-based)，第四个参数为m_bUserButton，指明第二个参数是索引工具栏已加载图标(LoadToolBar或LoadBitmap)还是用户自定义图标（SetuserImages），TRUE指用户自定义图标。这里的结果是将ID_QTLOGO上的图标替换为<span style="color: #000000;">UserImages.bmp</span>上的第一个图标。<br><br><span style="color: #000000;">GetCmdMgr()</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">GetCmdImage()</span>可以根据工具栏上图标的ID获取出已加载图标的索引值：<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">1</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000000;">m_mybar.ReplaceButton(&nbsp;ID_QTLOGO,&nbsp;CMFCToolBarButton(ID_QTLOGO,&nbsp;GetCmdMgr()</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">GetCmdImage(ID_PLUS),&nbsp;_T(</span><span style="color: #000000;">"</span><span style="color: #000000;">123</span><span style="color: #000000;">"</span><span style="color: #000000;">))&nbsp;);</span></div>
这里将工具栏上ID_QTLOGO的图标替换为ID_PLUS按钮对应的图标。<br><br>特别地，如果在你将这些工具栏改来改去但显示结果却没有改变的时候，你可以尝试删除 <span style="color: red;">HKEY_CURRENT_USER\Software\Local AppWizard-Generated Applications\$(你的程序名)</span> 这个键值，当你重启程序后工具栏应该会按你的预想变化的。这是我在查资料时看到的，当时没注意但后来发现挺有用的，出处没有记录下来。<br><br>最后，ReplaceButton还可以将按钮替换为其他控件。<br><br>
<ul>
    <li>其他...</li>
</ul>
我在自定义工具栏上做了一个有效响应，里面使用静态成员函数CMFCToolBar::ResetAllImages()将所有图标都清空了，此时会发现默认工具栏、自定义工具栏的图标都为空。<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;CMainFrame::OnQtLogo()<br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CMFCToolBar::ResetAllImages();<br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">CMFCToolBar::AddToolBarForImageCollection(IDR_MENU_IMAGES,&nbsp;theApp.m_bHiColorIcons&nbsp;?&nbsp;IDB_MENU_IMAGES_24&nbsp;:&nbsp;0);</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;m_wndToolBar.LoadBitmap(IDB_BITMAP1);<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;m_mybar.LoadBitmap(IDR_MAINFRAME_256);<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;m_wndToolBar.RedrawWindow();<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;m_mybar.RedrawWindow();<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">}</span></div>
更奇妙的是，后面我对两个工具栏重新加载了BMP，而且加载的BMP资源是反了的，此时默认工具栏上出现了原来自定义工具栏的4个图标，余下部分及自定义工具栏则为原来默认工具栏图标。可以想象，RestAllImages只是将图标资源都释放了，工具栏资源依然健在，重新加载BMP的时候，工具栏图标就像一个个顺序排好的空间，加载进来的BMP图标会出现从前往后补位的现象。<br>注意代码中，默认工具栏图标重新加载时使用的资源是IDR_MAINFRAME_256，是默认的工具栏资源。也就是说，这里用LoadBitmap加载工具栏资源也是有效果的。这样应该可以说明工具栏在创建时LoadToolBar、LoadBitmap分别成功地加载了工具栏、BMP资源，实际上是加载了两套图标资源，这两者是顺序而非重合的，所以只显示原来的工具栏资源。要想指定两者的重合关系，只有在LoadToolBar的时候同时传入工具栏资源及BMP资源的ID。<br><br><a href="http://www.cppblog.com/Files/neverwinter/testtree.rar">Demo下载</a><br><br>————————————————————————————————————————————————————————————————<br>好吧，终于写完了！写得很仓促，不足的地方也很多，欢迎指教！<br>    <img src ="http://www.cppblog.com/neverwinter/aggbug/115984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/neverwinter/" target="_blank">nelson</a> 2010-05-20 23:53 <a href="http://www.cppblog.com/neverwinter/archive/2010/05/20/115984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最近几天被MFC折腾~</title><link>http://www.cppblog.com/neverwinter/archive/2010/05/19/115853.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Wed, 19 May 2010 15:22:00 GMT</pubDate><guid>http://www.cppblog.com/neverwinter/archive/2010/05/19/115853.html</guid><wfw:comment>http://www.cppblog.com/neverwinter/comments/115853.html</wfw:comment><comments>http://www.cppblog.com/neverwinter/archive/2010/05/19/115853.html#Feedback</comments><slash:comments>16</slash:comments><wfw:commentRss>http://www.cppblog.com/neverwinter/comments/commentRss/115853.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/neverwinter/services/trackbacks/115853.html</trackback:ping><description><![CDATA[备注：Rimi是我们用的一个分布式机制。<br><br>在进行设备树（也就是一个CTreeCtrl控件）更新修改的时候，遇到了一个比较bug的问题。<br><br>为了提供更好的用户体验，甲方希望设备树更新之后滚动条位置能够保持与更新前一致。设备树的更新过程是这样的：更新消息来自Rimi的通知机制，类似于函数回调，客户端在收到消息之后调用Rimi的对象方法来获取新的设备树信息，然后更新树。乍看之下，要完成这个修改好像很简单，只要更新前先记录滚动条的滚动位置，更新后还原位置，如果更新后滚动条滚动范围变化了还要微调一下位置，逻辑上来讲就这么几个步骤。<br><br>我一开始也是按照这样的思路，GetScrollPos()获取当前滚动条的滚动位置，然后更新树（先删除所有节点再逐个添加，其他省略...），GetScrollRange()获得新的滚动范围，最后SetScrollPos()将旧的位置与滚动范围最大值中最小的一个设回去（这里用到的ScrollBar是CTreeCtrl自动产生的，注意不是两个控件，这里调用的函数都是CTreeCtrl的方法）。但实际效果是，树更新后滚动条滚到准确的位置，但树的视图到了最顶，点击一下滚动条的那个方块才能回到之前的位置。也就是说，滚动位置的更新与树的视图分离了。<br><br>之后，我一直以为是我控件的方法用错了，对着MSDN和CSDN纠结了很久。最后忍无可忍，自己写了个测试Demo，里面就一Dialog，一CTreeCTrl，树上随便加了些东西，然后又一按键，按键后会重新刷新树，再滚动到原来的位置，结果居然是对的，视图跟着滚动条的位置变化了。为了更好的模拟设备树节点增删的效果，我在按键响应上又作了处理，按一下重刷树的时候会隐藏几个节点，再按一下这些节点显示出来，滚动位置按照客户端里面的一个处理方法，结果居然也是正确的。问题变得玄乎了！<br><br>无意间发现客户端里面有个手动刷新设备树的快捷键，估计是当年pb做调试的时候留下来的。快捷键的响应直接调用更新树的函数，重刷后的显示出人意料地是对的。比较一下两种更新方式的过程：<br><br>Rimi：&nbsp;&nbsp; 通知到来—&gt;更新树（Rimi回调函数，Rimi自己维护了一个线程池，远程调用在被调用端的发起者都是Rimi自己的线程）<br>快捷键： 按键响应—&gt;更新树（MFC消息处理函数）<br><br>更新树所用到的是同一个函数，但调用者却是不同的。因为Rimi用了boost::function，那我也在按键响应的时候对要调的函数用function来包装一下，造成两者在调用栈上调用的函数、顺序大部分是一致的，只有最底层不同，一边是Rimi，一边是MFC消息传递。<br><br>后来jianhao说，以前在Rimi的回调函数里面调Rimi对象的方法出过问题，然后我又顺道回忆起之前zxb在Rimi函数（还是对象方法）里面调system()也有问题。<br><br>难道说Rimi线程就是&#8220;万恶之源&#8221;？好吧，我把更新代码移到另外一个线程里面，Rimi回调的时候唤醒更新线程，更新后视图还是不能跟着滚动位置变；将快捷键的响应也修改一下，自己不作更新，也是唤醒更新线程，这个方法也变得不灵了，囧！这可以说明问题跟Rimi线程无关。<br><br>难道说线程调用才是&#8220;万恶之源&#8221;？把之前做的那个Demo小改了一把，线程做刷新，按键响应只唤醒更新线程，果然不灵了！上网google了一把，关键字&#8220;mfc 线程 操作控件&#8221;，首先映入眼帘的是《MFC中跨线程操作控件会不会出现像C#中的异常问题?》。这时候我也不关心这个帖子的内容了，线程操作控件有异常是吧，那就不用线程做咯！这时候我才回想起WIN32里面有自定义消息这玩意，MFC里面给定一个消息ID，ON_MESSAGE绑定一个处理函数，PostMessage或SendMessage来发消息，然后由WIN32自己的消息循环来调用处理函数，这样应该是可以保证用非Rimi线程来更新设备树的。再一次把Demo小改了一把，按键响应Post一个自定义消息，消息处理函数做刷新，结果是对的；再改，按键响应唤醒线程，线程里面Post自定义消息，结果也是对的。<br><br>原以为是控件使用问题，又以为是Rimi不兼容问题，最后实质为MFC跨线程使用控件的问题。其实我也不清楚这是不是真正的问题，毕竟我MFC既不懂又用得少。That's all!<br><br>最后附上我的测试代码<br><a  href="http://www.cppblog.com/Files/neverwinter/testtree.rar">http://www.cppblog.com/Files/neverwinter/testtree.rar</a><br> <img src ="http://www.cppblog.com/neverwinter/aggbug/115853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/neverwinter/" target="_blank">nelson</a> 2010-05-19 23:22 <a href="http://www.cppblog.com/neverwinter/archive/2010/05/19/115853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对象自杀</title><link>http://www.cppblog.com/neverwinter/archive/2009/10/26/99521.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Mon, 26 Oct 2009 13:29:00 GMT</pubDate><guid>http://www.cppblog.com/neverwinter/archive/2009/10/26/99521.html</guid><wfw:comment>http://www.cppblog.com/neverwinter/comments/99521.html</wfw:comment><comments>http://www.cppblog.com/neverwinter/archive/2009/10/26/99521.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/neverwinter/comments/commentRss/99521.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/neverwinter/services/trackbacks/99521.html</trackback:ping><description><![CDATA[最近做项目写代码遇到了对象自杀的问题。<br><br>第一个是自己设计的，对象持有定时器，自己维护生命周期。<br><br>第二个是无意中遇到的，由于采用boost的线程库，将成员函数变为线程用，最后在一堆调用之后居然把自己杀掉了。<br><br>很不幸的是，在过程中都遇到了相同的问题——堆栈挂掉了。<br><br>然后一轮定位，居然都是boost mutex的问题，scoped_lock很容易让人放松警惕。<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;XXX(<img src="http://www.cppblog.com/Images/dot.gif">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;boost::recuisive_mutex::scoped_lock&nbsp;lk(m_mutex);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;YYYY();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><br>}<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;YYY(<img src="http://www.cppblog.com/Images/dot.gif">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;p;// 释放XXX所在对象<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><br>}</span></div>
<br>作为类成员的mutex没有被解锁，然后所在的类就被释放了，这就造成了堆栈挂掉。<br><br>对象自杀显然不是一种很好的风格，还是尽量避免吧！<br><br> <img src ="http://www.cppblog.com/neverwinter/aggbug/99521.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/neverwinter/" target="_blank">nelson</a> 2009-10-26 21:29 <a href="http://www.cppblog.com/neverwinter/archive/2009/10/26/99521.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>项目之苦</title><link>http://www.cppblog.com/neverwinter/archive/2009/09/19/96706.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Sat, 19 Sep 2009 04:54:00 GMT</pubDate><guid>http://www.cppblog.com/neverwinter/archive/2009/09/19/96706.html</guid><wfw:comment>http://www.cppblog.com/neverwinter/comments/96706.html</wfw:comment><comments>http://www.cppblog.com/neverwinter/archive/2009/09/19/96706.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/neverwinter/comments/commentRss/96706.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/neverwinter/services/trackbacks/96706.html</trackback:ping><description><![CDATA[&nbsp;此文章涉嫌各种敏感，已被博主删除~<img src ="http://www.cppblog.com/neverwinter/aggbug/96706.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/neverwinter/" target="_blank">nelson</a> 2009-09-19 12:54 <a href="http://www.cppblog.com/neverwinter/archive/2009/09/19/96706.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>fstream改写文件</title><link>http://www.cppblog.com/neverwinter/archive/2009/09/14/96125.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Mon, 14 Sep 2009 06:40:00 GMT</pubDate><guid>http://www.cppblog.com/neverwinter/archive/2009/09/14/96125.html</guid><wfw:comment>http://www.cppblog.com/neverwinter/comments/96125.html</wfw:comment><comments>http://www.cppblog.com/neverwinter/archive/2009/09/14/96125.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/neverwinter/comments/commentRss/96125.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/neverwinter/services/trackbacks/96125.html</trackback:ping><description><![CDATA[项目中有这样的需求：<br>1.给一个一定大小的空文件改写内容；<br>2.不能改变该空文件的大小。<br><br>一开始是用ofstream做的，但是每次一打开文件，原来的空文件的大小就改变了。之后用app方式打开，但是每次的新数据都是追加到文件尾部，seekp无论如何不能到达实际文件的首部，这样文件大小就变了，不符合需求2。<br><br>后来发现用fstream，采用in | out的方式来打开，终于可以安全地改写文件了。<br><br> <img src ="http://www.cppblog.com/neverwinter/aggbug/96125.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/neverwinter/" target="_blank">nelson</a> 2009-09-14 14:40 <a href="http://www.cppblog.com/neverwinter/archive/2009/09/14/96125.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>