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
|
#include <cstring>
#include <cstdlib>
#include <fstream>
#include <iomanip>
#include <iostream>
#include "fun.hpp"
using namespace std;
void cargarProductos(void *& productos, const char * archivo) {
ifstream in(archivo);
if (!in) {
cout << "Error: no se pudo abrir archivo\n";
exit(1);
}
void ** ps = NULL;
size_t size = 0;
char code[MAXLEN];
char desc[MAXLEN];
double price;
int stock;
int i;
for (i = 0; true; i++) {
in.getline(code, MAXLEN, ',');
in.getline(desc, MAXLEN, ',');
in >> price; in.get();
in >> stock; in.get();
if (!in) {
break;
}
if (i + 1 >= size) {
increase_size_productos(ps, size);
}
char * code_mem = new char [strlen(code) + 1]; strcpy(code_mem, code);
char * desc_mem = new char [strlen(desc) + 1]; strcpy(desc_mem, desc);
void ** p1 = new void * [4] {code_mem, desc_mem, new double {price}, new int {stock}};
void ** p2 = new void * [2] {p1, NULL};
ps[i] = p2;
ps[i + 1] = NULL;
}
// at the end of the iteration ps[i] == NULL
qsort(ps, i - 1, sizeof(void *), cmp_productos);
productos = ps;
}
int cmp_productos(const void *lhs, const void *rhs) {
// (nasty)
char * s1 = (char *)(*(void ****) lhs)[0][0];
char * s2 = (char *)(*(void ****) rhs)[0][0];
return strcmp(s1, s2);
}
void increase_size_productos(void **& ps, size_t &size) {
if (!ps) {
// init
size = INCREMENTO;
ps = new void * [size];
ps[0] = NULL;
return;
}
// this has O(n^2) time complexity (not good)
size += INCREMENTO;
void ** ps_tmp = new void * [size];
int i;
for (i = 0; i < size && ps[i]; i++) {
ps_tmp[i] = ps[i];
}
ps_tmp[i] = NULL;
delete [] ps;
ps = ps_tmp;
}
void pruebaDeCargaDeProductos(void * productos) {
ofstream out("PruebaProductos.txt");
if (!out) {
cout << "Error: no se pudo abrir archivo\n";
exit(1);
}
void ** ps = (void **) productos;
out << "Codigo Descripcion Precio Stock\n";
for (int i = 0; ps[i]; i++) {
void ** p2 = (void **) ps[i];
void ** p1 = (void **) p2[0];
char * code = (char *) p1[0];
char * desc = (char *) p1[1];
double * price = (double *) p1[2];
int * stock = (int *) p1[3];
out << left;
out << setw(12) << code;
out << setw(64) << desc;
out << right << fixed << setprecision(2);
out << setw(12) << *price;
out << setw(12) << *stock;
out << '\n';
}
}
|