#include #include #define MAX_NOME 31 typedef struct sAluno { int nusp; char nome[MAX_NOME]; float media; } tAluno; int main(int argc, char *argv[]) { char operacao; FILE *arq; tAluno aluno; tAluno *alunos; int i, num_alunos; /* Sobre os parâmetros da função main: argc: indica a quantidade de argumentos que foram passados na chamada do programa, incluindo o nome do programa. argv: é um vetor de strings que contém os argumentos passados na linha de comando, incluindo o nome do programa. argv[0] é o nome do programa */ if (argc != 2) { printf("Uso: %s \n", argv[0]); puts("onde é uma das seguintes opções"); puts("1 - Cadastrar registros de alunos"); puts("2 - Listar registros de todos os alunos"); puts("3 - Mostrar um registro de aluno"); return 0; } operacao = argv[1][0]; switch(operacao) { case '1': puts("*** INCLUSÃO DE REGISTROS DE ALUNOS ***"); /* Abre um arquivo binário para escrita, mas preserva o seu conteúdo atual caso ele já exista. As novas escritas são feitas no final do arquivo. */ arq = fopen("alunos.bin", "ab"); if (!arq) { puts("Não foi possível abrir o arquivo para escrita."); return 0; } printf("Digite a quantidade de registros que será incluída: "); scanf("%d", &num_alunos); /* Aloca dinamicamente o espaço para o vetor de registros dos novos alunos */ alunos = (tAluno *) malloc(sizeof(tAluno)*num_alunos); /* Lê os dados dos registros dos novos alunos */ for (i = 0; i < num_alunos; i++) { printf("Dados do %dº novo aluno: \n", i+1); printf("NUSP: "); scanf("%d", &(alunos[i].nusp)); printf("Nome: "); scanf(" %[^\n]", alunos[i].nome); printf("Média: "); scanf("%f", &(alunos[i].media)); } /* Grava os registros dos novos alunos no arquivo */ fwrite(alunos, sizeof(tAluno), num_alunos, arq); fclose(arq); free(alunos); break; case '2': puts("*** LISTAGEM DE REGISTROS DE ALUNOS ***"); /* Abre o arquivo binário para leitura */ arq = fopen("alunos.bin", "rb"); if (!arq) { puts("Não foi possível abrir o arquivo para leitura."); return 0; } /* O laço abaixo lê do arquivo um registro de aluno por vez. A função fread devolve a quantidade de itens (não bytes!) lidos. Portanto, o laço abaixo é executado enquanto a a fread consegue ler um novo registro do arquivo.*/ i = 1; while (fread(&aluno, sizeof(tAluno), 1, arq) == 1) { printf("Registro %d | NUSP: %d, Nome: %s, Média: %f\n", i, aluno.nusp, aluno.nome, aluno.media); i++; } fclose(arq); break; case '3': puts("*** EXIBIÇÃO DE REGISTRO DE ALUNO ***"); /* Abre o arquivo binário para leitura */ arq = fopen("alunos.bin", "rb"); if (!arq) { puts("Não foi possível abrir o arquivo para leitura."); return 0; } printf("Digite o número do registro a ser exibido: "); scanf("%d", &i); /* Coloca o indicador de posição no arquivo no início do i-ésimo registro */ fseek(arq, (i-1)*sizeof(tAluno), SEEK_SET); /* Lê do arquivo um registro de aluno */ if (fread(&aluno, sizeof(tAluno), 1, arq) == 1) printf("NUSP: %d, Nome: %s, Média: %f\n", aluno.nusp, aluno.nome, aluno.media); else puts("Não foi possível acessar o registro indicado."); fclose(arq); break; default: printf("Operação escolhida (%c) é inválida.\n", operacao); } return 0; }