Use a função feof em C

Jinku Hu 12 outubro 2023
  1. Use a função feof para verificar o indicador de fim de arquivo no fluxo de arquivos em C
  2. Use as funções feof e ferror para testar a posição válida do fluxo de arquivos em C
Use a função feof em C

Este artigo irá explicar vários métodos de como usar a função feof em C.

Use a função feof para verificar o indicador de fim de arquivo no fluxo de arquivos em C

A função feof é parte da biblioteca de entrada / saída padrão C, definida no cabeçalho <stdio.h>. A função feof verifica o indicador de fim de arquivo no fluxo de arquivo fornecido e retorna um inteiro diferente de zero se EOF estiver definido. Leva o ponteiro FILE como único argumento.

No exemplo a seguir, demonstramos quando o arquivo é lido linha por linha usando a função getline, que é chamada até que feof retorne zero, implicando que o fluxo de arquivo não atingiu o EOF. Observe que verificamos o valor de retorno da função getline em uma instrução condicional, e somente se for bem-sucedido chamamos printf para gerar a linha lida.

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

const char* filename = "input.txt";

int main(void) {
  FILE* in_file = fopen(filename, "r");
  if (!in_file) {
    perror("fopen");
    exit(EXIT_FAILURE);
  }

  struct stat sb;
  if (stat(filename, &sb) == -1) {
    perror("stat");
    exit(EXIT_FAILURE);
  }

  char* contents = NULL;
  size_t len = 0;

  while (!feof(in_file)) {
    if (getline(&contents, &len, in_file) != -1) {
      printf("%s", contents);
    }
  }

  fclose(in_file);
  exit(EXIT_SUCCESS);
}

Use as funções feof e ferror para testar a posição válida do fluxo de arquivos em C

Alternativamente, feof pode ser utilizado para testar a posição do fluxo do arquivo antes de lermos o conteúdo do arquivo. Neste caso, estamos lendo o arquivo usando a chamada fread, que pega o tamanho do arquivo recuperado com a chamada de função stat. Observe que o buffer para armazenar os bytes lidos é alocado no heap usando a função malloc. Além disso, incluímos a função ferror na declaração condicional para testar o estado de erro no fluxo de arquivo junto com o indicador EOF.

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

const char* filename = "input.txt";

int main(void) {
  FILE* in_file = fopen(filename, "r");
  if (!in_file) {
    perror("fopen");
    exit(EXIT_FAILURE);
  }

  struct stat sb;
  if (stat(filename, &sb) == -1) {
    perror("stat");
    exit(EXIT_FAILURE);
  }

  char* file_contents = malloc(sb.st_size);
  if (!feof(in_file) && !ferror(in_file))
    fread(file_contents, 1, sb.st_size, in_file);
  printf("read data: %s\n", file_contents);

  free(file_contents);

  fclose(in_file);
  exit(EXIT_SUCCESS);
}

ferror também faz parte da biblioteca de E/S e pode ser chamado no objeto de ponteiro FILE. Ele retorna um indicador diferente de zero se o bit de erro for definido no fluxo de arquivo. Observe que todos os três exemplos imprimem o conteúdo do arquivo especificado pela variável filename. No código de amostra anterior, exibimos o conteúdo armazenado usando a função printf, mas o método mais sujeito a erros seria a chamada fwrite, que pode imprimir o número dado de bytes para o fluxo FILE especificado pelo quarto argumento.

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

const char* filename = "input.txt";

int main(void) {
  FILE* in_file = fopen(filename, "r");
  if (!in_file) {
    perror("fopen");
    exit(EXIT_FAILURE);
  }

  struct stat sb;
  if (stat(filename, &sb) == -1) {
    perror("stat");
    exit(EXIT_FAILURE);
  }

  char* file_contents = malloc(sb.st_size);
  if (!feof(in_file) && !ferror(in_file))
    fread(file_contents, 1, sb.st_size, in_file);
  fwrite(file_contents, 1, sb.st_size, stdout);

  free(file_contents);

  fclose(in_file);
  exit(EXIT_SUCCESS);
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artigo relacionado - C IO