假设test.txt是这样的:
aaaaa
aaaaa
aaaaa
测试代码是这样的:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *f = fopen("test.txt", "r+");
char buf[100];
fgets(buf, 100, f);
fputs("bbb", f);
fclose(f);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当然,我的意图是结果文件可能是这样的:
aaaaa
bbbaa
aaaaa
但在MacOSX上,它是这样的:
aaaaa
aaaaa
aaaaa
bbb
fputs()不会返回任何错误,并且在fgets()之后放置ftell()时,它会完全指向6.
那是一个错误吗?在Linux上,它完成得很好.
引用http://man7.org/linux/man-pages/man3/fopen.3.html:
请注意,ANSI C要求输出和输入之间的文件定位功能介入,除非输入操作遇到文件结尾.
如果你不这样做,你就会陷入"未定义的行为"领域,即任何事情都可能发生.所以,继续引用:
因此,在这样的流上进行写入和读取操作之间进行fseek(3)或fgetpos(3)操作是一种很好的做法.
您只是看到Apple决定如何做到这一点,这是他们的权利.
| 归档时间: |
|
| 查看次数: |
59 次 |
| 最近记录: |