忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 450 | 回复: 3

[C] 关于流缓冲区定位的问题.. [复制链接]

论坛徽章:
0
发表于 2017-11-10 19:57 |显示全部楼层
本帖最后由 pz239 于 2017-11-10 19:57 编辑

   /*打开文件用于写*/
    FILE *fp = fopen("file", "w");
   
    /*自定义流缓冲区buf*/
   char buf[10] = {0};

   /*全缓冲*/
    setvbuf(fp, buf, _IOFBF,  10);
   
    /*连续写入4个'x'*/
    for (int32_t i = 0; i < 4; i++)
      fputc('x', fp);
   
    /*此时buf内容为 'xxxx', 一切正常*/
    fputs(buf, stdout);
  
    /*定位到流的第3个字节处*/
    fseek(fp, 2, SEEK_SET);

    /*写入字符'a', 此时缓冲区buf中的内容应该为'xxax'*/
    fputc('a', fp);

    /*但输出后发现,其中内容居然是'axxx'  !!不知为何?*/
    fputs(buf, stdout);

    程序结束后输出文件内容发现,实际写入到文件的确实是'xxax',这和预期相符,只是不清楚为什么自定义缓冲区的内容和实际写入文件的内容不一致呢?
    是fseek对自定义缓冲区不起作用么?

    ps:环境为Linux,gcc编译,没加任何优化参数

论坛徽章:
14
射手座
日期:2014-11-29 19:22:49黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:252015年迎新春徽章
日期:2015-03-04 09:50:28
发表于 2017-11-10 20:24 |显示全部楼层
忘了SEEK_SET是几,你用0试试。

论坛徽章:
0
发表于 2017-11-10 21:17 |显示全部楼层
回复 2# yulihua49

结果是一样的,缓冲区里还是'axxx'

论坛徽章:
14
射手座
日期:2014-11-29 19:22:49黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:252015年迎新春徽章
日期:2015-03-04 09:50:28
发表于 2017-11-12 09:40 |显示全部楼层
本帖最后由 yulihua49 于 2017-11-12 09:45 编辑

哦,缓冲区你不要管,它是重复利用的。第一次从头开始用,第二次也是从头,每次都是从头用。
另外,你没有给尾0,fputs可能动作不正确。最好不要自己修改缓冲区,尤其是不要改小。系统的设置是最合理的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP