为什么在以rb+模式打开的文件中背对背地执行读写操作时,在c语言中表现不像预期的那样



以rb+模式成功打开文件使用两个输出写入两个字符串。使用fseek将文件ptr从文件开始移动到3个字节。使用fgets成功读出四个字符。现在,当我尝试使用fputs编写第三个字符串时,我无法这样做。为什么会这样

#include<stdio.h>
int main(int argc, char *argv[])
{
FILE *fp;
if( argc != 2)
{
printf("NOT ENOUGH ARGUMENTS");
return 1;
}
fp = fopen(argv[1], "rb+");
if(fp == NULL)
{
fp = fopen(argv[1], "wb+");
if( fp == NULL )
{
printf("nUNABLE TO CREATE FILE");
return 2;
}
else
{
printf("nFILE CREATED SUCCESSFULLY");
}
}
else
{
printf("nFILE OPENED SUCCESSFULLY");
}
char str[100];
fseek(fp, 0, SEEK_END);
fputs("123456789", fp);
fputs("ABCDEFGH", fp);
fseek(fp, 3, SEEK_SET);
//fputs("hello", fp);
fgets(str, 4, fp);
printf("n%sn",str);
fputs("why", fp);
fseek(fp, 0, SEEK_END);
printf("nTHE SIZE OF FILE IS : %ld", ftell(fp));
fclose(fp);
return 0;
}

当添加注释掉的代码时,它按预期工作

stdio函数支持缓冲数据,而不是为每个操作调用操作系统,这使得支持混合读写变得更加复杂。您可能会遇到这样的情况:缓冲区中的一些数据与磁盘上的数据匹配,而另一些则不匹配。实现者有可能对库进行编码以使其工作,但这会增加复杂性和成本,因此C标准的设计者选择不需要它。而且,现有的实现可能不支持它。所以标准包含了程序需要查找的要求,这通常会刷新这些缓冲区,然后问题就不会出现了。- - - - - -内特·

最新更新