Untitled
unknown
plain_text
9 months ago
3.5 kB
12
Indexable
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/resource.h>
#include <dirent.h>
// Função auxiliar para comparar dois ficheiros linha a linha
int comparar_ficheiros(const char *ficheiro1, const char *ficheiro2, int *linha_diferente) {
FILE *f1 = fopen(ficheiro1, "r");
FILE *f2 = fopen(ficheiro2, "r");
if (!f1 || !f2) {
if (f1) fclose(f1);
if (f2) fclose(f2);
return -1; // erro ao abrir
}
char linha1[1024], linha2[1024];
int linha = 1;
while (fgets(linha1, sizeof(linha1), f1) && fgets(linha2, sizeof(linha2), f2)) {
if (strcmp(linha1, linha2) != 0) {
*linha_diferente = linha;
fclose(f1);
fclose(f2);
return 0; // diferentes
}
linha++;
}
// Verificar se ambos chegaram ao fim
int eof1 = feof(f1);
int eof2 = feof(f2);
fclose(f1);
fclose(f2);
if (!eof1 || !eof2) {
*linha_diferente = linha;
return 0; // tamanhos diferentes
}
return 1; // iguais
}
// Função para medir o uso de memória
void mostrar_memoria_usada() {
struct rusage r_usage;
getrusage(RUSAGE_SELF, &r_usage);
printf("Memória utilizada: %ld KB\n", r_usage.ru_maxrss);
}
// Função para medir tempo de execução (exemplo simplificado)
double tempo_execucao(void (*funcao)(void)) {
struct timespec start, end;
clock_gettime(CLOCK_REALTIME, &start);
funcao(); // executa função
clock_gettime(CLOCK_REALTIME, &end);
return (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) / 1e9;
}
// Função principal
int main(int argc, char *argv[]) {
if (argc != 4) {
printf("Uso: %s <pasta-csv> <ficheiro-input> <pasta-resultados-esperados>\n", argv[0]);
return 1;
}
const char *pasta_csv = argv[1];
const char *ficheiro_input = argv[2];
const char *pasta_resultados_esperados = argv[3];
printf("=== Programa de Testes ===\n");
printf("Dataset: %s\nComandos: %s\nEsperados: %s\n\n", pasta_csv, ficheiro_input, pasta_resultados_esperados);
// Abrir o ficheiro input.txt e percorrer cada linha
FILE *input = fopen(ficheiro_input, "r");
if (!input) {
perror("Erro ao abrir o ficheiro de comandos");
return 1;
}
char linha[256];
int total = 0, corretos = 0;
while (fgets(linha, sizeof(linha), input)) {
total++;
int id_query;
sscanf(linha, "%d", &id_query);
char ficheiro_output_gerado[256];
char ficheiro_output_esperado[256];
snprintf(ficheiro_output_gerado, sizeof(ficheiro_output_gerado), "resultados/command%d_output.txt", id_query);
snprintf(ficheiro_output_esperado, sizeof(ficheiro_output_esperado), "%s/command%d_output.txt", pasta_resultados_esperados, id_query);
int linha_dif = -1;
int res = comparar_ficheiros(ficheiro_output_gerado, ficheiro_output_esperado, &linha_dif);
if (res == 1) {
printf("Query %d: OK ✅\n", id_query);
corretos++;
} else if (res == 0) {
printf("Query %d: ❌ diferença na linha %d\n", id_query, linha_dif);
} else {
printf("Query %d: ⚠️ erro ao abrir ficheiros\n", id_query);
}
}
fclose(input);
printf("\nResumo:\n");
printf("%d de %d queries corretas (%.2f%%)\n", corretos, total, 100.0 * corretos / total);
mostrar_memoria_usada();
printf("\n(Fim dos testes)\n");
return 0;
}
Editor is loading...
Leave a Comment