免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 21678 | 回复: 51
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-02-20 15:27 |只看该作者 |正序浏览

#include <stdio.h>
#include <conio.h>
#include <string.h>

void main( void )
{
&nbsp;&nbsp;&nbsp;FILE *stream;
&nbsp;&nbsp;&nbsp;char  ch = '1';
&nbsp;&nbsp;&nbsp;char  buf[60] = "123";
&nbsp;&nbsp;&nbsp;int  n = 0;

&nbsp;&nbsp;&nbsp;stream = fopen( "./Debug/fseek.txt", "w+" );
&nbsp;&nbsp;&nbsp;if( stream == NULL )
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;   printf( "The file fseek.out was not opened\n" );
&nbsp;&nbsp;&nbsp;&nbsp;   return;
&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;if(strlen(buf) != fwrite(buf, 1, strlen(buf), stream))
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;   printf( "Error!\n" );
&nbsp;&nbsp;&nbsp;&nbsp;   goto  MAIN_GT1;
&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;rewind(stream);
&nbsp;&nbsp;&nbsp;printf( "Position 1: %ld\n", ftell( stream) );//[]

&nbsp;&nbsp;&nbsp;if(0 != fseek(stream, 1, SEEK_CUR))
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;   printf( "Error! fseek != 0 \n" );
&nbsp;&nbsp;&nbsp;&nbsp;   goto  MAIN_GT1;
&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;printf( "Position 2: %ld\n", ftell( stream) );//[]


&nbsp;&nbsp;&nbsp;while(1 == fread(&ch, 1, 1, stream))
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;   printf( "Position 3: %ld, ch = %c\n", ftell( stream), ch );//[]

&nbsp;&nbsp;&nbsp;&nbsp;   
&nbsp;&nbsp;&nbsp;&nbsp;   if(0 != fseek(stream, -1, SEEK_CUR))
&nbsp;&nbsp;&nbsp;&nbsp;   {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   printf( "Error! fseek != 0 \n" );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   goto  MAIN_GT1;
&nbsp;&nbsp;&nbsp;&nbsp;   }
&nbsp;&nbsp;&nbsp;&nbsp;   
&nbsp;&nbsp;&nbsp;&nbsp;   printf( "Position 4: %ld\n", ftell( stream ) );//[]

&nbsp;&nbsp;&nbsp;&nbsp;   
&nbsp;&nbsp;&nbsp;&nbsp;   ch++;
&nbsp;&nbsp;&nbsp;&nbsp;   if(1 != fwrite(&ch, 1, 1, stream))
&nbsp;&nbsp;&nbsp;&nbsp;   {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   printf( "Error! fwrite != 0 \n" );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   goto  MAIN_GT1;
&nbsp;&nbsp;&nbsp;&nbsp;   }
&nbsp;&nbsp;&nbsp;&nbsp;   printf( "Position 5: %ld\n", ftell( stream ) );//[]

&nbsp;&nbsp;&nbsp;&nbsp;   //_getch();

&nbsp;&nbsp;&nbsp;&nbsp;  // goto  MAIN_GT1;

&nbsp;&nbsp;&nbsp;&nbsp;   //n++;

&nbsp;&nbsp;&nbsp;&nbsp;   
&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;
MAIN_GT1:
&nbsp;&nbsp;&nbsp;fclose( stream );
}


程序创建一个名为 fseek.txt 的空文件,然后向这个文件里写“123”三个字符,然后想把“23”改为“34”,可是为什么循环不停而且文件内容象下面不断增加?

134444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444443


原来windows的fwrite库函数有个严重的BUG,这样做就没事了:


#include <stdio.h>
#include <conio.h>
#include <string.h>

void main( void )
{
&nbsp;&nbsp;&nbsp;FILE *stream;
&nbsp;&nbsp;&nbsp;char  ch = '1';
&nbsp;&nbsp;&nbsp;char  buf[60] = "123";

&nbsp;&nbsp;&nbsp;stream = fopen( "./Debug/fseek.txt", "w+" );
&nbsp;&nbsp;&nbsp;if( stream == NULL )
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;   printf( "The file fseek.out was not opened\n" );
&nbsp;&nbsp;&nbsp;&nbsp;   return;
&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;if(strlen(buf) != fwrite(buf, 1, strlen(buf), stream))
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;   printf( "Error!\n" );
&nbsp;&nbsp;&nbsp;&nbsp;   goto  MAIN_GT1;
&nbsp;&nbsp;&nbsp;}
&nbsp;
&nbsp;&nbsp;&nbsp;rewind( stream );

&nbsp;&nbsp;&nbsp;&nbsp;printf( "Position 1-----: %ld\n", ftell( stream) );//[]

&nbsp;&nbsp;&nbsp;while(1 == fread(&ch, 1, 1, stream))
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;   printf( "Position 3: %ld, ch = %c\n", ftell( stream), ch );//[]

