fopen里的wb和w的区别即fwrite的返回值与实际文件大小不一致的问题

今天在做项目的时候,进行了文件操作。先打开一个文件,从中读取出 uiFileLen 个字节的文件,然后将其写入一个新文件。代码如下

uint  uiFileLen  =  0x1000;

FILE * fp1 = fopen("d:\\abc.tar.gz","rb");

uchar *ucBuf=(uchar *)malloc(uiFileLen);

if(uiFileLen!= fread(ucBuf,sizeof(char),uiFileLen,fp1))  return;

FILE * fp2 =fopen("d:\\data.tar.gz","w");

uint  uiWrittenNum  = fwrite(ucbuf,sizeof(char),uiFileLen,fp2);

if(uiWrittenNum!=uiFileLen) return;

fclose(fp1);

fclose(fp2);

以上代码的功能就是从d:\\abc.tar.gz中读取uiFileLen个字节,然后写到”d:\\data.tar.gz"文件里。上面的代码运行正确,没有出错。但是生成的“d:\data.tar.gz”文件的大小却比uiFileLen的小。

后来查了一些资料,原来是打开方式的问题。资料地址:http://www.xuebuyuan.com/2039055.html

将上面代码中的FILE * fp2 =fopen("d:\\data.tar.gz","w");改为FILE * fp2 =fopen("d:\\data.tar.gz","wb");,以二进制模式打开,得出的文件大小就与uiFileLen一致了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
二进制文件读写源代码主要包含三个函数:fopen、fseek和fwrite。 1. fopen函数 fopen函数用于打开文件,并返回一个指向该文件的指针。 语法:FILE *fopen(const char *filename, const char *mode); 参数说明: - filename:文件名,可以包含文件路径。 - mode:打开文件的模式。有以下几种可用: - "r":只读打开文件。 - "w":写入打开文件。如果文件存在,则清空文件内容;如果文件不存在,则创建文件。 - "a":追加打开文件。如果文件存在,则在文件末尾添加数据;如果文件不存在,则创建文件。 - "rb":只读打开二进制文件。 - "wb":写入打开二进制文件。如果文件存在,则清空文件内容;如果文件不存在,则创建文件。 - "ab":追加打开二进制文件。如果文件存在,则在文件末尾添加数据;如果文件不存在,则创建文件。 返回值:如果文件打开成功,则返回一个指向文件的指针;否则返回NULL。 2. fseek函数 fseek函数用于将文件指针定位到指定位置。 语法:int fseek(FILE *stream, long offset, int whence); 参数说明: - stream:文件指针。 - offset:偏移量。正数表示向后偏移,负数表示向前偏移。 - whence:偏移起始位置。有以下三种可用: - SEEK_SET:从文件开头开始偏移(即绝对偏移)。 - SEEK_CUR:从当前位置开始偏移(即相对偏移)。 - SEEK_END:从文件末尾开始偏移。 返回值:如果函数执行成功,则返回0;否则返回非0的值。 3. fwrite函数 fwrite函数用于将指定数据写入文件。 语法:size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream); 参数说明: - ptr:数据存储的位置(即数据的首地址)。 - size:要写入的数据块大小(单位:字节)。 - count:要写入的数据块个数。 - stream:文件指针。 返回值:返回实际写入的数据块个数。如果返回值小于count,则表示出现了写入错误。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值