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
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