-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmain.c
160 lines (131 loc) · 4.22 KB
/
main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
// Algoritmos e Estruturas de Dados 2
// Implementação de uma árvore B
//
// Guilherme Lima Blatt 9771470
// Lucas Akira Morishita 9771320
// Thiago Músico 9771567
// Tiago Toledo Junior 9771309
#include "arquivo.h"
int main (void){
int byteOffset = 0, RRNtotal = 0;
int auxID; char auxTitulo[30], auxGenero[20];
int inputMenu, outLoop = 0;
int pos, encontrado = 0;
Arvore *A = (Arvore*) malloc(sizeof(Arvore));
Pagina *P = malloc(sizeof(Pagina));
Fila F;
CriaFila(&F);
// Abre o arquivo de dados e o cria se ele não existir
// Permite a leitura no arquivo todo e a escrita no fim
FILE *dados = fopen("dados.dat", "a+b");
FILE *indice = fopen("arvore.idx", "r");
FILE *log = fopen("log_TToledo.txt", "a");
//Coloca o tempo e a data no arquivo de log
time_t tempoAtual;
time(&tempoAtual);
fprintf(log, "--------------------- %s", ctime(&tempoAtual));
// Verifica se algum deles nao foi aberto
if (!dados || !log) {
printf("Memoria Heap insuficente!\n");
return -1;
}
while(!outLoop){
printf("\n(1 - Criar Índice) \n(2 - Inserir Música) \n(3 - Pesquisar Música) \n(5 - Mostrar Árvore) \n(6 - Sair e Salvar)\n");
printf("Observacao: E necessario sair do programa (funcionalidade 6) para atualizar o arquivo de log\n");
printf("\nInsira a funcionalidade desejada: ");
fscanf(stdin, "%d", &inputMenu);
// Switch responsável por controlar as opções do menu
switch(inputMenu){
case 1:
criarIndice(A, dados, log, &indice, &byteOffset, &RRNtotal);
break;
case 2:
if (indice == NULL) {
// Indice nao foi criado
printf("Erro! Arquivo de indice nao criado! Retornando ao menu...\n");
break;
}
fclose(indice);
indice = fopen("arvore.idx", "r+");
if (!indice) {
printf("Erro\n");
return -1;
}
printf("\n Insira o ID da musica: ");
fscanf(stdin, "%d", &auxID);
getchar();
printf("\n Insira o Titulo da Musica: ");
fgets(auxTitulo, 30, stdin);
auxTitulo[strlen(auxTitulo) - 1] = '\0'; // Impede a leitura do \n no input
// Verificando a validade dos caracteres do título
if(!caractereValido(auxTitulo)){
printf("\nTitulo Invalido! Caraceteres especiais nao sao aceitos\n\n");
// Dá um reset nos inputs em caso de entrada inválida
auxID = -1;
strcpy(auxTitulo, "\0");
break;
}
printf("\n Insira o Genero da Musica: ");
fgets(auxGenero, 20, stdin);
auxGenero[strlen(auxGenero) - 1] = '\0'; // Impede a leitura do \n no input
// Verificando a validade dos caraceteres do gênero
if(!caractereValido(auxGenero)){
printf("\nGenero Invalido! Caraceteres especiais nao sao aceitos\n\n");
// Dá um reset nos inputs em caso de entrada inválida
auxID = -1;
strcpy(auxTitulo, "\0"); strcpy(auxGenero, "\0");
break;
}
inserirMusica(auxID, auxTitulo, auxGenero, dados, log, &indice, &byteOffset, &RRNtotal, A);
break;
case 3:
printf("\nInsira o ID da musica: ");
fscanf(stdin, "%d", &auxID);
getchar();
fprintf(log, "Execucao de operacao de PESQUISA de <%d>.\n", auxID);
byteOffset = pesquisarArvore(P, 0, auxID, &pos, &encontrado, indice);
if(encontrado){
pesquisaDados(byteOffset, auxTitulo, auxGenero, dados);
fprintf(log, "Chave <%d> encontrada, Offset <%d>, Titulo: <%s>, Genero: <%s>\n", auxID, byteOffset, auxTitulo, auxGenero);
}
else{
fprintf(log, "Chave nao <%d> encontrada\n", auxID);
printf("\nNao existe chave com id <%d>\n", auxID);
}
break;
case 5:
EntraFila((&F), 0);
fprintf(log, "Execucao de operacao para mostrar a arvore-B gerada: \n");
printBTree(P, &F, indice, log);
break;
case 6:
outLoop = 1;
break;
default:
printf("\n Entrada Invalida!\n");
break;
}
}
// Finaliza os ponteiros para FILE, sempre verificando se realmente nao sao nulos
if (dados) {
fclose(dados);
dados = NULL;
}
if (indice) {
fclose(indice);
indice = NULL;
}
if (log) {
fclose(log);
log = NULL;
}
if (indice) {
fclose(indice);
indice = NULL;
}
if (A) {
free(A);
A = NULL;
}
return 0;
}