Use a função feof em C
- 
          
            Use a função 
feofpara verificar o indicador de fim de arquivo no fluxo de arquivos em C - 
          
            Use as funções 
feofeferrorpara testar a posição válida do fluxo de arquivos 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);
}
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