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
#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++