Use o redirecionamento de arquivo em C

Jinku Hu 12 outubro 2023
Use o redirecionamento de arquivo em C

Este artigo irá explicar vários métodos de como usar o redirecionamento de arquivo em C.

Use o operador < para redirecionar a entrada padrão

O redirecionamento de arquivo é geralmente conhecido como redirecionamento I/O em sistemas baseados em UNIX, que permite ao usuário redefinir de onde vem a entrada padrão ou a saída padrão. O operador < é usado para alterar de onde vem a entrada padrão. Este método pode ser útil para obter a entrada do usuário a partir do conteúdo do arquivo e armazená-la no buffer do programa. Nesse caso, utilizamos a função fgets para ler o conteúdo do arquivo até que um caractere de nova linha seja encontrado. Quando um novo caractere de linha é lido, ele também é armazenado no buffer fornecido, e a string que termina o byte nulo é armazenada depois disso.

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

#define SIZE 1000

int main(int argc, char *argv[]) {
  char buf[SIZE];
  printf("Write input text: ");
  fgets(buf, SIZE, stdin);
  printf("%s\n", buf);

  exit(EXIT_SUCCESS);
}

Comando de amostra:

./program < input.txt

Resultado:

The first line from the input.txt file

No código de amostra anterior, alocamos um buffer com um valor codificado permanentemente. Ainda assim, o arquivo de entrada fornecido pelo usuário pode precisar de mais memória para armazenar e devemos implementar um método adaptativo para se adequar ao cenário. Para isso, alocamos a memória dinâmica usando malloc e passamos o tamanho total do arquivo como o número máximo que pode ser necessário para armazenar a primeira linha do arquivo. Este método pode desperdiçar muita memória se o arquivo fornecido for muito grande e a primeira linha for simplesmente curta. No entanto, isso garante que o código será capaz de ler na linha mais longa, desde que malloc não falhe e a memória do sistema não se esgote.

Observe que recuperamos um tamanho de arquivo usando a chamada de sistema stat, mas ele precisa do nome do caminho do arquivo de entrada, que não pode ser recuperado se não for explicitamente passado como um argumento de linha de comando. Lembre-se, porém, de que cada chamada de função precisa ser verificada para um retorno bem-sucedido para garantir que fgets não tente gravar na região de memória não inicializada e fazer com que o programa seja encerrado com falha.

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

int main(int argc, char *argv[]) {
  char *buffer = NULL;
  const char *filename = NULL;
  struct stat sb;

  if (argc != 2) {
    printf("Usage: ./program filename < filename\n");
    exit(EXIT_FAILURE);
  }

  filename = argv[1];

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

  buffer = malloc(sb.st_size);
  if (!buffer) {
    perror("malloc");
    exit(EXIT_FAILURE);
  }

  printf("Write input text: ");
  if (fgets(buffer, sb.st_size, stdin) == NULL) {
    perror("fgets");
    exit(EXIT_FAILURE);
  }
  printf("%s\n", buffer);

  exit(EXIT_SUCCESS);
}

Comando de amostra:

./program input.txt < input.txt

Resultado:

The first line from the input.txt 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