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。

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

好了终于找到原因了。参见资料: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个多小时。真是见鬼了。

rb+需要文件存在,而且要有权限才能写入。

回1楼:aaa.txt文件存在,可以用rb+的方式打开,有权限写入。我试过打开以后从头开始写就没问题,不管多少数据都可以写进去。但像这样读了20个字节,文件指针刚好指向末尾的时候,fwrite就会返回0。

我在两台机器上测试都是这样,如果有疑问可以亲自编译一下试试。