Ler o arquivo linha por linha usando fscanf em C

Jinku Hu 12 outubro 2023
  1. Use a função fscanf para ler o arquivo linha por linha em C
  2. Use a função fscanf para ler o arquivo palavra por palavra em C
Ler o arquivo linha por linha usando fscanf em C

Este artigo irá explicar vários métodos de como ler um arquivo linha por linha usando fscanf em C.

Use a função fscanf para ler o arquivo linha por linha em C

A função fscanf faz parte dos utilitários de entrada formatados da biblioteca padrão C. Múltiplas funções são fornecidas para diferentes fontes de entrada como scanf para ler de stdin, sscanf para ler a seqüência de caracteres e fscanf para ler o fluxo de ponteiro FILE. O último pode ser usado para ler o arquivo regular linha por linha e armazená-lo no buffer.

fscanf tem especificação de formatação semelhante aos especificadores printf, e todos eles estão listados em detalhes completos nesta [página]. No exemplo a seguir, abrimos o arquivo de entrada de amostra usando a chamada de função fopen e alocamos memória do tamanho total do arquivo para armazenar o fluxo de leitura nele. "%[^\n] " formato de string é especificado para ler o fluxo de arquivos até que o novo caractere de linha seja encontrado. fscanf retorna EOF quando o fim da entrada é alcançado; assim, iteramos com o loop while e imprimimos cada linha uma por uma.

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

const char *filename = "input.txt";

int main(int argc, char *argv[]) {
  FILE *in_file = fopen(filename, "r");

  struct stat sb;
  stat(filename, &sb);

  char *file_contents = malloc(sb.st_size);

  while (fscanf(in_file, "%[^\n] ", file_contents) != EOF) {
    printf("> %s\n", file_contents);
  }

  fclose(in_file);
  exit(EXIT_SUCCESS);
}

Resultado:

> Temporary string to be written to file

Observe que, embora o código anterior provavelmente seja executado com êxito se o nome do arquivo de entrada existir no sistema de arquivos, várias chamadas de função podem falhar e encerrar o programa de forma anormal. O próximo exemplo de código é a versão modificada, onde as rotinas de verificação de erros são implementadas.

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

const char *filename = "input.txt";

int main(int argc, char *argv[]) {
  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);

  while (fscanf(in_file, "%[^\n] ", file_contents) != EOF) {
    printf("> %s\n", file_contents);
  }

  fclose(in_file);
  exit(EXIT_SUCCESS);
}

Resultado:

> Temporary string to be written to file

Use a função fscanf para ler o arquivo palavra por palavra em C

Outro caso útil para utilizar a função fscanf é percorrer o arquivo e analisar cada token separado por espaço. Observe que a única coisa a ser alterada do exemplo anterior é o especificador de formato para "%[^\n ] ". A chamada de sistema stat é para recuperar o tamanho do arquivo, e o valor é usado para passar como o argumento malloc para alocar o buffer. Este método pode ser um desperdício para alguns cenários, mas garante que mesmo os maiores arquivos de uma única linha possam ser armazenados no buffer.

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

const char *filename = "input.txt";

int main(int argc, char *argv[]) {
  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);

  while (fscanf(in_file, "%[^\n ] ", file_contents) != EOF) {
    printf("> %s\n", file_contents);
  }

  fclose(in_file);
  exit(EXIT_SUCCESS);
}

Resultado:

> Temporary
> string
> to
> be
> written
> to
> file
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