-
Notifications
You must be signed in to change notification settings - Fork 1
/
function_database.cpp
170 lines (128 loc) · 5.13 KB
/
function_database.cpp
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
161
162
163
164
165
166
167
168
169
170
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <cstdio>
#include <vector>
#include <filesystem>
#ifndef FUNCTION_DATABASE_H
#define FUNCTION_DATABASE_H
using namespace std;
namespace fs = filesystem;
struct Usuario {
// struct para armazenar os dados do usuário
string nomeCompleto, email, password, pergunta, resposta;
int pontos;
};
struct Perguntas {
// struct para armazenar os dados de perguntas
string tema, pergunta, respostaA, respostaB, respostaC, respostaD, respostaCorreta;
};
string path(string nomeArquivo) {
//Recebe um nome de arquivo que está na pasta assets
fs::path caminhoAbsoluto = fs::current_path() / "assets" / nomeArquivo;
fs::path caminhoRelativo = fs::relative(caminhoAbsoluto);
#ifdef _WIN32
return caminhoAbsoluto.string();
#elif defined __unix__
return caminhoRelativo;
#endif
}
vector<Perguntas> databasePerguntas (string nomeArquivo) {
// Recebe path e retorna um vector com as structs
Perguntas questao; // instancia da struct
vector<Perguntas> questoes; //Recebe as structs
string _respostaCorreta; // string para receber resposta sem espaço
ifstream arquivo(path(nomeArquivo)); // recebe de acordo com tema e dificuldade escolhida o path do arquivo de perguntas
if (arquivo.is_open()){
string linha;
while (getline(arquivo, linha)) {
istringstream iss(linha);
string dado;
vector<string> dados;
while (getline(iss, dado, ',')) {
dados.push_back(dado); //A cada volta no loop dentro da linha recebe o valor separado por vírgula
}
questao.tema = dados[0];
questao.pergunta = dados[1];
questao.respostaA = dados[2];
questao.respostaB = dados[3];
questao.respostaC = dados[4];
questao.respostaD = dados[5];
//Lidar com espaços em brancos gerados no getline
_respostaCorreta.clear();
for (size_t i = 0; i < (dados[6].size() - 1) ; i++) {
_respostaCorreta.push_back(dados[6][i]);
}
questao.respostaCorreta = _respostaCorreta;
questoes.push_back(questao);
}
arquivo.close();
} else {
cout << "Falha ao abrir o arquivo." << endl;
}
return questoes;
}
vector<Usuario> databaseUsuarios () {
// Recebe path e retorna um vector com as structs
Usuario usuario; // instancia da struct
vector<Usuario> usuarios; //Recebe as structs
ifstream arquivo(path("database.txt"));
if (arquivo.is_open()){
string linha;
while (getline(arquivo, linha)) {
istringstream iss(linha);
string dado;
vector<string> dados;
while (getline(iss, dado, ',')) {
dados.push_back(dado); //A cada volta no loop dentro da linha recebe o valor separado por vírgula
}
usuario.nomeCompleto = dados[0];
usuario.email = dados[1];
usuario.password = dados[2];
usuario.pergunta = dados[3];
usuario.resposta = dados[4];
usuario.pontos = stoi(dados[5]);
usuarios.push_back(usuario);
}
arquivo.close();
} else {
cout << "Falha ao abrir o arquivo." << endl;
}
return usuarios;
}
void eliminarDados(string userEmail) {
// Recebe argumentos para eliminar linha do arquivo
string _nomeArquivo = "assets/database.txt";
ofstream arquivoTemporario("temp.txt");
for(const auto& usuario : databaseUsuarios()) {
if (userEmail != usuario.email){
arquivoTemporario << usuario.nomeCompleto << "," << usuario.email << "," << usuario.password;
arquivoTemporario << "," << usuario.pergunta << "," << usuario.resposta << "," << usuario.pontos << endl;
}
}
arquivoTemporario.close();
remove(_nomeArquivo.c_str());
rename("temp.txt", _nomeArquivo.c_str());
}
void modificarPontos(string userEmail, int pontosUser) {
string _nomeArquivo = "assets/database.txt";
ofstream arquivoTemporario("temp.txt");
for(const auto& usuario : databaseUsuarios()) {
if (userEmail != usuario.email){
arquivoTemporario << usuario.nomeCompleto << "," << usuario.email << "," << usuario.password;
arquivoTemporario << "," << usuario.pergunta << "," << usuario.resposta << "," << usuario.pontos << endl;
}
}
for(const auto& usuario : databaseUsuarios()) {
if (userEmail == usuario.email){
arquivoTemporario << usuario.nomeCompleto << "," << usuario.email << "," << usuario.password;
arquivoTemporario << "," << usuario.pergunta << "," << usuario.resposta << "," << pontosUser << endl;
break;
}
}
arquivoTemporario.close();
remove(_nomeArquivo.c_str());
rename("temp.txt", _nomeArquivo.c_str());
}
#endif