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