&nbsp;&nbsp;&nbsp;&nbsp;   if(0 != fseek(stream, -1, SEEK_CUR))
&nbsp;&nbsp;&nbsp;&nbsp;   {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   printf( "Error! fseek != 0 \n" );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   goto  MAIN_GT1;
&nbsp;&nbsp;&nbsp;&nbsp;   }
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;   
&nbsp;&nbsp;&nbsp;&nbsp;   ch++;
&nbsp;&nbsp;&nbsp;&nbsp;   if(1 != fwrite(&ch, 1, 1, stream))
&nbsp;&nbsp;&nbsp;&nbsp;   {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   printf( "Error! fwrite != 0 \n" );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   goto  MAIN_GT1;
&nbsp;&nbsp;&nbsp;&nbsp;   }

&nbsp;&nbsp;&nbsp;&nbsp;   if(0 != fseek(stream, 0, SEEK_CUR))
&nbsp;&nbsp;&nbsp;&nbsp;   {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   printf( "Error! fseek != 0 \n" );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   goto  MAIN_GT1;
&nbsp;&nbsp;&nbsp;&nbsp;   }
&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;
MAIN_GT1:
&nbsp;&nbsp;&nbsp;fclose( stream );
}


[ 本帖最后由 tgbvc 于 2008-2-20 16:49 编辑 ]

论坛徽章:
0
52 [报告]
发表于 2008-02-29 15:27 |只看该作者
已经不是讨论技术了,张口闭口粗话,建议版主锁贴。
但就技术角度,个人认为加精有些勉强。

论坛徽章:
0
51 [报告]
发表于 2008-02-28 14:56 |只看该作者
第一次执行的,存在缓存里面,所以一直++吧

论坛徽章:
0
50 [报告]
发表于 2008-02-28 10:09 |只看该作者
还有不要在这里唧唧歪歪,人家都懒得理你。。

论坛徽章:
0
49 [报告]
发表于 2008-02-28 10:08 |只看该作者
楼主既然发现bug,何不和MS直接联系呢,还在这里浪费时间。。
只能说你笨,还不承认

论坛徽章:
0
48 [报告]
发表于 2008-02-25 20:47 |只看该作者
原帖由 mike79 于 2008-2-25 10:56 发表

呵呵,体谅下LZ,他还只是个小P孩,以为找到了MS的bug当然会很兴奋


小兔崽子, 跟老子没大小, 我吐口唾沫能淹死你.

论坛徽章:
12
CU大牛徽章
日期:2013-09-18 15:20:4815-16赛季CBA联赛之同曦
日期:2016-02-01 20:28:25IT运维版块每日发帖之星
日期:2015-11-10 06:20:00操作系统版块每日发帖之星
日期:2015-10-28 06:20:002015亚冠之塔什干棉农
日期:2015-06-04 11:41:56丑牛
日期:2014-05-10 16:11:33技术图书徽章
日期:2013-09-23 13:25:58CU大牛徽章
日期:2013-09-18 15:21:17CU大牛徽章
日期:2013-09-18 15:21:12CU大牛徽章
日期:2013-09-18 15:21:06CU大牛徽章
日期:2013-09-18 15:20:58数据库技术版块每日发帖之星
日期:2016-02-08 06:20:00
47 [报告]
发表于 2008-02-25 10:56 |只看该作者
原帖由 nicozhou 于 2008-2-25 08:59 发表
QUOTE:
只要是在windows下面,用这玩意儿,都要这样做啊,几百年前的事情了,LZ现在才把它翻出来,有意思吗?
很多书上都有关于这个问题的提示的。

============= ...

呵呵,体谅下LZ,他还只是个小P孩,以为找到了MS的bug当然会很兴奋

论坛徽章:
0
46 [报告]
发表于 2008-02-25 10:37 |只看该作者
fwrite每次写完就是把文件指针指到最后,下次写的时候接着写啊,什么时候成bug了

论坛徽章:
0
45 [报告]
发表于 2008-02-25 08:59 |只看该作者

微软不是早就警告过开发者这个问题了吗?

QUOTE:
原帖由 tgbvc 于 2008-2-23 19:25 发表
这帮迂 !!!  标准是人定的, 难道就没有错误!  MS做的都正确么, MS放个屁对你们都是香的....
跟你们这帮迂争辩是在浪费时间.


===============================================
只要是在windows下面,用这玩意儿,都要这样做啊,几百年前的事情了,LZ现在才把它翻出来,有意思吗?
很多书上都有关于这个问题的提示的。

论坛徽章:
0
44 [报告]
发表于 2008-02-24 21:37 |只看该作者
你用两个线程来作文件数据交换,就清楚fread fwrite 的工作机制了,多看看接口描述也有帮助的
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP