<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>转烛空间文件读写 &#187; </title>
	<atom:link href="http://wangliping.net/tag/%e6%96%87%e4%bb%b6%e8%af%bb%e5%86%99/feed" rel="self" type="application/rss+xml" />
	<link>http://wangliping.net</link>
	<description>记录生活，学习技术</description>
	<lastBuildDate>Fri, 03 Sep 2010 06:29:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>C++单链表冒泡排序、运算符重载和文件读写</title>
		<link>http://wangliping.net/cpp-link-sort-override-wrfile</link>
		<comments>http://wangliping.net/cpp-link-sort-override-wrfile#comments</comments>
		<pubDate>Sat, 05 Dec 2009 15:21:41 +0000</pubDate>
		<dc:creator>转烛</dc:creator>
				<category><![CDATA[编程技术]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[冒泡法]]></category>
		<category><![CDATA[文件读写]]></category>
		<category><![CDATA[重载运算符]]></category>
		<category><![CDATA[链表]]></category>

		<guid isPermaLink="false">http://wangliping.net/?p=530</guid>
		<description><![CDATA[　　以前写C++程序都是用VC写，严格意义上讲，估计那也不算在写C++，因为都是用着MFC。这两天同学让帮忙写一个布置的作业，一看，显然不需要MFC的（确切地说，不能用MFC），于是先装了个VS2010，后来觉得不需要，装了个Dev　C++，于是再次开始写C++程序的征程。

　　脱离了VC写C++程序，才发现自己一无是处，居然连个最简单的类都不会添加了。这都是以前VC惯的，想以前用VC时，添加类添加函数添加响应函数都是多么地方便多么地简单。等到这一切都需要自己亲手操作时，才知道原来认为不值一提的东西，也是如此艰难。还好，经过看例程和回忆，终于在撰写方面越过去了。

　　这篇文章主要记录一下写这个程序当中用到的单链表冒泡排序、运算符重载和文件读写。]]></description>
			<content:encoded><![CDATA[<p>以前写C++程序都是用VC写，严格意义上讲，估计那也不算在写C++，因为都是用着MFC。这两天同学让帮忙写一个布置的作业，一看，显然不需要MFC的（确切地说，不能用MFC），于是先装了个VS2010，后来觉得不需要，装了个Dev　C++，于是再次开始写C++程序的征程。</p>
<p>脱离了VC写C++程序，才发现自己一无是处，居然连个最简单的类都不会添加了。这都是以前VC惯的，想以前用VC时，添加类添加函数添加响应函数都是多么地方便多么地简单。等到这一切都需要自己亲手操作时，才知道原来认为不值一提的东西，也是如此艰难。还好，经过看例程和回忆，终于在撰写方面越过去了。</p>
<p>这篇文章主要记录一下写这个程序当中用到的单链表冒泡排序、运算符重载和文件读写。</p>
<p><span id="more-530"></span> <strong> 冒泡法排序</strong>相信学过C或者C++的人都不会陌生，简直就是必备单元。不过以前课本学的都是数组的排序，以为将其运用到链表上也是熟练自如，结果依葫芦画瓢时，才发现不是那么简单。节点地址的交换和移动还真不是轻易搞定的事情（当然对于大虾来说，这可能轻而易举）。在一分钟内写完冒泡排序，在10秒后运行发现错了，然后就一直纠缠于此。Google搜索相关方法也无效，网上介绍了一个又一个（其实好多都重复）的单链表冒泡排序，拿来用时没有一个行得通，真不知道是我的问题还是那些方法的问题，最后睡觉时终于明白链表的移动要考虑前节点和后节点，而我，只考虑了后节点。也罢，今早起床后，换了一种思路，大不了咱就不交换节点了，交换数据不就完了。按这个思路，立马生效。</p>
<blockquote><p>for (cur = head; cur-&gt;next != NULL; cur = cur-&gt;next) {<br />
for (cop = cur-&gt;next; cop != NULL; cop = cop-&gt;next) {<br />
if (cur-&gt;salary &lt; cop-&gt;salary) {<br />
swap_data(cur, cop);<br />
}<br />
}<br />
}</p></blockquote>
<blockquote><p>void swap_data(employee* a, employee* b)<br />
{<br />
string id = a-&gt;id;<br />
a-&gt;id = b-&gt;id;<br />
b-&gt;id = id;<br />
}</p></blockquote>
<p>虽然方法笨点，不过效果上还不错，可能在内存消耗和计算时间上有所损耗，下一步研究看看到底单链表如何利用地址交换的方法进行冒泡排序，脑海中已经有些思路了，有时间就试试。正好可以给这个程序做优化。呵呵～</p>
<p>关于<strong>运算符重载</strong>，我以前只是知道C++里有这个东西，并且还是相当先进的一个东西（相比较C而言），当然看书时只是为其叫好，自己倒是一次都没有实际操作过。等到今天要用到时，才发现看过的知识如果不实践，还真是跟没看过没太大的区别，只有概念，完全没法操作。不过Google是个好东西，看了下相关知识，于是开始动手敲&gt;&gt;的运算符重载函数。</p>
<p>由于文件的输入是不可以有空格的，所以对&gt;&gt;重载，使其可以识别空格，如在输入名字的时候，可能就需要有空格，或者其它误操作。操作符重载其实跟写函数一样，只不过它是一个相对比较特殊的函数，有固定的函数命名方式。运算符重载函数可以是全局的，也可以是类的成员函数，以下作为全局函数如此写。这样看来，写运算符重载函数主要是要明白你要做什么，然后依格式明明，再按照普通函数一样去写就好了。</p>
<blockquote><p>employee* operator &gt;&gt; (fstream&amp; file, employee* temp)<br />
{<br />
string id;<br />
char blank;<br />
file&gt;&gt;id;</p>
<p>if (id.length() == 0) {<br />
return NULL;<br />
}</p>
<p>blank = file.get();<br />
while (blank == ' ') {<br />
file&gt;&gt;more;<br />
id = id + blank + more;<br />
blank = file.get();<br />
}</p>
<p>temp-&gt;id = id;<br />
return temp;<br />
}</p></blockquote>
<p>最后一点就是文件的读写了。这个也是以前只是看书，却没有实践的内容，毕竟MFC将其封装得太好了，文件读写直接调用那些类就好了。当然在标准C++里也是调用类了，其实用过之后，觉得也是挺好用的，不过想用深入就是另外一回事了。以下抛砖引玉，当然没对是否存在文件，是否能够写入做判断。</p>
<blockquote><p>ofstream outfile("backup.txt"); //相当于fstream outfile; outfile.open("backup.txt",ios::out);<br />
outfile&lt;&lt;id&lt;&lt;"\t";<br />
outfile&lt;&lt;name&lt;&lt;"\t";<br />
outfile.close();</p></blockquote>
<blockquote><p>fstream f("backup.txt", ios::in);<br />
f&gt;&gt;empl;<br />
f.close();</p></blockquote>
<p>这里对两点做说明，一个就是fstream,ofstream,ifstream，它们用法可以如上，注意看看注释后面的那句，呵呵～还有一点就是"&lt;&lt;""&gt;&gt;"都是以空格类（space/tab/enter）给分隔符，因此你可以f&gt;&gt;a&gt;&gt;b&gt;&gt;c来不停输入。其实理解fstream就跟理解cin和cout一样，只是一个是输入输出到文件，一个是输入输出到屏幕，这样就可以好好理解了。</p>
<p>突然发现，上面所阐述的都好浅显啊。表笑，就算是记录一个过程吧。</p>
<h3  class="related_post_title">你可能也感兴趣的文章：</h3><ul class="related_post"><li><a href="http://wangliping.net/c-file-find-out" title="C语言实现文件查找操作">C语言实现文件查找操作</a></li><li><a href="http://wangliping.net/c-change-file-permission" title="C语言查看和更改文件的权限">C语言查看和更改文件的权限</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://wangliping.net/cpp-link-sort-override-wrfile/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
