Use 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 -
Use as funções
feof
eferror
para testar a posição válida do fluxo de arquivos em C
![Use a função feof em C](/img/C/feature-image---feof-stdin-in-c.webp)
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