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会换行等,即使没发生作用,也是一个小黑方块。