Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Tamaño y lectura de archivo binario...

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Tamaño y lectura de archivo binario... Responder citando

Hola amigos,

quiero abrir y leer un archivo binario... es una table, pero no sé cuantos registros tenga, ya tengo la estructura .

Como puedo saber la cantidad de registros?

Como puedo ir leyendo registro por registro ?

Gracias y Saludos de Antemano.
_________________
Sin pena, ni gloria
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Yao, no entiendo cual es tu problema si ya tienes la estructura? Confused
Sabiendo la estructura sabes de que tipo y tamaño es cada campo, si sabes cuanto te consume en bytes cada campo el tamaño de un registro no es mas que la suma de todos sus campos, sabiendo el tamaño de cada registro y conociendo la estructura el leer un determinado registro no es mas que #registro * tamaño_en_bytes_por_registro, usas la función SEEK de manipulaciòn de archivos y te posicionas en el registro que necesitas y solo lees X bytes y listo.

Espero haberte ayudado

Salu2
_________________
ISC
Dobermannmx
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Hola,

Mira, te dejo un pequeño ejemplillo

Código:

       stMiEstructura oRegistro;

          // Apertura del fichero
        FILE *out = fopen(fichero.c_str(),"rb");
        if(!out)
               return;

        // Coloco el cursor al final, para obtener el tamaño
        fseek(out,0,SEEK_END);
        int longi=ftell(out); // recoge en byte el tamaño del fichero
        longi/=sizeof(stMiEstructura); // ahora contiene el num. de registros

       // Coloco el cursor al principio del fichero
       fseek(out,0,SEEK_SET);
       fread(&oRegistro,sizeof(stMiEstructura),longi,out);
       fclose(out);

//  Nota: stMiEstructura, es el nombre de la estructura que necesites crear


_________________
Saludos
~~~~~~~~
Wink _Willa
~~~~~~~~
www.avancegame.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor
Mensaje    Asunto: Responder citando

_Willa escribió:
// Coloco el cursor al final, para obtener el tamaño
fseek(out,0,SEEK_END);
int longi=ftell(out); // recoge en byte el tamaño del fichero

Ni siquiera hace falta desplazarse al final:
Código:
int longi = filelenght(fileno(out));

_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola Amigos, muchas gracias por las respuestas... ahora ya sé como saber la cantidad de registros, ahora mi pregunta es:

Como lleno un Grid con los registros de ese archivo?, es decir, como recorro ese archivo, pensando que (como ejemplo) hay 10 campos y 300 registros?

Alguien me puede ayudar?


Gracias de antemano.
_________________
Sin pena, ni gloria
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Ha pasado casi un año de este post y me toca la misma duda que a yao_13 alguien puede ayudarnos? por favor Rolling Eyes

muchas graias
_________________
Todos somos ignorantes, lo que no todos ignoramos lo mismo...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

No había visto ese último mensja de yao_13. El lunes pongo el código porque aquí en casa no lo tengo.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

de acuerdo Angel me gustaria mucho poder trabajar con tu codigo gracias
aca dejo lo que he estado haciendo segun el libro como programar con c/c++, pero esta con errores y es solo consola no se pasarlo a visual

Código:
//---------------------------------------------------------------------------
/*this program reads a random access file aequenctially,
updates data already written to the file, creates new
data to be placed in the file, and deletes data already in the file*/


#pragma hdrstop
#include <stdio>
#include <iostream>

//---------------------------------------------------------------------------
 struct clientData {
        int acctNum;
        char lastName[50];
        char secondName[50];
        char firstName[50];
        float balance;
    };

    int enterChoice(void);
    void textFile(FILE *);
    void updateRecord(FILE *);
    void newRecord(FILE *);
    void deleteRecord(FILE *);

#pragma argsused
int main(int argc, char* argv[])
{
    FILE *cfPtr;
    int choice;

    if ((cfPtr = fopen("credit.dat", "a+")) == NULL)
        printf("No se ha podido abrir el fichero.\n");
    else{
        while((choice = enterChoice())!= 5) {
            switch (choice){
                case 1:
                    textFile(cfPtr);
                    break;
                case 2:
                    updateRecord(cfPtr);
                    break;
                case 3:
                    newRecord(cfPtr);
                    break;
               case 4:
                deleteRecord(cfPtr);
                break;
            }
        }
    }

    fclose(cfPtr);
    system("pause");
    return 0;
}


