-
Notifications
You must be signed in to change notification settings - Fork 0
/
manipulacao_arquivo.cpp
143 lines (129 loc) · 3.8 KB
/
manipulacao_arquivo.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
#include "funcoes.h"
using namespace std;
// Função para tentar fazer o cast de uma string para int
bool tentarCast(string linha)
{
// Tenta fazer o cast da string para int
int valor;
try
{
valor = stoi(linha);
}
// Se a linha tiver uma string sem números
catch (invalid_argument &e)
{
return false;
}
// Se o inteiro da linha exceder o limite do tipo int
catch (out_of_range &e)
{
return false;
}
return true;
}
// Função para converter uma string para um número inteiro
int castStringDado(string linha)
{
// Verifica se é possível fazer o cast da string para int
bool castPossivel = tentarCast(linha);
if (castPossivel)
return stoi(linha);
else
return -1;
}
// Função para converter uma string contendo vários números em um vetor de inteiros
vector<int> castStringVetor(string linha)
{
vector<int> vetor;
string temporaria = "";
bool castPossivel;
// Percorre cada caracter da string
for (int i = 0; i < linha.size(); i++)
{
if (linha[i] == ' ')
{
// Quando encontrar um espaço em branco, tenta fazer o cast da string temporária para int
castPossivel = tentarCast(temporaria);
if (castPossivel)
{
// Se for possível fazer o cast, adiciona o número ao vetor
vetor.push_back(stoi(temporaria));
temporaria = "";
}
}
else if (linha[i] != '\n')
{
// Se não for espaço em branco nem quebra de linha, adiciona o caracter à string temporária
temporaria = temporaria + linha[i];
}
}
// Adiciona o último número da string temporária ao vetor
castPossivel = tentarCast(temporaria);
if (castPossivel)
vetor.push_back(stoi(temporaria));
return vetor;
}
// Função que lê o arquivo e retorna as informações em uma tupla
tuple<int, int, vector<int>, vector<vector<int>>> definirInformacoesArquivo(string localArquivo)
{
// Abre o arquivo
ifstream arquivo(localArquivo);
// Declara as variáveis que serão preenchidas com as informações do arquivo
int numeroLinhas, numeroProdutos;
vector<int> vetorTempoProducao;
vector<int> vetorGeral;
vector<int> vetorTemporario;
vector<vector<int>> matriz;
// Verifica se o arquivo foi aberto com sucesso
if (arquivo.is_open())
{
int contadorLinhas = 0;
string linha;
while (getline(arquivo, linha))
{
switch (contadorLinhas)
{
case 0:
// Linha 1 do arquivo contém o número de linhas que serão lidas (não utilizada)
numeroLinhas = castStringDado(linha);
break;
case 1:
// Linha 2 do arquivo contém o número de produtos
numeroProdutos = castStringDado(linha);
break;
case 2:
// Linha 3 do arquivo não é utilizada
break;
case 3:
// Linha 4 contém o vetor de tempo de produção de cada produto
vetorTempoProducao = castStringVetor(linha);
break;
case 4:
// Linha 5 do arquivo não é utilizada
break;
default:
// Linhas restantes contêm a matriz de tempo de limpeza entre a produção de um produto e os outros
vetorTemporario = castStringVetor(linha);
vetorGeral.insert(vetorGeral.end(), vetorTemporario.begin(), vetorTemporario.end());
break;
}
contadorLinhas += 1;
}
// Preenchendo a matriz com os valores lidos
matriz.resize(numeroProdutos, vector<int>(numeroProdutos));
for (int i = 0; i < numeroProdutos; i++)
for (int j = 0; j < numeroProdutos; j++)
matriz[i][j] = vetorGeral[j + i * numeroProdutos];
}
else
{
// Se não foi possível abrir o arquivo, exibe uma mensagem de erro e encerra o programa
cout << "Falha ao abrir arquivo!";
arquivo.close();
exit(0);
}
// Fecha o arquivo
arquivo.close();
// Retorna as informações lidas do arquivo em uma tupla
return make_tuple(numeroLinhas, numeroProdutos, vetorTempoProducao, matriz);
}