2 kakenhi kakenhi 于 2016.04.27 00:56 提问

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
kakenhi   2016.04.27 02: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个多小时。真是见鬼了。

caozhy
caozhy   Ds   Rxr 2016.04.27 01:00

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

kakenhi
kakenhi 请看我下面2楼
一年多之前 回复
kakenhi
kakenhi   2016.04.27 01:17

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

gzdrn
gzdrn 我也在做课程设计,我在这卡了2天了。。。帮大忙了
一年多之前 回复
kakenhi
kakenhi   2016.04.27 01:17

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!