kakenhi 2016-04-26 16:56 采纳率: 100%
浏览 2734
已采纳

C语言标准库fwrite失败,代码已给出,求帮助。

代码:


#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

void main()
{
    FILE* fp = fopen("aaa.txt", "rb+");

    if (fp == NULL) {
        return;
    }

    if (_fseeki64(fp, 0, SEEK_END) != 0) {
        return;
    }

    long long size = _ftelli64(fp);

    if (size < 0) {
        return;
    }

    if (_fseeki64(fp, 0, SEEK_SET) != 0) {
        return;
    }

    char buf[1024];

    if (fread(buf, 20, 1, fp) != 1) {
        return;
    }

    if (fwrite("test", 5, 1, fp) != 1) {
        return;
    }

    fclose(fp);
}

aaa.txt的内容(刚好20个字节):

aaaaaaaaaaaaaaaaaaaa

vc2010和vc2015结果都一样,在fwrite那里出错。期望fwrite返回1,实际返回0。errno为0。

实在想不出原因,请教一下大家。多谢帮忙。

  • 写回答

4条回答 默认 最新

  • kakenhi 2016-04-26 18:12
    关注

    好了终于找到原因了。参见资料:http://stackoverflow.com/questions/23843587/fwrite-doesnt-work-directly-after-fread
    fread之后不能直接用fwrite,反过来也一样。必须先调用一次fseek才行,而且要注意fseek的_Origin这个参数要是SEEK_SET或者SEEK_END,不能用SEEK_CUR。
    这么牛逼的设定,C标准库的文档中居然没有提到半个字,出错了得到的errno还是0。害我调了2个多小时。真是见鬼了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示