免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: k8king
打印 上一主题 下一主题

[C] memset的恐慌 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2011-09-24 10:09 |只看该作者
回复 10# k8king


    首先,代码其实等价于

  1.         
  2.         while ( memset(tmpbuf,0,sizeof(tmpbuf)) ,
  3.                   fread(tmpbuf,1,sizeof(tmpbuf),fp)!=0 )
  4.                {
  5.                   printf("tmpbuf = %s\n",tmpbuf);
  6.                }
复制代码


memset(tmpbuf,0,sizeof(tmpbuf))的作用是把tmpbuf数组中的每个字节都填充为(unsigned char)0
fread()函数是把从fp指向的输入流中读取字符
如果不发生没读入的情况(fread(tmpbuf,1,sizeof(tmpbuf),fp)!=0)
那么tmpbuf数组的每个字符都被重写了一遍
从这里能够看出memset(tmpbuf,0,sizeof(tmpbuf))不必要性
(谁也不会 int n; n=0;scanf("%d",&n); 吧?)
由于tmpbuf数组的每个字符都被重写了一遍
无法保证在tmpbuf数组中存在'\0'
这样
printf("tmpbuf = %s\n",tmpbuf);
的结果就毫无保证
因而我认为memset(tmpbuf,0,sizeof(tmpbuf))非但不必要,而且是错误的

使用fread(tmpbuf,1,sizeof(tmpbuf),fp)读数据,我和前面4楼看法一样,感觉莫名其妙
我认为怎么也应该用fgets(),而且fp应该是"r"方式打开的而不是"rb"方式打开的

论坛徽章:
0
12 [报告]
发表于 2011-09-24 18:24 |只看该作者
回复 11# KBTiller


    是printf带来的对使用意义上的分歧,这个是我举例有误,printf这个位置如果换成fwrite(tmpbuf,1,i,fpo);怎么样?其实想要实现文件合并的功能,因为觉得memset可能会有问题,所以一开始写printf来测试读取的值。这里解释一下为什么用fread,只要适当扩大tmpbuf,以fread的方式读取,可以减少读取的次数。

论坛徽章:
0
13 [报告]
发表于 2011-09-24 19:09 |只看该作者

  1.        int read_bytes = 0;
  2.        memset(tmpbuf,0,sizeof(tmpbuf));
  3.        while((read_bytes = fread(tmpbuf,1,sizeof(tmpbuf) - 1,fp))!=0)
  4.         {
  5.                 tmpbuf[read_bytes] = '\0';
  6.                 printf("tmpbuf = %s\n",tmpbuf);
  7.         }
复制代码

论坛徽章:
0
14 [报告]
发表于 2011-09-24 19:47 |只看该作者
ezioma 发表于 2011-09-24 19:09



   

论坛徽章:
0
15 [报告]
发表于 2011-09-24 20:21 |只看该作者
回复  KBTiller
是printf带来的对使用意义上的分歧,这个是我举例有误,printf这个位置如果换成fwrite(tmpbuf,1,i,fpo);怎么样?其实想要实现文件合并的功能,因为觉得memset可能会有问题,所以一开始写printf来测试读取的值。这里解释一下为什么用fread,只要适当扩大tmpbuf,以fread的方式读取,可以减少读取的次数。k8king 发表于 2011-09-24 18:24


那我觉得memset()还是没有意义
如果我没理解错的话
我觉得你想要的大概是下面的样子

do {
   size_t  size   ;
   size  =  fread(tmpbuf,1,sizeof(tmpbuf),fp) ;
   fwrite( tmpbuf , 1 ,  size  ,fpo);
}
while(没读到结尾);

论坛徽章:
0
16 [报告]
发表于 2011-09-24 21:04 |只看该作者
本帖最后由 k8king 于 2011-09-24 21:05 编辑

回复 15# KBTiller

嗯,基本上和你想的一样,但是因为无法预知最后一次能够读到多少字节,觉得最后一次读取的值如果没有memset的话,,很有可能会和倒数第二次的值会在一起,出现混乱,所以使用了memset,测试的时候发现假如文件中间出现空行的话,文件结尾有时候就会很奇怪。

论坛徽章:
0
17 [报告]
发表于 2011-09-24 21:06 |只看该作者
回复  KBTiller

嗯,基本上和你想的一样,因为无法预知最后一次能够读到多少字节,觉得最后一次读取的值 ...
k8king 发表于 2011-09-24 21:04



    size  =  fread(tmpbuf,1,sizeof(tmpbuf),fp) ;
这个不就知道最后一次读了多少字节了吗

论坛徽章:
0
18 [报告]
发表于 2011-09-24 21:09 |只看该作者
回复 16# k8king


    The fread function returns the number of elements successfully read, which may be less than nmemb if a read error or end-of-file is encountered.

论坛徽章:
0
19 [报告]
发表于 2011-09-24 21:27 |只看该作者
回复 18# KBTiller


    啊,果然!15楼的时候你就表达了这个意思了,我忽略了!受教育了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP