#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;
}