问题描述
- 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。
解决方案四:
我在两台机器上测试都是这样,如果有疑问可以亲自编译一下试试。
时间: 2024-08-29 02:58:13