Dev - C++ - No sé porque me borra los datos del binario en cada llamada

 
Vista:
sin imagen de perfil
Val: 4
Ha disminuido su posición en 2 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

No sé porque me borra los datos del binario en cada llamada

Publicado por Sebastián (2 intervenciones) el 01/04/2019 02:33:21
Hola a todos. Me registré acá para preguntar sobre este código que, desde hace varios días me está haciendo renegar bastante.
El codigo tiene que, en cada llamada a la funcion GuardarVenta(), guardar una nueva entrada en un binario sin borrar las anteriores, pero acé surge el problema, en cada llamada borra todos los datos y guarda unicamente el nuevo. Teoricamente tuviera que funcionar, pues abro el archivo con las flags binary|ate, uso el puntero seekg() pero sigue sin funcionar.
Armé la lectura del archivo por ifstream y depure la ejecución del programa. Cuando calculo la cantidad de datos en el archivo obtengo 1 (en vez de los 4 que guardé en la prueba, que los comprobé que se guardaron porque tiré un 1 por consola cada vez que pasaba).

Dejo el código adjunto y si, por esas cosas, algun iluminado puede ayudar a este pobre imbécil sujeto será muy agradecido. Saludos.

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
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <ios>
using namespace std;
 
struct ProductoVenta{
	long codigo;
	int cantidad;
	double ganancia;
	char fecha[24];
};
 
bool GuardarVenta(ProductoVenta aux){
	ofstream binario_venta;
	binario_venta.open("venta.dat", ios::binary);
	binario_venta.seekp(0,ios::end);
	if(binario_venta.is_open()){
		cout<<1<<endl;
		binario_venta.write(reinterpret_cast<char*> (&aux), sizeof(ProductoVenta));
	}
	else{
		return false;
	}
	binario_venta.close();
	return true;
}
 
int main(int argc, char *argv[]) {
	ProductoVenta a, b, c, d;
	a.cantidad=4; a.codigo=1215; a.ganancia=154.69; strcpy(a.fecha, "2019/05/04 - 12:01:23");
	b.cantidad=2; b.codigo=2222; b.ganancia=78.9; strcpy(b.fecha, "2018/07/23 - 18:01:30");
	c.cantidad=7; c.codigo=4231; c.ganancia=324.1; strcpy(c.fecha, "2019/03/01 - 12:01:23");
	d.cantidad=18; d.codigo=123; d.ganancia=12.50; strcpy(d.fecha, "2019/10/25 - 14:01:23");
 
	GuardarVenta(a);
	GuardarVenta(b);
	GuardarVenta(c);
	GuardarVenta(d);
 
	string p_fecha_inicial="2019/01/03 - 12:01:23";
	string p_fecha_final="2019/10/26 - 12:01:23";
 
	vector <ProductoVenta> v;
	ifstream binario_venta("venta.dat", ios::binary);
	if(binario_venta.is_open()){
		binario_venta.seekg(0,ios::end);
		int tamanioarch=binario_venta.tellg();
		int cantidadprod=tamanioarch/(sizeof(ProductoVenta));
		binario_venta.seekg(0);
		ProductoVenta leer;
		for(int i=0;i<cantidadprod;i++) {
			binario_venta.seekg(i*sizeof(ProductoVenta));
			binario_venta.read(reinterpret_cast <char*> (&leer), sizeof(ProductoVenta));
			 //En el vector quiero solo los datos entre esas fechas
                        if(leer.fecha>=p_fecha_inicial and leer.fecha<=p_fecha_final){
				v.push_back(leer);
				cout<<i<<endl;
			}
		}
	}
	binario_venta.close();
 
	//Salida por consola para probar
	for(unsigned int i=0;i<v.size();i++) {
		cout<<v[i].codigo<<"   "<<v[i].cantidad<<"    "<<v[i].ganancia<<"   "<<v[i].fecha<<endl;
	}
 
 
 
	return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

No sé porque me borra los datos del binario en cada llamada

Publicado por Rodrigo (539 intervenciones) el 01/04/2019 05:15:42
y si agregas ios::app?

osea donde dice
1
ios::binary
probar agregar.
1
ios::binary | ios::app
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 4
Ha disminuido su posición en 2 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

No sé porque me borra los datos del binario en cada llamada

Publicado por Sebastián (2 intervenciones) el 01/04/2019 05:45:30
Gracias maestro! Faltaba la flag ios::app, una hora después de publicar el post lo había solucionado pero colgué en borrarlo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar