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