 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
yao_13 Master


Registrado: 29 Jul 2003Mensajes: 226
|
Publicado: Lun 14 Jul, 2008 9:57 pm Asunto: Tamaño y lectura de archivo binario... |
|
|
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 |
|
 |
dobermannmx Master


Registrado: 30 Ago 2006Mensajes: 191Ubicación: Zapopan, Jal. - México
|
Publicado: Lun 14 Jul, 2008 11:44 pm Asunto: |
|
|
Yao, no entiendo cual es tu problema si ya tienes la estructura?
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 |
|
 |
_Willa Capt


Registrado: 28 Ago 2002Mensajes: 169Ubicación: Madrid ( España )
|
Publicado: Mar 15 Jul, 2008 8:41 am Asunto: |
|
|
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
~~~~~~~~
_Willa
~~~~~~~~
www.avancegame.com |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mar 15 Jul, 2008 10:00 am Asunto: |
|
|
| _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 |
|
 |
yao_13 Master


Registrado: 29 Jul 2003Mensajes: 226
|
Publicado: Mar 15 Jul, 2008 11:56 pm Asunto: |
|
|
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 |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Vie 10 Abr, 2009 3:41 am Asunto: |
|
|
Ha pasado casi un año de este post y me toca la misma duda que a yao_13 alguien puede ayudarnos? por favor
muchas graias _________________ Todos somos ignorantes, lo que no todos ignoramos lo mismo... |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Vie 10 Abr, 2009 6:57 am Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Lun 14 Sep, 2009 10:52 pm Asunto: |
|
|
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 |
|
 |
Bitman Lt

Registrado: 30 Mar 2004Mensajes: 80
|
Publicado: Mar 15 Sep, 2009 10:15 pm Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|