AprenderC
← Todas las lecciones

Cómo se entrega un taller

Un programa de verdad no te habla: lee un archivo y escribe otro.

1Por qué

Todos tus programas hasta ahora escriben en la pantalla. Los talleres no funcionan así: te dan un archivo de entrada, y tienes que dejar el resultado en otro archivo. Nadie mira la pantalla — se compara tu archivo con el esperado, y con eso se corrige.

Eso cambia tres cosas, y las tres aparecen en el mismo esqueleto.

Los nombres de los archivos llegan por fuera. Cuando se ejecuta ./programa entrada.txt salida.txt, esas dos palabras llegan a main a través de sus parámetros: argc dice cuántas hay y argv es el arreglo con ellas. argv[0] es el nombre del programa, así que los tuyos empiezan en argv[1].

Se lee con fscanf y se escribe con fprintf, que son scanf y printf con un archivo delante. Lo demás es igual.

Y hay que comprobar que te dieron lo que esperabas. Si faltan argumentos, el programa avisa y termina con un número distinto de cero, que es como un programa dice «esto salió mal». Ese aviso va a stderr y no al archivo de salida: son dos sitios distintos a propósito, para que un error no ensucie el resultado.

Este esqueleto no cambia de taller a taller. Lo que cambia es lo del medio.

2Míralo andar

Este programa funciona. Léelo, y después ejecútalo sin cambiar nada.

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
if (argc != 3)
{
fprintf(stderr, "Uso: programa entrada salida\n");
return 1;
}
FILE *entrada = fopen(argv[1], "r");
FILE *salida = fopen(argv[2], "w");
int cuantos;
fscanf(entrada, "%d", &cuantos);
for (int i = 0; i < cuantos; i++)
{
int n;
fscanf(entrada, "%d", &n);
fprintf(salida, "%d\n", n * 2);
}
fclose(entrada);
fclose(salida);
return 0;
}

3Ahora tú

El programa lee cuántos números vienen y después los números. Haz que escriba el CUADRADO de cada uno en el archivo de salida

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
if (argc != 3)
{
fprintf(stderr, "Uso: programa entrada salida\n");
return 1;
}
FILE *entrada = fopen(argv[1], "r");
FILE *salida = fopen(argv[2], "w");
int cuantos;
fscanf(entrada, "%d", &cuantos);
for (int i = 0; i < cuantos; i++)
{
int n;
fscanf(entrada, "%d", &n);
}
fclose(entrada);
fclose(salida);
return 0;
}

↖︎ Tu línea va aquí. Ojo: no va a la pantalla, va al archivo de salida.

Ejecutar

Lo que dice tu programa

↖︎ Escribe tu parte y dale a Ejecutar

Qué pasó

Aquí te aviso si tu programa hace algo raro.

    Más adelante vas a ver dónde guarda el computador cada cosa. Todavía no hace falta.