не получение ожидаемого результата от fgets() после fflush()

Вот простой код: после fflush() мы не получаем ожидаемого результата. Мы ожидаем Hello World file2, но он показывает какое-то случайное значение мусора, как указано ниже.

FILE 2 b4  = output_reg : P\ufffd\ufffdr\ufffd
FILE 2 af  = output_reg : P\ufffd\ufffdr\ufffd
#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, 30, fd3);
      printf("FILE 2 af  = output_reg : %s\n",output_reg);

}

person Arvind Kumar Soni    schedule 04.03.2021    source источник
comment
Первое, что нужно сделать: проверить, не работает ли fopen, и действовать соответствующим образом.   -  person Jabberwocky    schedule 04.03.2021


Ответы (1)


После 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, 30, 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, 30, fd3) == NULL)
    printf("fgets returned NULL, feof is %d\n", feof(fd3));
  else
    printf("FILE 2 af  = output_reg : %s\n", output_reg);
}

Вы увидите, что первый fgets возвращает NULL и что это устанавливает флаг конец файла в 1.

person Jabberwocky    schedule 04.03.2021
comment
На самом деле я только что понял, что неправильно понял ваш вопрос, и поэтому мой ответ может не применяться. Но в любом случае запустите код в ответе и сообщите нам, что на выходе. - person Jabberwocky; 04.03.2021
comment
ниже вывод. fgets вернул NULL, feof равен 1 fgets вернул NULL, feof равен 1 - person Arvind Kumar Soni; 04.03.2021
comment
Отредактируйте свой вопрос и поместите всю необходимую информацию здесь. Вы не можете правильно форматировать комментарии для многострочного контента - person Jabberwocky; 04.03.2021