Si alguien ve que lo que digo es una tontería que me corrija y pase de leer el código.
Mi intención aquí era escribir y leer de un archivo binario usando streams. De manera que Datos -> Estructura(a lo buffer) -> archivo.dat y viceversa.
Para saber dónde y desde dónde leer he usado seekg y seekp, multiplicando el número de registro por sizeof(estructura).
El problema es que cuando introduzco un segundo registro me sobrescribe el primero con NULL las veces que sea necesario hasta llenar el hueco.
Ahí va el código:
¿Alguien sabe qué hago mal?
Por cierto, en WinXP, 32bits, con DevC++
Mi intención aquí era escribir y leer de un archivo binario usando streams. De manera que Datos -> Estructura(a lo buffer) -> archivo.dat y viceversa.
Para saber dónde y desde dónde leer he usado seekg y seekp, multiplicando el número de registro por sizeof(estructura).
El problema es que cuando introduzco un segundo registro me sobrescribe el primero con NULL las veces que sea necesario hasta llenar el hueco.
Ahí va el código:
Código (cpp) [Seleccionar]
#include <iostream>
#include <cstring>
#include <cstdio>
#include <fstream>
using namespace std;
//Estrucutra / Buffer
typedef struct {
char nombre[34];
int ano;
short dia;
short mes;
} Cumple;
//Prototipos
void introduccion();
char ElegirConsulta();
void ConsultaID();
void grabado();
void lectura();
//Variables Globales
char meses[12][11] = {"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"};
long nRegistros = 0;
long nBytes = 0;
int id;
Cumple pers;
//Función Principal
int main() {
int opt;
bool bucle = false;
while(!bucle) {
system("cls");
ifstream fichero("datos.dat", ios::in | ios::binary);
fichero.seekg(0, ios::end); // Colocar el cursor al final del fichero
nBytes = fichero.tellg(); // Tamaño en bytes
nRegistros = fichero.tellg()/sizeof(Cumple); // Tamaño en registros
fichero.close();
cout << "Acci\242n:" << endl;
cout << " 1 - Introducir datos" << endl;
cout << " 2 - Consultar datos" << endl;
cout << "99 - Salir" << endl;
cout << "Opci\242n: ";
cin >> opt;
switch(opt) {
case 1:
introduccion();
break;
case 2:
if(ElegirConsulta() == 'a') ConsultaID();
break;
case 99:
cout << "Vete ya CO\245O!!!" << endl;
cin.get();
cin.get();
bucle = true;
}
}
return 0;
}
//Función de introducción de datos
void introduccion() {
bool correcto = false;
char op;
cin >> id;
while(!correcto) {
system("cls");
cout << "ID: " << id << endl;
cout << "Nombre: "; cin >> pers.nombre; cout << endl;
cout << "A\244o: "; cin >> pers.ano; cout << endl;
cout << "Mes: "; cin >> pers.mes; cout << endl;
cout << "D\241a: "; cin >> pers.dia; cout << endl;
cout << endl << endl;
cout << "Datos introducidos: " << endl;
cout << pers.nombre << " naci\242 el " << pers.dia << " de " << meses[pers.mes-1] << " de " << pers.ano << endl;
cout << "Es esto correcto?(S/n)" << endl;
cin >> op;
if(op == 'S' || op == 's') correcto = true;
}
grabado();
}
//Menu de consulta
char ElegirConsulta() {
char op;
system("cls");
cout << "C\242mo quieres consultar?" << endl;
cout << "a) Por ID" << endl;
cout << "b) Por nombre" << endl; //Por hacer
cout << "x) Atr\240s" << endl;
cout << "Opci\242n: ";
cin >> op;
return op;
}
//Función de Consulta de datos por ID
void ConsultaID() {
system("cls");
cout << "Escribe ID: ";
cin >> id;
lectura();
cout << pers.nombre << " naci\242 el " << pers.dia << " de " << meses[pers.mes-1] << " de " << pers.ano << endl;
cin.get();
cin.get();
}
//Función de grabado de datos en fichero binario
void grabado() {
fstream grabado;
grabado.open("datos.dat", ios::out | ios::trunc | ios::binary);
grabado.seekp(id*sizeof(Cumple), ios::beg);
grabado.clear();
grabado.write((const char *)&pers, sizeof(Cumple));
grabado.close();
}
//Función de lectura de datos de fichero binario
void lectura() {
fstream lectura;
lectura.open("datos.dat", ios::in | ios::binary);
lectura.seekg(id*sizeof(Cumple), ios::beg);
lectura.read((char *)&pers, sizeof(Cumple));
lectura.close();
}
¿Alguien sabe qué hago mal?
Por cierto, en WinXP, 32bits, con DevC++