fread和fwrite注意

fwrite(将数据写至文件流)
定义函数  size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream);

函数说明  fwrite()用来将数据写入文件流中。参数stream为已打开的文件指针,参数ptr 指向欲写入的数据地址,总共写入的字符数以参数size*nmemb来决定。Fwrite()会返回实际写入的nmemb数目。
 返回值  返回实际写入的nmemb数目。

int iWrite = fwrite(ptr,sizeof(int),4,file); //返回4,即写入4个int长度的数据
int iWrite = fwrite(ptr,1,4,file);//返回4,即写入4个字节的数据
int iWrite = fwrite(ptr,4,1,file);//返回1,即写入1个长度为4的数据
int iWrite = fwrite(ptr,4,2,file);//返回2,即写入2个长度为4的数据


按fwrite的语义,不是说你一次写多少数据就能全部写入的,因为缓存有限的说,并且不同的OS缓存大小可能还不一样。正确的写法:

int   nTotalWritedBytes   =   0;   
int   nCurWritedBytes   =   0;   
while(nTotalWritedBytes   <   nBitsSize)   
{  

     //返回实际写入的数据数目
     nCurWritedBytes = fwrite(pBytes+nTotalWritedBytes, 1, nBitsSize-nTotalWritedBytes, fp);   
     if(nCurWritedBytes   <   0)   
     {   
     return   FWRITE_FAILURE;   //出错
   }   
     nTotalWritedBytes   +=   nCurWritedBytes;   //实际写入的数据量
}

 

fread(从文件流读取数据)  
定义函数  size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);

函数说明  fread()用来从文件流中读取数据。参数stream为已打开的文件指针,参数ptr 指向欲存放读取进来的数据空间,读取的字符数以参数size*nmemb来决定。Fread()会返回实际读取到的nmemb数目,如果此值比参数nmemb 来得小,则代表可能读到了文件尾或有错误发生,这时必须用feof()或ferror()来决定发生什么情况。
 返回值  返回实际读取到的nmemb数目。

***********************************************************

fwrite时多余字符出来 ~~

------解决方案--------------------
在使用fread和fwrite函数的时候,如果文件打开方式不是二进制方式,在写入unsigned char类型的数据时,会凭空多读或多写一些数据(通常从第二个lpbuf块开始),感觉多读或多写的字符数量是随机产生,请问哪位研究过fread和 fwrite函数,麻烦解答一下。 
============================ 
关键在于 文件操作方式 的区别。 
fread和 fwrite 必须使用 2进制操作方式,否则操作的字节数【可能】不正确。 

原因是 2进制操作时候, 
操作不考虑字符意义, 
纯粹操作字节流。 
也就是操作的的数据按字节 “流”向 文件(或者读取出来), 
但是这个字节的意义不予考虑, 
所以参数指定多少长度,就读写多少字节。 

但是文本方式不同, 
这种操作方式下,考虑字符意义,而不是纯粹考虑字节流。 
一个常见的例子,\n 在win下,文本方式操作, 
写文件的时候,根据字符意义,会在文件中写入两个字符 \r\n 
而文件中的 \r\n 在文本方式读取的时候, 会根据字符意义被转换成\n一个字符【如果是2进制读取的话,这里读取的就是两个字符】 
------解决方案--------------------

我想,楼主所说的问题恐怕与程序代码文件打开方式无关,而与你在程序外部打开文件方式有关,也就是说文件类型(扩展名)有关,理由是: 
在C中,二进制和文本打开方式的原理其实是一样的,只不过文本文件方式在读写时会发生对控制字符的进行转义,譬如\n写入会转换为0x0d0a,而读取时,遇到0x0d0a又会转换为\n,所以文本文件只是二进制文件的一个特例,但是这个特例的字符转义是靠读写函数完成的,而楼主是用二进制读写函数进行读写的,决不会发生字符转义,所以,该问题与打开方式无多大关系。 
既然无关,为什么楼主感觉“会凭空多读或多写一些数据”呢,这应该是你在程序外部打开文件不当造成的,比如说,用记事本打开,由于文件的本质是二进制形式的(没有字符转义),一些控制字符被记事本转义了,所有0x20下的不可见控制字符会发生作用,如\0x9会变成制表符,0x0d0a会换行等,即使没发生作用,也是一个小黑方块。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值