#include <stdio.h>
#include <stdlib.h>

#define NOME_MAX 25             
#define NOMEMAT_MAX (NOME_MAX+1) /* 25 para o nome, 1 para o '\0'. */
#define NUMERO_MAX 9999
#define NOTA_MAX 20

int main(int argc, char *argv[])

{
    int numero, teste, trabalho, c, ninsercao;
    char nome[NOMEMAT_MAX];
    FILE *saida;
    
    if(argc != 2)
    {
        fprintf(stderr, "Tem de passar um argumento!\n");
        return EXIT_FAILURE;
    }
    if((saida = fopen(argv[1], "w")) == 0)
    {
        fprintf(stderr, "Erro abrindo o ficheiro \"%s\".\n", argv[1]);
        return EXIT_FAILURE;
    }

    ninsercao = 0;
    while(1)                    /* repetir para sempre. */
    {
        /* Le numero: */
        printf("Numero de aluno: ");
        if(scanf("%d", &numero) != 1 || numero < 0 || numero > NUMERO_MAX)
            break;

        /* Le nome: */
        printf("Nome do aluno (ate' 25 caracteres): ");
        /* Ignora todos os espacos em branco (espacos, fins-de-linha,
           tabuladores, etc., ate' ao primeiro nao branco: */
        scanf(" ");
        if(fgets(nome, NOMEMAT_MAX, stdin) == NULL)
            break;
        if(nome[strlen(nome)-1] != '\n')
        {
            /* Se o espaco esgotou sem que a linha tenha sido totalmente
               lida, ignora texto subsequente: */
            printf("Ignorando: ");
            /* Ha' caracteres a ignorar: */
            while((c = getchar()) != EOF && c != '\n')
                putchar(c);
            putchar('\n');
        }
        else
           nome[strlen(nome)-1] = '\0';
 
        printf("Nota do teste: ");
        if(scanf("%d", &teste) != 1 || teste < 0 || teste > NOTA_MAX)
            break;

        printf("Nota do trabalho: ");
        if(scanf("%d", &trabalho) != 1 || trabalho < 0 || trabalho > NOTA_MAX)
            break;
        
        /* Tudo lido, escrever no ficheiro: */
        if(fprintf(saida, "%4d %-*.*s %2d %2d\n", 
                   numero, NOME_MAX, NOME_MAX, nome, teste, trabalho) < 0)
        {
            fprintf(stderr, "Erro escrevendo no ficheiro de saida.\n");
            return EXIT_FAILURE;
        }
        
        ninsercao++;
    }
    

    printf("Inseriu %d alunos.\n", ninsercao);

    fclose(saida);

    return EXIT_SUCCESS;
}