Ler um ficheiro em C

Jinku Hu 12 outubro 2023
  1. Utilize fopen e fread funções para ler ficheiro de texto em C
  2. Utilize as funções fopen e getline para ler o ficheiro de texto em C
Ler um ficheiro em C

Este artigo irá introduzir múltiplos métodos sobre como ler um ficheiro de texto em C.

Utilize fopen e fread funções para ler ficheiro de texto em C

As funções fopen e fread fazem parte das instalações de entrada/saída da biblioteca padrão C.

O fopen é utilizado para abrir o ficheiro dado como um fluxo e dar ao programa a manivela para o manipular conforme necessário. São necessários dois parâmetros, o nome do ficheiro como string const char* e o modo em que se abre o ficheiro especificado com valores predefinidos (r, w, a, r+, w+, a+). Quando precisamos de ler um ficheiro, passamos r como o segundo parâmetro para abrir o ficheiro em modo só de leitura.

Por outro lado, a função fread é o actor principal na condução da operação de leitura a partir de um fluxo de ficheiro já aberto. É necessário um ponteiro para guardar em buffer onde os bytes lidos devem ser armazenados como o primeiro argumento. O segundo e terceiro argumentos especificam quantos itens a ler a partir do fluxo e que tamanho tem cada um deles. O último argumento é o ponteiro FILE* para o próprio fluxo de ficheiro aberto.

Note-se que também estamos a utilizar a função stat para recuperar o tamanho do ficheiro e ler todo o conteúdo numa única chamada fread. O tamanho do ficheiro é passado para a função malloc também para atribuir espaço suficiente para armazenar todo o conteúdo do ficheiro. No entanto, a alocação dinâmica de memória deve ser libertada pela função free e os ficheiros abertos devem ser fechados com fclose.

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

int main(void) {
  const char* filename = "input.txt";

  FILE* input_file = fopen(filename, "r");
  if (!input_file) exit(EXIT_FAILURE);

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

  char* file_contents = malloc(sb.st_size);
  fread(file_contents, sb.st_size, 1, input_file);

  printf("%s\n", file_contents);

  fclose(input_file);
  free(file_contents);

  exit(EXIT_SUCCESS);
}

Utilize as funções fopen e getline para ler o ficheiro de texto em C

Em alternativa, podemos saltar a recuperação do tamanho do ficheiro com a função stat e em vez disso iterar sobre cada linha do ficheiro até ao fim, utilizando a função getline. A função getline lê a entrada da string a partir do fluxo de ficheiro dado. Como o nome sugere, a função recupera todos os bytes até ser encontrado o carácter da nova linha.

A função getline tem três parâmetros, o primeiro dos quais armazena os bytes lidos. Pode ser declarado como char* e definido como NULL. Entretanto, se o segundo argumento for o endereço do inteiro 0, a getline atribui automaticamente memória dinâmica para o buffer, que deve ser libertada pelo utilizador, daí a chamada para a função free no final do programa.

Note-se que estes parâmetros podem ter valores diferentes se necessário, todos eles explicados nesta função manual. O terceiro parâmetro é o ponteiro FILE* do fluxo de ficheiros aberto.

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

int main(void) {
  const char* filename = "input.txt";

  FILE* input_file = fopen(filename, "r");
  if (!input_file) exit(EXIT_FAILURE);

  char* contents = NULL;
  size_t len = 0;
  while (getline(&contents, &len, input_file) != -1) {
    printf("%s", contents);
  }

  fclose(input_file);
  free(contents);

  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 File