微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 fflush() 之后没有从 fgets() 获得预期的输出

如何解决在 fflush() 之后没有从 fgets() 获得预期的输出

这是 fflush() 之后的简单代码,我们没有得到预期的输出。 我们期待“Hello World file2”,但它显示了一些如下所述的随机垃圾值。

#include <stdio.h>

int main(void) {

  char output_reg[300],errstr[300];
  FILE *fd1,*fd2,*fd3,*fd4; 
  char *retno,*retseek;
  int len;

      fd4 = fopen("out2.log","w");
      fd3 = fopen("out2.log","r");

      fputs("Hello World file2!\n",fd4);


      fgets(output_reg,30,fd3);
      printf("FILE 2 b4  = output_reg : %s\n",output_reg);
  
      fflush(fd4);

      fgets(output_reg,fd3);
      printf("FILE 2 af  = output_reg : %s\n",output_reg);

}
$(function(){
  
  $(".info").click(function(){
    var left = $("img",this).offset().left + ($("img",this).width()/2) - ($(".tip",this).width()/2);
    $(".tip",this).toggle().css({"left":left});
    
  });
  
});

解决方法

fputs("Hello World file2!\n",fd4); 之后,没有任何内容写入文件,但仅写入内部缓冲区。因此 out2.log 文件仍然是空的。

fgets(output_reg,30,fd3) 然后尝试从失败的空文件中读取,但您没有检查。然后你无论如何都要打印 output_reg 的内容,因此是垃圾。

然后您调用 fflush(fd4),它实际上写入文件,因此第二个 fgets 工作正常。

把你的代码改成这个,看看会发生什么。

#include <stdio.h>
#include <stdlib.h>

int main(void) {

  char output_reg[300] = "mygarbage",errstr[300];
  FILE* fd1,* fd2,* fd3,* fd4;
  char* retno,* retseek;
  int len;

  fd4 = fopen("out2.log","w");
  if (fd4 == NULL)
  {
    printf("fopen(\"out2.log\",\"w\") failed.");
    exit(1);
  }

  fd3 = fopen("out2.log","r");
  if (fd3 == NULL)
  {
    printf("fopen(\"out2.log\",\"r\") failed.");
    exit(1);
  }

  fputs("Hello World file2!\n",fd4);

  if (fgets(output_reg,fd3) == NULL)
    printf("fgets returned NULL,feof is %d\n",feof(fd3));
  else
    printf("FILE 2 b4  = output_reg : %s\n",output_reg);

  fflush(fd4);

  if (fgets(output_reg,feof(fd3));
  else
    printf("FILE 2 af  = output_reg : %s\n",output_reg);
}

您会看到第一个 fgets 返回 NULL,这会将 文件结束 标志设置为 1。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。