<?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; C语言</title>
	<atom:link href="http://www.ecoviews.cn/archives/category/computer/cprograming/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ecoviews.cn</link>
	<description>人生的三要素：思想 物质 能力---记录生活，改变自己！</description>
	<lastBuildDate>Sat, 14 Jan 2012 05:12:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Linux C中read/write,fread/fwrite等的使用说明！</title>
		<link>http://www.ecoviews.cn/archives/1093.html</link>
		<comments>http://www.ecoviews.cn/archives/1093.html#comments</comments>
		<pubDate>Wed, 27 Oct 2010 07:26:36 +0000</pubDate>
		<dc:creator>若水思源</dc:creator>
				<category><![CDATA[C语言]]></category>
		<category><![CDATA[fread]]></category>
		<category><![CDATA[fwrite]]></category>
		<category><![CDATA[read]]></category>
		<category><![CDATA[write]]></category>

		<guid isPermaLink="false">http://www.ecoviews.cn/?p=1093</guid>
		<description><![CDATA[在Linux C语言编程中往往会涉及到文件的操作，在Linux系统下，对于文件的读写非常常见，通常文件的读写涉及到直接读写和具有缓冲区的读写。


相关文章:<ol><li><a href='http://www.ecoviews.cn/archives/37.html' rel='bookmark' title='Permanent Link: 获得任一页面的链接和地址！'>获得任一页面的链接和地址！</a></li>
<li><a href='http://www.ecoviews.cn/archives/712.html' rel='bookmark' title='Permanent Link: C语言中strtok函数进行分割字符串！'>C语言中strtok函数进行分割字符串！</a></li>
<li><a href='http://www.ecoviews.cn/archives/779.html' rel='bookmark' title='Permanent Link: PHP实现按标准显示图片！'>PHP实现按标准显示图片！</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>在Linux C语言编程中往往会涉及到文件的操作，在Linux系统下，对于文件的读写非常常见，通常文件的读写涉及到直接读写和具有缓冲区的读写。</p>
<p>1.read,write等文件操作函数是直接读写的，即没有缓冲区的读写。其原型如下：</p>
<p>ssize_t read/write (int fd,void *buf,size_t count);</p>
<p>fd: 通过open函数打开文件返回的文件描述符<br />
buf:指定存储器读出或写入数据的缓冲区，但是与基于缓冲区读写的概念不同<br />
count:指定读出或写入的字节数</p>
<p>使用read,write的一个非常重要的问题就是如果读取的文件的长度与缓冲区buf的长度不是倍数的时候，buf会自动清除自己原来已经读取的内容么？举例来说，如果文件内容是：0123456789，buf的长度为3，那么使用read函数读取了678以后，在读取9时，buf的内容是“90/0/”还是“978”呢？</p>
<p>一个演示的例子如下所示：</p>
<pre>#include &lt;unistd.h&gt;
#include &lt;stdio.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;fcntl.h&gt;

int main()
{
 int fd=open("/code/temp.txt",O_CREAT|O_RDWR,0666);
 char buf[3];
 int i=0;
 int size;
 while((size=read(fd,buf,3))&gt;0)
 {
  for(i=0;i&lt;3;i++)
  {
   printf("%c",buf[i]);
  }

 } 
 close(fd);
 return 0;
}</pre>
<p>从显示的结果来看，read在每次向buf缓冲区中写入数据时，是先清除buf中原有的数据以后在写入的。即上面的例子中buf最后的数据应该是“90/0/”.</p>
<p>同理，对于基于缓冲区读写的fread和fwrite在读取到最后几个数据时同样会上面的问题，那么这时fread和fwrite会自动清除buf原来的内容么？</p>
<p>一个测试程序如下：</p>
<pre>#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;

int main()
{
 FILE *fp=fopen("/code/temp.txt","r+b");
 char buf[3];
 int i=0;
 int size;
 while((size=fread(buf,sizeof(char),3,fp))&gt;0)
 {
  for(i=0;i&lt;3;i++)
  {
   printf("%c",buf[i]);
  }

 } 
 fclose(fp);
 return 0;
}</pre>
<p>通过结果我们同样可以获知：fread，fwrite如上面的read和write一样同样会先清除原来的内容，然后在把这些数据写入buf。</p>


<p>相关文章:<ol><li><a href='http://www.ecoviews.cn/archives/37.html' rel='bookmark' title='Permanent Link: 获得任一页面的链接和地址！'>获得任一页面的链接和地址！</a></li>
<li><a href='http://www.ecoviews.cn/archives/712.html' rel='bookmark' title='Permanent Link: C语言中strtok函数进行分割字符串！'>C语言中strtok函数进行分割字符串！</a></li>
<li><a href='http://www.ecoviews.cn/archives/779.html' rel='bookmark' title='Permanent Link: PHP实现按标准显示图片！'>PHP实现按标准显示图片！</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.ecoviews.cn/archives/1093.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>C语言中变量默认值！</title>
		<link>http://www.ecoviews.cn/archives/1084.html</link>
		<comments>http://www.ecoviews.cn/archives/1084.html#comments</comments>
		<pubDate>Fri, 22 Oct 2010 07:28:06 +0000</pubDate>
		<dc:creator>若水思源</dc:creator>
				<category><![CDATA[C语言]]></category>
		<category><![CDATA[数组]]></category>

		<guid isPermaLink="false">http://www.ecoviews.cn/?p=1084</guid>
		<description><![CDATA[使用过Java或者C#编程的人都知道定义变量时变量默认值的重要性，那么在C语言中呢？


相关文章:<ol><li><a href='http://www.ecoviews.cn/archives/712.html' rel='bookmark' title='Permanent Link: C语言中strtok函数进行分割字符串！'>C语言中strtok函数进行分割字符串！</a></li>
<li><a href='http://www.ecoviews.cn/archives/834.html' rel='bookmark' title='Permanent Link: Unicode字符编码与ASCII字符编码的关系！'>Unicode字符编码与ASCII字符编码的关系！</a></li>
<li><a href='http://www.ecoviews.cn/archives/1093.html' rel='bookmark' title='Permanent Link: Linux C中read/write,fread/fwrite等的使用说明！'>Linux C中read/write,fread/fwrite等的使用说明！</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>使用过Java或者C#编程的人都知道定义变量时变量默认值的重要性，那么在C语言中呢？</p>
<p><span style="color: #008000;">C语言中定义一个变量是有其默认值的，而这个默认值通常是编译器赋予这个变量的，并且同种类型的变量其值是相同的，不同的类型的值却不同。（这个值的为什么应该和电脑本身有关，这点我没有查到相关的资料，所以不好说。）</span></p>
<p>以我的电脑为例，在vc6.0中如定义一个int d，调用printf(&#8220;%d\n&#8221;,d)输出它的值的时候，其结果为：-858993460。而再定义一个int f时，其显示的结果仍然是：-858993460。</p>
<p>即：int d,int f;在程序中它们的默认值是相同的。</p>
<p>同理当定义两个double s,t时，其结果也是相同的，值为：-9255963134931783100000000000000000000000<br />
0000000000000000000000.000000</p>
<p>以上是对于基本数据类型默认值的说明，再来说说数组类型。</p>
<p><span style="color: #008000;">C语言中定义数组时，如果你只是对数组的一部分赋值的话，其剩余元素也是由默认值的，其规律为，字符型默认值为‘\0’,整型默认值为：0,double型默认为：0.000000，当然对于float型其也是默认为0.000000，不过它是要先转换为double型的。</span></p>
<pre>如在以下程序中：</pre>
<pre>#include &lt;stdio.h&gt;

int main()
{
 //字符型数组的默认值
 char a[10]={'1','2','3'};
 //整型数组的默认值
 int b[10]={1,2,3};
 //浮动性数组的默认值
 double c[10]={1.1,1.2,1.3};

 int i=0;

 for(i=0;i&lt;10;i++)
  printf("a[%d]=%c\n",i,a[i]);
 for(i=0;i&lt;10;i++)
  printf("b[%d]=%d\n",i,b[i]);
 for(i=0;i&lt;10;i++)
  printf("c[%d]=%f\n",i,c[i]);

 return 0;
}

通过结果我们即可以印证以上所说的规律。

不过值得注意的是，如果你把double c[10]换成float c[10],你会发现程序在编译时会出现警告：warning C4305: 'initializing' : truncation from 'const double' to 'float',通过警告可以发现，float类型的数组的默认值的确定是先要转换为double型，然后通过double型来确定的。</pre>


<p>相关文章:<ol><li><a href='http://www.ecoviews.cn/archives/712.html' rel='bookmark' title='Permanent Link: C语言中strtok函数进行分割字符串！'>C语言中strtok函数进行分割字符串！</a></li>
<li><a href='http://www.ecoviews.cn/archives/834.html' rel='bookmark' title='Permanent Link: Unicode字符编码与ASCII字符编码的关系！'>Unicode字符编码与ASCII字符编码的关系！</a></li>
<li><a href='http://www.ecoviews.cn/archives/1093.html' rel='bookmark' title='Permanent Link: Linux C中read/write,fread/fwrite等的使用说明！'>Linux C中read/write,fread/fwrite等的使用说明！</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.ecoviews.cn/archives/1084.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C语言中strtok函数进行分割字符串！</title>
		<link>http://www.ecoviews.cn/archives/712.html</link>
		<comments>http://www.ecoviews.cn/archives/712.html#comments</comments>
		<pubDate>Mon, 19 Apr 2010 01:31:36 +0000</pubDate>
		<dc:creator>若水思源</dc:creator>
				<category><![CDATA[C语言]]></category>
		<category><![CDATA[strtok]]></category>
		<category><![CDATA[字符串]]></category>
		<category><![CDATA[指针]]></category>

		<guid isPermaLink="false">http://www.ecoviews.cn/?p=712</guid>
		<description><![CDATA[函数原型：char *strtok(char *s, char *delim);
函数功能：把字符串s按照字符串delim进行分割，然后返回分割的结果。


相关文章:<ol><li><a href='http://www.ecoviews.cn/archives/59.html' rel='bookmark' title='Permanent Link: 网站自动安装之三！'>网站自动安装之三！</a></li>
<li><a href='http://www.ecoviews.cn/archives/834.html' rel='bookmark' title='Permanent Link: Unicode字符编码与ASCII字符编码的关系！'>Unicode字符编码与ASCII字符编码的关系！</a></li>
<li><a href='http://www.ecoviews.cn/archives/1084.html' rel='bookmark' title='Permanent Link: C语言中变量默认值！'>C语言中变量默认值！</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>函数原型：char *strtok(char *s, char *delim);<br />
函数功能：把字符串s按照字符串delim进行分割，然后返回分割的结果。</p>
<p>函数使用说：</p>
<p>1.strtok函数的实质上的处理是，strtok在s中查找包含在delim中的字符并用NULL(’\0′)来替换,直到找遍整个字符串。这句话有两层含义：（1）每次调用strtok函数只能获得一个分割单位。（2）要获得所有的分割单元必须反复调用strtok函数。</p>
<p>2.strtok函数以后的调用时的需用NULL来替换s.</p>
<p>3.形参s(要分割的字符串)对应的变量应用char s[]=&#8221;&#8230;.&#8221;形式，而不能用char *s=&#8221;&#8230;.&#8221;形式。</p>
<p>例子如下：</p>
<ol title="Double click to hide line number." ondblclick="linenumber(this)">#include &lt;stdio.h&gt;</p>
<li>#include &lt;string.h&gt;</li>
<li>void  main()</li>
<li>{</li>
<li>char buf[]=&#8221;Golden Global View&#8221;;</li>
<li>char* token = strtok( buf, &#8221; &#8220;);</li>
<li>while( token != NULL )</li>
<li>    {</li>
<li>        printf( &#8221;%s &#8220;, token ); </li>
<li>        token = strtok( NULL, &#8221; &#8220;);</li>
<li>    }</li>
<li>return 0;</li>
<li>}</li>
</ol>
<p>其结果为：</p>
<p>Golden<br />
Global<br />
View</p>
<p>但是如果我们把char buf[]=&#8221;Golden Global View&#8221;;换成char *buf=&#8221;Golden Global View&#8221;; 则会出错，原因我还没找到，如果有人发现了原因望告知于我。</p>
<p>如果我们把token = strtok( NULL, &#8221; &#8220;);换成token = strtok( buf, &#8221; &#8220;);则while循环会成为一个无限循环，而输出的结果就只为：Golden。我的解释原因如下：</p>
<p>在strtok函数体中有一个char 类型的指针（假设为 char *p）,它的作用就是令p=s,用于保存s的起始地址。由于在随后的处理中指针p的值会一直保存（C语言中指针的特点），因此在以后的strtok调用中用NULL来代替s的原因就是防止p被重新赋值而指向s的起始地址，从而可以保证p可以指向s的其他位置，直到最后分割完整个字符串。</p>
<p>但是如果用s来代替NULL，那么每次调用strtok时，p就会指向s的初始地址，从而只能获得第一个分割出来的字串，如上面的例子中while会是一个无限循环，而输出的结果只能是“Golden”。</p>


<p>相关文章:<ol><li><a href='http://www.ecoviews.cn/archives/59.html' rel='bookmark' title='Permanent Link: 网站自动安装之三！'>网站自动安装之三！</a></li>
<li><a href='http://www.ecoviews.cn/archives/834.html' rel='bookmark' title='Permanent Link: Unicode字符编码与ASCII字符编码的关系！'>Unicode字符编码与ASCII字符编码的关系！</a></li>
<li><a href='http://www.ecoviews.cn/archives/1084.html' rel='bookmark' title='Permanent Link: C语言中变量默认值！'>C语言中变量默认值！</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.ecoviews.cn/archives/712.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

