Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - Awraaaauu

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