免费注册 查看新帖 |

Chinaunix

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

[C] 发现 windows 的 fwrite 库函数有个严重的BUG。 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-02-20 17:27 |只看该作者
原帖由 flw2 于 2008-2-20 17:20 发表
循环之所以不停,是因为read write的缓冲可能是不同的,或者文件当前位置有两个,一个读写

能否把FILE的定义找出来?


猜测也得靠谱。

论坛徽章:
0
12 [报告]
发表于 2008-02-20 17:30 |只看该作者
linux下也这样么?大家试了没有?

论坛徽章:
0
13 [报告]
发表于 2008-02-20 17:36 |只看该作者
原帖由 tgbvc 于 2008-2-20 17:27 发表


猜测也得靠谱。

猜测要大胆,呵呵
你的循环不退出,就是因为永远没有超过当前文件结尾,所以我那么猜测
至少完全不能说是fseek的问题
fwrite和fread之间没有fseek(或等价的)行为是未定义的
错误的代码肯定不能证明有bug,尽管它可能真有bug

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
14 [报告]
发表于 2008-02-20 17:40 |只看该作者
无论如何,标准I/O的输入输出之间要刷新流,这是C语言标准的规定。

论坛徽章:
0
15 [报告]
发表于 2008-02-20 17:47 |只看该作者
代码...看起来很难受, 不过还是坚持下来....

你vc调试, 看stream里面, 有个ptr和base. 两个buffer

[ 本帖最后由 Edengundam 于 2008-2-20 18:01 编辑 ]

论坛徽章:
0
16 [报告]
发表于 2008-02-20 17:48 |只看该作者
简单的看了一下,linux下的stdio FILE是有两个指针,当fwrite时改变write指针,而不改变read指针,
但是buf指针后移,所以read种能得到,要下班了,在linux试试,估计结果一样

论坛徽章:
0
17 [报告]
发表于 2008-02-20 17:53 |只看该作者
哦,才看见,你的正确的代码后面是有fseek
看一个FILE只有一个指针(当前位置)的fseek实现,不难想象有两个指针的fseek

int
fseek(FILE *stream, long int offset, int whence)
{
        int adjust = 0;
        long pos;

        stream->_flags &= ~(_IOEOF | _IOERR);
        /* Clear both the end of file and error flags */

        if (io_testflag(stream, _IOREADING)) {
                if (whence == SEEK_CUR
                    && stream->_buf
                    && !io_testflag(stream,_IONBF))
                        adjust = stream->_count;
                stream->_count = 0;
        } else if (io_testflag(stream,_IOWRITING)) {
                fflush(stream);
        } else        /* neither reading nor writing. The buffer must be empty */
                /* EMPTY */ ;

        pos = _lseek(fileno(stream), offset - adjust, whence);
        if (io_testflag(stream, _IOREAD) && io_testflag(stream, _IOWRITE))
                stream->_flags &= ~(_IOREADING | _IOWRITING);

        stream->_ptr = stream->_buf;
        return ((pos == -1) ? -1 : 0);
}

论坛徽章:
0
18 [报告]
发表于 2008-02-20 18:21 |只看该作者
原帖由 flw2 于 2008-2-20 17:08 发表
在fread和fwrite之间需要fseek(stream,0,SEEK_SET);


呵呵,栽在这个上面人估计不会少。

论坛徽章:
38
2017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:2720周年集字徽章-周	
日期:2022-01-13 15:12:33
19 [报告]
发表于 2008-02-20 19:12 |只看该作者
乐死了, MS的fwrite都多少年了,还怀疑有BUG.

论坛徽章:
0
20 [报告]
发表于 2008-02-20 19:37 |只看该作者

回复 #1 tgbvc 的帖子

这个...根据多年的经验总结,在下结论怀疑别人的BUG,尤其是成熟的开发库平台的BUG之前,最好还是自己先多试验一下,看看是否自己对某些东西的理解有偏差...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP