Usar redirección de archivos en C

Jinku Hu 12 octubre 2023
Usar redirección de archivos en C

Este artículo explicará varios métodos de cómo utilizar la redirección de archivos en C.

Utilice el operador < para redirigir la entrada estándar

La redirección de archivos se conoce generalmente como redirección de E/S en sistemas basados ​​en UNIX, lo que permite al usuario redefinir de dónde viene la entrada estándar o de dónde va la salida estándar. El operador < se utiliza para cambiar de dónde proviene la entrada estándar. Este método puede ser útil para tomar la entrada del usuario del contenido del archivo y almacenarla en el búfer del programa. En este caso, utilizamos la función fgets para leer el contenido del archivo hasta que se encuentra un carácter de nueva línea. Cuando se lee un carácter de nueva línea, también se almacena en el búfer dado, y la cadena que termina el byte nulo se almacena después de eso.

#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 muestra:

./program < input.txt

Producción :

The first line from the input.txt file

En el código de muestra anterior, asignamos un búfer con un valor codificado. Aún así, el archivo de entrada proporcionado por el usuario puede necesitar más memoria para almacenar y deberíamos implementar un método adaptativo para adaptarse al escenario. Para esto, asignamos memoria dinámica usando malloc y le pasamos el tamaño total del archivo como el número máximo que se puede necesitar para almacenar la primera línea en el archivo. Este método puede desperdiciar demasiada memoria si el archivo dado es demasiado grande y la primera línea es simplemente corta. Sin embargo, garantiza que el código podrá leerse en la línea más larga siempre que malloc no falle y la memoria del sistema no se agote.

Observe que recuperamos un tamaño de archivo usando la llamada al sistema stat, pero necesita el nombre de ruta del archivo de entrada, que no se puede recuperar si no se pasa explícitamente como un argumento de línea de comandos. Sin embargo, tenga en cuenta que cada llamada a función debe ser verificada para un retorno exitoso para garantizar que fgets no intente escribir en la región de memoria no inicializada y cause que el programa termine con falla.

#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 muestra:

./program input.txt < input.txt

Producción :

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

Artículo relacionado - C File