在MacOSX上fputs()的行为是不正常的

Jay*_*ark 2 c macos

假设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上,它完成得很好.

gil*_*lez 5

引用http://man7.org/linux/man-pages/man3/fopen.3.html:

请注意,ANSI C要求输出和输入之间的文件定位功能介入,除非输入操作遇到文件结尾.

如果你不这样做,你就会陷入"未定义的行为"领域,即任何事情都可能发生.所以,继续引用:

因此,在这样的流上进行写入和读取操作之间进行fseek(3)或fgetpos(3)操作是一种很好的做法.

您只是看到Apple决定如何做到这一点,这是他们的权利.