elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


  Mostrar Mensajes
Páginas: [1]
1  Programación / Programación C/C++ / Re: Acceso aleatorio a archivos binarios, a ver si alguien puede ayudarme en: 24 Junio 2010, 03:15 am
Sigue habiendo un problemilla.

::app me sitúa al final del fichero siempre antes de cualquier operación de salida, incluso después de hacer seekp

Bueno, voy a investigar un poco por mi cuenta. Si no consigo nada lo haré sin streams.

2  Programación / Programación C/C++ / Re: Acceso aleatorio a archivos binarios, a ver si alguien puede ayudarme en: 24 Junio 2010, 00:02 am
Muchas gracias, no conocía ese método. Aprendí de un manual bastante incompleto.
3  Programación / Programación C/C++ / Re: Acceso aleatorio a archivos binarios, a ver si alguien puede ayudarme en: 23 Junio 2010, 08:26 am
Mi pregunta es:

¿Cómo evitar que lo descarte?
4  Programación / Programación C/C++ / Re: Acceso aleatorio a archivos binarios, a ver si alguien puede ayudarme en: 23 Junio 2010, 06:44 am
Muchas gracias por tú respuesta.

Se que el código es una "basurita", pero realmente la única función que tenía era conseguir aprender lo de los binarios, le adorné con lo del calendario para que luego no me quedara un exe inútil.

¿Hay alguna función para lo que busco o tengo que crear un buffer para TOODOO el archivo?
5  Programación / Programación C/C++ / Acceso aleatorio a archivos binarios, a ver si alguien puede ayudarme en: 23 Junio 2010, 04:41 am
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
  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <fstream>
  5. using namespace std;
  6. //Estrucutra / Buffer
  7. typedef struct {
  8.       char nombre[34];
  9.       int ano;
  10.       short dia;
  11.       short mes;
  12.       } Cumple;
  13. //Prototipos      
  14. void introduccion();      
  15. char ElegirConsulta();
  16. void ConsultaID();
  17. void grabado();
  18. void lectura();
  19. //Variables Globales
  20. char meses[12][11] = {"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"};
  21. long nRegistros = 0;
  22. long nBytes = 0;
  23. int id;
  24. Cumple pers;
  25. //Función Principal
  26. int main() {
  27.    int opt;
  28.    bool bucle = false;
  29.    while(!bucle)      {
  30.    system("cls");
  31.    ifstream fichero("datos.dat", ios::in | ios::binary);                  
  32.    fichero.seekg(0, ios::end); // Colocar el cursor al final del fichero
  33.    nBytes = fichero.tellg(); // Tamaño en bytes
  34.    nRegistros = fichero.tellg()/sizeof(Cumple); // Tamaño en registros
  35.    fichero.close();
  36.    cout << "Acci\242n:" << endl;
  37.    cout << " 1 - Introducir datos" << endl;
  38.    cout << " 2 - Consultar datos" << endl;
  39.    cout << "99 - Salir" << endl;
  40.    cout << "Opci\242n: ";
  41.    cin >> opt;
  42.    switch(opt) {
  43.               case 1:
  44.                 introduccion();
  45.                 break;
  46.               case 2:
  47.                    if(ElegirConsulta() == 'a') ConsultaID();
  48.                    break;
  49.               case 99:
  50.                    cout << "Vete ya CO\245O!!!" << endl;
  51.                    cin.get();
  52.                    cin.get();
  53.                    bucle = true;
  54.                    }
  55.                    }
  56.    return 0;
  57. }
  58. //Función de introducción de datos
  59. void introduccion() {
  60.     bool correcto = false;
  61.     char op;
  62.     cin >> id;
  63.     while(!correcto) {
  64.     system("cls");
  65.     cout << "ID: " << id << endl;
  66.     cout << "Nombre: "; cin >> pers.nombre; cout << endl;
  67.     cout << "A\244o: "; cin >> pers.ano; cout << endl;
  68.     cout << "Mes: "; cin >> pers.mes; cout << endl;
  69.     cout << "D\241a: "; cin >> pers.dia; cout << endl;
  70.     cout << endl << endl;
  71.     cout << "Datos introducidos: " << endl;
  72.     cout << pers.nombre << " naci\242 el " << pers.dia << " de " << meses[pers.mes-1] << " de " << pers.ano << endl;
  73.     cout << "Es esto correcto?(S/n)" << endl;
  74.     cin >> op;
  75.     if(op == 'S' || op == 's') correcto = true;
  76.     }
  77.     grabado();
  78.     }
  79. //Menu de consulta
  80. char ElegirConsulta() {
  81.     char op;
  82.     system("cls");
  83.     cout << "C\242mo quieres consultar?" << endl;
  84.     cout << "a) Por ID" << endl;
  85.     cout << "b) Por nombre" << endl; //Por hacer
  86.     cout << "x) Atr\240s" << endl;
  87.     cout << "Opci\242n: ";
  88.     cin >> op;
  89.     return op;
  90.     }
  91. //Función de Consulta de datos por ID
  92. void ConsultaID() {
  93.     system("cls");
  94.     cout << "Escribe ID: ";
  95.     cin >> id;
  96.     lectura();
  97.     cout << pers.nombre << " naci\242 el " << pers.dia << " de " << meses[pers.mes-1] << " de " << pers.ano << endl;
  98.     cin.get();
  99.     cin.get();
  100.     }
  101. //Función de grabado de datos en fichero binario
  102. void grabado() {
  103.     fstream grabado;
  104.     grabado.open("datos.dat", ios::out | ios::trunc | ios::binary);
  105.     grabado.seekp(id*sizeof(Cumple), ios::beg);
  106.     grabado.clear();
  107.     grabado.write((const char *)&pers, sizeof(Cumple));
  108.     grabado.close();
  109.     }
  110. //Función de lectura de datos de fichero binario
  111. void lectura() {
  112.     fstream lectura;
  113.     lectura.open("datos.dat", ios::in | ios::binary);
  114.     lectura.seekg(id*sizeof(Cumple), ios::beg);
  115.     lectura.read((char *)&pers, sizeof(Cumple));
  116.     lectura.close();
  117.     }
  118.  

¿Alguien sabe qué hago mal?

Por cierto, en WinXP, 32bits, con DevC++
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines