<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[[实践OK] fopen , fread fwrite 函数读写二进制文件 问题总结 ]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Unix/LinuxC技术]]></category>
<pubDate>Mon, 22 Jun 2015 09:36:33 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	被复制的文件情况：<br/>[root@iZ25dcp92ckZ multepoolserver]# stat seven.mp4<br/>&nbsp;&nbsp;文件：&quot;seven.mp4&quot;<br/>&nbsp;&nbsp;大小：8573191&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 块：16752&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO 块：4096&nbsp;&nbsp; 普通文件<br/>设备：ca01h/51713d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Inode：7878&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;硬链接：1<br/>权限：(0644/-rw-r--r--)&nbsp;&nbsp;Uid：(&nbsp;&nbsp;&nbsp;&nbsp;0/&nbsp;&nbsp;&nbsp;&nbsp;root)&nbsp;&nbsp; Gid：(&nbsp;&nbsp;&nbsp;&nbsp;0/&nbsp;&nbsp;&nbsp;&nbsp;root)<br/>最近访问：2015-06-22 17:31:45.913756498 +0800<br/>最近更改：2015-06-16 16:58:26.000000000 +0800<br/>最近改动：2015-06-16 17:17:17.910047316 +0800<br/><br/>根据上面的大小8573191 编写代码，writeTest.c：<br/><textarea name="code" class="C" rows="15" cols="100">
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
int writeFile(const char* _fileName, char* _buf, unsigned int _bufLen)
&#123;
&nbsp;&nbsp;&nbsp;&nbsp;FILE * fp = NULL;
&nbsp;&nbsp;&nbsp;&nbsp;if( NULL == _buf &#124;&#124; _bufLen &lt;= 0 ) return (-1);

&nbsp;&nbsp;&nbsp;&nbsp;fp = fopen(_fileName, &quot;wb&quot;); // 必须确保是以 二进制写入的形式打开

&nbsp;&nbsp;&nbsp;&nbsp;if( NULL == fp )
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (-1);
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;fwrite(_buf, _bufLen, 1, fp); //二进制写

&nbsp;&nbsp;&nbsp;&nbsp;fclose(fp);
&nbsp;&nbsp;&nbsp;&nbsp;fp = NULL;

&nbsp;&nbsp;&nbsp;&nbsp;return 0;&nbsp;&nbsp;&nbsp;&nbsp;
&#125;
int readFile(const char* _fileName, char* _buf,unsigned int _bufLen)
&#123;
&nbsp;&nbsp;&nbsp;&nbsp;FILE* fp = NULL;
&nbsp;&nbsp;&nbsp;&nbsp;if( NULL == _buf &#124;&#124; _bufLen &lt;= 0 ) return (-1);

&nbsp;&nbsp;&nbsp;&nbsp;fp = fopen(_fileName, &quot;rb&quot;); // 必须确保是以 二进制读取的形式打开 

&nbsp;&nbsp;&nbsp;&nbsp;if( NULL == fp )
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (-1);
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;fread(_buf, _bufLen, 1, fp); // 二进制读

&nbsp;&nbsp;&nbsp;&nbsp;fclose(fp);
&nbsp;&nbsp;&nbsp;&nbsp;return 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&#125;

int main()&#123;
&nbsp;&nbsp;&nbsp;&nbsp;char * _buf;
&nbsp;&nbsp;&nbsp;&nbsp;int retRead,retWrite,fileContentLen=8573192;
&nbsp;&nbsp;&nbsp;&nbsp;_buf = (char *)malloc(sizeof(char)*fileContentLen);
&nbsp;&nbsp;&nbsp;&nbsp;char _fileNameRead[56]=&quot;/data/codesdev/multepoolserver/seven.mp4&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;char _fileNameWrite[56]=&quot;/data/codesdev/multepoolserver/sevenCopy.mp4&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;retRead = readFile(_fileNameRead,_buf,8573191);
&nbsp;&nbsp;&nbsp;&nbsp;retWrite = writeFile(_fileNameWrite,_buf,8573191);

&#125;

</textarea><br/>编译此文件：<br/>[root@iZ25dcp92ckZ multepoolserver]# gcc writeTest.c&nbsp;&nbsp;-g -o writeTest<br/>[root@iZ25dcp92ckZ multepoolserver]# ./writeTest <br/>对写入的文件进行md5比对：<br/>[root@iZ25dcp92ckZ multepoolserver]# md5sum&nbsp;&nbsp;sevenCopy.mp4 <br/>cf9dc79b01388037577e0a13e261cbe6&nbsp;&nbsp;sevenCopy.mp4<br/>[root@iZ25dcp92ckZ multepoolserver]# md5sum seven.mp4 <br/>cf9dc79b01388037577e0a13e261cbe6&nbsp;&nbsp;seven.mp4<br/><br/>[root@iZ25dcp92ckZ multepoolserver]# stat seven.mp4<br/>&nbsp;&nbsp;文件：&quot;seven.mp4&quot;<br/>&nbsp;&nbsp;大小：8573191&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 块：16752&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO 块：4096&nbsp;&nbsp; 普通文件<br/>设备：ca01h/51713d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Inode：7878&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;硬链接：1<br/>权限：(0644/-rw-r--r--)&nbsp;&nbsp;Uid：(&nbsp;&nbsp;&nbsp;&nbsp;0/&nbsp;&nbsp;&nbsp;&nbsp;root)&nbsp;&nbsp; Gid：(&nbsp;&nbsp;&nbsp;&nbsp;0/&nbsp;&nbsp;&nbsp;&nbsp;root)<br/>最近访问：2015-06-22 17:31:45.913756498 +0800<br/>最近更改：2015-06-16 16:58:26.000000000 +0800<br/>最近改动：2015-06-16 17:17:17.910047316 +0800<br/>创建时间：-<br/>[root@iZ25dcp92ckZ multepoolserver]# stat sevenCopy.mp4<br/>&nbsp;&nbsp;文件：&quot;sevenCopy.mp4&quot;<br/>&nbsp;&nbsp;大小：8573191&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 块：16752&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO 块：4096&nbsp;&nbsp; 普通文件<br/>设备：ca01h/51713d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Inode：9791&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;硬链接：1<br/>权限：(0644/-rw-r--r--)&nbsp;&nbsp;Uid：(&nbsp;&nbsp;&nbsp;&nbsp;0/&nbsp;&nbsp;&nbsp;&nbsp;root)&nbsp;&nbsp; Gid：(&nbsp;&nbsp;&nbsp;&nbsp;0/&nbsp;&nbsp;&nbsp;&nbsp;root)<br/>最近访问：2015-06-22 17:31:56.458192181 +0800<br/>最近更改：2015-06-22 17:31:45.919756746 +0800<br/>最近改动：2015-06-22 17:31:45.919756746 +0800<br/>创建时间：-<br/><br/><br/><br/>___________________________________________________________________________________________<br/>recv()函数返回值为二进制字符串的异常问题<br/>用C++的socket进行网络请求，返回的是一张png图片的二进制字符串（png的二进制串中好像含有NUL内容），recv（）函数接受返回值时遇到NUL时就中止本次接受的内容，导致本次接受的数据不完整，该如何处理？<br/><br/><br/>首先要说的是你对返回值理解错误了.并不是遇到NULL就中止,而是由你发送的数长度和你接收的buff大小决定.不会遇NULL中止.<br/>当你得到buff的,也就是recv执行成功后,你要取得buff中的全部内容,应该用内存复制(memcpy()),而不能用字符串的复制.字符串的复制是NULL中止.<br/>BYTE rcvbuf[1000]=&#123;0&#125;;<br/>int Size=recv(sock,rcvbuf,1000,0);<br/>BYTE buf[1000]=&#123;0&#125;;<br/>memcpy(buf,rcvbuf,Size);<br/>最后还有一种情况,有可能你发送端根本就没有发送完,是发送端NULL中止了.原因可能还是你有了字串copy,没有用内存copy,还有发送长度的计算,你自己都输出看下,才能找到原因.<br/>不要只想到是接收端出问题.并且不要轻易怀疑 别人成熟的东西.<br/>___________________________________________________________________________________________<br/>最近在解析 png 数据文件， 发现一个文件操作中容易忽略的问题，问题描述如下：<br/>在使用 fread 读二进制文件（png 图片）的时候， 发现读取到内存中的数据和 二进制文件中的数据不一致， 同样， 在&nbsp;&nbsp;使用 fwrite 写二进制文件（png 图片）的时候， 发现写入到内存中的数据和 二进制文件中的数据和内存中的数据也不一致。 <br/>这个问题头疼了两天， 结果发现了一个很低级的错误。就是在读写二进制文件的时候，必须确保文件的打开形式是以 二进制读写的形式打开的，&nbsp;&nbsp;即：文件的打开形式必须是 &quot;rb&quot;, &quot;wb&quot; 要不然，读写数据的时候，就会出现错误。<br/><br/>/*<br/>* 函数说明: 写二进制文件<br/>* 参数描述: _fileName, 文件名称<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _buf, 要写的内存缓冲。<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _bufLen, 内存缓冲的长度<br/>*&nbsp;&nbsp; 返回值: 0, 成功<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1, 失败<br/>*<br/>*/<br/>int writeFile(const STR* _fileName, void* _buf, int _bufLen)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FILE * fp = NULL;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if( NULL == _buf &#124;&#124; _bufLen &lt;= 0 ) return (-1);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;fp = fopen(_fileName, &quot;wb&quot;); // 必须确保是以 二进制写入的形式打开<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;if( NULL == fp )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (-1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;fwrite(_buf, _bufLen, 1, fp); //二进制写<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;fclose(fp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;fp = NULL;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;return 0;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&#125;<br/><br/>/*<br/> * 函数说明:&nbsp;&nbsp;读二进制文件<br/>*&nbsp;&nbsp;参数描述: _fileName, 文件名称<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _buf, 读出来的数据存放位置<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _bufLen, 数据的长度信息<br/>*&nbsp;&nbsp;&nbsp;&nbsp;返回值:&nbsp;&nbsp;0, 成功<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1, 失败<br/>*<br/>*/<br/>int readFile(const char* _fileName, void* _buf, int _bufLen)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FILE* fp = NULL;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if( NULL == _buf &#124;&#124; _bufLen &lt;= 0 ) return (-1);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;fp = fopen(_fileName, &quot;rb&quot;); // 必须确保是以 二进制读取的形式打开 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;if( NULL == fp )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (-1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;fread(_buf, _bufLen, 1, fp); // 二进制读<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;fclose(fp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;return 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&#125;<br/><br/><br/>函数使用说明： <br/>FILE * fopen(const char * path,const char * mode);<br/>参数path字符串包含欲打开的文件路径及文件名，<br/>参数mode字符串则代表着流形态。mode有下列几种形态字符串: <br/>&nbsp;&nbsp;r 打开只读文件，该文件必须存在。 <br/>&nbsp;&nbsp;r+ 打开可读写的文件，该文件必须存在。 <br/>&nbsp;&nbsp;rb+ 读写打开一个二进制文件，只允许读写数据。<br/>&nbsp;&nbsp;rt+ 读写打开一个文本文件，允许读和写。<br/>&nbsp;&nbsp;w 打开只写文件，若文件存在则文件长度清为0，即该文件内容会消失。若文件不存在则建立该文件。 <br/>&nbsp;&nbsp;w+ 打开可读写文件，若文件存在则文件长度清为零，即该文件内容会消失。若文件不存在则建立该文件。 <br/>&nbsp;&nbsp;a 以附加的方式打开只写文件。若文件不存在，则会建立该文件，如果文件存在，写入的数据会被加到文件尾，即文件原先的内容会被保留。（EOF符保留） <br/>&nbsp;&nbsp;a+ 以附加方式打开可读写的文件。若文件不存在，则会建立该文件，如果文件存在，写入的数据会被加到文件尾后，即文件原先的内容会被保留。 （原来的EOF符不保留）<br/>&nbsp;&nbsp;wb 只写打开或新建一个二进制文件；只允许写数据。<br/>&nbsp;&nbsp;wb+ 读写打开或建立一个二进制文件，允许读和写。<br/>&nbsp;&nbsp;wt+ 读写打开或着建立一个文本文件；允许读写。<br/>&nbsp;&nbsp;at+ 读写打开一个文本文件，允许读或在文本末追加数据。<br/>&nbsp;&nbsp;ab+ 读写打开一个二进制文件，允许读或在文件末追加数据。<br/>&nbsp;&nbsp;上述的形态字符串都可以再加一个b字符，如rb、w+b或ab＋等组合，加入b 字符用来告诉函数库打开的文件为二进制文件，而非纯文字文件。不过在POSIX系统，包含Linux都会忽略该字符。由fopen()所建立的新文件会具有S_IRUSR&#124;S_IWUSR&#124;S_IRGRP&#124;S_IWGRP&#124;S_IROTH&#124;S_IWOTH(0666)权限，此文件权限也会参考umask 值。 <br/>&nbsp;&nbsp;有些C编译系统可能不完全提供所有这些功能，有的C版本不用&quot;r+&quot;,&quot;w+&quot;,&quot;a+&quot;,而用&quot;rw&quot;,&quot;wr&quot;,&quot;ar&quot;等，读者注意所用系统的规定。<br/>返回值<br/>&nbsp;&nbsp;文件顺利打开后，指向该流的文件指针就会被返回。若果文件打开失败则返回NULL，并把错误代码存在errno 中<br/>附加说明<br/>&nbsp;&nbsp;一般而言，开文件后会作一些文件读取或写入的动作，若开文件失败，接下来的读写动作也无法顺利进行，所以在fopen()后请作错误判断及处理。<br/><br/>fread函数和fwrite函数<br/>1.函数功能<br/>&nbsp;&nbsp;用来读写一个数据块。<br/>2.一般调用形式<br/>&nbsp;&nbsp;fread(buffer,size,count,fp);<br/>&nbsp;&nbsp;fwrite(buffer,size,count,fp);<br/>3.说明<br/>&nbsp;&nbsp;（1）buffer：是一个指针，对fread来说，它是读入数据的存放地址。对fwrite来说，是要输出数据的地址。<br/>&nbsp;&nbsp;（2）size：要读写的字节数；<br/>&nbsp;&nbsp;（3）count:要进行读写多少个size字节的数据项；<br/>&nbsp;&nbsp;（4）fp:文件型指针。<br/><br/>来自：http://blog.chinaunix.net/uid-20622737-id-1913086.html
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [实践OK] fopen , fread fwrite 函数读写二进制文件 问题总结 ]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>