//implementacion de funciones
void textFile(FILE *readPtr){

    FILE *writePtr;
    struct clientData client;

    if((writePtr = fopen ("accounts.txt", "w")) == NULL)
        printf("El fichero no puedo ser abierto.\n");
    else{
        rewind(readPtr);
        fprintf(writePtr, "%-6s%-16s%-11s%10s\n",
            "Acct", "Last Name", "First Name", "Balance");

        while(!feof(readPtr)){
            fread(&client, sizeof(struct clientData), 1, readPtr);

            if(client.acctNum != 0)
                fprintf(writePtr, "%-5d%-16s%-11s%10.2f\n",
                    client.acctNum, client.lastName,
                    client.firstName, client.balance);

        }
    }
    fclose(writePtr);
}

void updateRecord(FILE *fPtr){
    int account;
    float transaction;
    struct clientData client;

    printf("Enter a account to update (1-100): ");
    scanf("%d", &account);
    fseek(fPtr, (account - 1) * sizeof(struct clientData), SEEK_SET);
    fread(&client, sizeof(struct clientData), 1, fPtr);

    if (client.acctNum == 0)
        printf("Account #%d has not information.\n", account);
        else{
            printf("%-6d%-16s%-11s%10.2f\n\n",
                client.acctNum, client.lastName,
                client.firstName, client.balance);
            printf("Enter charge (+) or payment (-): ");
            scanf("%f", &transaction);
            client.balance += transaction;
            printf("%-6d%-16s%-11s%10.2f\n\n",
                client.acctNum, client.lastName,
                client.firstName, client.balance);
            fseek(fPtr, (account - 1) * sizeof(struct clientData), SEEK_SET);
            fwrite(&client, sizeof(struct clientData), 1, fPtr);
        }
}

void deleteRecord(FILE *fPtr){
    struct clientData client, blankClient = {0, "", "", 0};
    int accountNum;

    printf("Enter account number to delete (1-100): ");
    scanf("%d", &accountNum);
    fseek(fPtr, (accountNum - 1) * sizeof(struct clientData),
        SEEK_SET);
    fread(&client, sizeof(struct clientData), 1, fPtr);

    if(client.acctNum == 0)
        printf("Account %d does not exist.\n", accountNum);
    else{
        fseek(fPtr, (accountNum - 1) * sizeof(struct clientData),
            SEEK_SET);
        fwrite(&blankClient, sizeof(struct clientData), 1, fPtr);
    }

}

void newRecord(FILE *fPtr){
    struct clientData client;
    int accountNum;
    printf("Enter a new account number (1-100): ");
    scanf("%d", &accountNum);
    fseek(fPtr, (accountNum - 1) * sizeof(struct clientData), SEEK_SET);
    fread(&client, sizeof(struct clientData), 1, fPtr);

    if(client.acctNum != 0)
        printf("Account #%d already contains information.\n", client.acctNum);
    else{
        printf("Enter lastname, firtsname, balance\n? ");
        scanf("%s%s%f", &client.lastName, &client.firstName, &client.balance);
        client.acctNum = accountNum;
        fseek(fPtr, (accountNum - 1) * sizeof(struct clientData), SEEK_SET);
        fwrite(&client, sizeof(struct clientData), 1, fPtr);
    }
}



//---------------------------------------------------------------------------

_________________
Todos somos ignorantes, lo que no todos ignoramos lo mismo...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Angel escribió:
No había visto ese último mensja de yao_13. El lunes pongo el código porque aquí en casa no lo tengo.

El código que tengo es para ficheros de texto. ¿Te interesa igual?
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Disculpa lo tarde del post , pero estuve un buen tiempazo fuera del foro porque no teni ainternet, ni los correos me llegaban, de veras lo siento, si puedes continuar el tema te lo agradeceria mucho, Pues si me interesa aunque sea para txt, gracias y disculpa la molestia.
_________________
Todos somos ignorantes, lo que no todos ignoramos lo mismo...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Si teneis un fichero de texto o binario y ya sabeis leerlo lo que podeis hacer es utilizar un componente TClientDataset que os permitera crear una tabla en memoria y rellenarlo con los registros del fichero texto/binario.

Una vez leidos los registros y guardados en el TClientDataset ya podreis enlazar mediante DataSet este componente a cualquier componente de datos tipo DBGrid, DBEdit, DBNavigator, etc.

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.