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


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Jue 09 Abr, 2009 11:00 pm Asunto: Ficheros |
|
|
hola foro amigos estoy trabajando con ficheros , que se guaradan en extencion .dat utilizando las fi\ucndiones fread y fwrite, alguardar parece todo bien pero al tratar de visualizar el contenido del fichero me muestra algo que no guarde aca les dejo el codigo que utlizo por si alguien puede ayudarme, la ayuda del builder explica pero es par consola y yo trabajo visual
| Código: | //---------------------------------------------------------------------------
#include <vcl>
#pragma hdrstop
#include<stdio>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "AlignEdit"
#pragma resource "*.dfm"
TForm1 *Form1;
struct clientData {
int acctNum;
String lastName;
String firstName;
float balance;
};
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//salvando el archivo credit.dat
int accountNum;
struct clientData client;
client.acctNum = Edit1->Text.ToInt();
client.lastName = Edit2->Text;
client.firstName = Edit3->Text;
client.balance = Edit4->Text.ToDouble();
FILE *fPtr = fopen("credit.dat", "a+");
fseek(fPtr, (accountNum - 1) * sizeof(struct clientData), SEEK_SET);
fwrite(&client, sizeof(struct clientData), 1, fPtr);
fclose(fPtr);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Edit2->Clear();
Edit3->Clear();
Edit4->Clear();
//cargando el archivo credit.dat
FILE *fPtr;
struct clientData client;
if ((fPtr = fopen("credit.dat", "a+")) == NULL)
ShowMessage("no se puede abrir el fichero");
else{
// fPtr = fopen("credit.dat", "a+");
int account = Edit1->Text.ToInt();
fseek(fPtr, (account - 1) * sizeof(struct clientData), SEEK_SET);
fread(&client, sizeof(struct clientData), 1, fPtr);
if (client.acctNum == 0)
ShowMessage("La cuenta no tiene informacion");
else{
Edit2->Text = client.lastName;
Edit3->Text = client.firstName;
Edit4->Text = FloatToStr(client.balance);
}
}
fclose(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: Vie 10 Abr, 2009 7:03 am Asunto: |
|
|
Para nada Angel los ficheros los deseo y son de tipo binario , es asi como me interesa trabajarlos, por cuestiones de seguridad, ya te deje algo de codigo en el otro tema , espero me puedas ayudar mas adelante muchas gracias amigo _________________ Todos somos ignorantes, lo que no todos ignoramos lo mismo... |
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Vie 10 Abr, 2009 1:21 pm Asunto: |
|
|
creo que te estas haciendo un lio.
Para empezar el fichero debe ser binario y ser capaz de leer y escribir
| Código: | fopen("credit.dat", "r+b") |
Segundo | Código: | fseek(fPtr, (accountNum - 1) * sizeof(struct clientData), SEEK_SET);
fwrite(&client, sizeof(struct clientData), 1, fPtr);
|
Esto no puede funcionar, porque el fseek encuentra el final del archivo y no se posiciona mas adelante (al menos en mi caso)
Deberías hacer un "bucle" para "rellenar" el hueco
| Código: | x=fread(&client,sizeof(client),accountNum - 2,fPtr); |
En x tendrás el último registro escrito anterior al registro que quieres grabar. Si este es muy inferior al que tienes que grabar, deberás hacer un for con fwrite y con client "limpio" para llegar al sitio
Espero que entiendas el "rollito"
Saludos, Bosoft |
|
| Volver arriba |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Vie 10 Abr, 2009 3:15 pm Asunto: |
|
|
gracias por responder amigo, soy nuevo en este tema , me podrias orientar mejor , hastan donde se SEEK_SET se posiciona el comienzo del fichero , entonces no entiendo que es lo que me planteas?
gracias _________________ Todos somos ignorantes, lo que no todos ignoramos lo mismo... |
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Vie 10 Abr, 2009 3:27 pm Asunto: |
|
|
Tu estas creando un archivo aleatorio en el que escribes cada estructura de un cliente según el número de cliente. El problema está en que si creas el archivo y quieres insertar el registro 500 no podrás porque el archivo esta vacío. Para ello debes "rellenar" cada cliente en vacío hasta llegar al 499 y entonces podrás guardar el 500.
El fread que te he puesto hace una lectura desde el cliente 0 (uno en tu caso) hasta el inmediato anterior al que quieres insertar. Si no existen datos para realizar esa lectura, el sistema se para en el último registro existente y a partir de ahí debes rellenar los registros que faltan
El fseek se usa para posicionarse dentro del archivo, pero si el archivo es mas corto que el dato que pides devuelve -1 y no se altera la posición
Saludos, Bosoft |
|
| Volver arriba |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Vie 10 Abr, 2009 3:51 pm Asunto: |
|
|
casi, casi , la cabeza me da vueltas con este tema , amigo perdona la comodidad pero se me va de las manos , me podrias poner un ejemplo con codigo porfavor?
 _________________ Todos somos ignorantes, lo que no todos ignoramos lo mismo... |
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Sab 11 Abr, 2009 12:05 am Asunto: |
|
|
Veamos si lo pillas ahora
He usado tu código de arriba y este es el resultado a falta de fallos de sintaxis y pequeños detalles
| Código: | //---------------------------------------------------------------------------
#include <vcl>
#pragma hdrstop
#include<stdio>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "AlignEdit"
#pragma resource "*.dfm"
TForm1 *Form1;
struct clientData {
int acctNum;
String lastName;
String firstName;
float balance;
};
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//salvando el archivo credit.dat
int x=0;
struct clientData vacio;
struct clientData client;
client.acctNum = Edit1->Text.ToInt();
client.lastName = Edit2->Text;
client.firstName = Edit3->Text;
client.balance = Edit4->Text.ToDouble();
FILE *fPtr = fopen("credit.dat", "r+b");
if(fPtr==NULL) fPtr = fopen("credit.dat", "wb"); // no existe el archivo: lo creamos
else x=fread(&client,sizeof(struct clientData), client.acctNum - 2,fPtr); // si ya existe buscamos la posicion
// vaciamos los registros de relleno y los grabamos
setmem(vacio,sizeof(vacio),0);
for(;x<x<client.acctNum-2;x++)
fwrite(&vacio,sizeof(struct clientData), 1, fPtr);
fwrite(&client, sizeof(struct clientData), 1, fPtr);
fclose(fPtr);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Edit2->Clear();
Edit3->Clear();
Edit4->Clear();
//cargando el archivo credit.dat
FILE *fPtr;
int account = Edit1->Text.ToInt();
struct clientData client;
if ((fPtr = fopen("credit.dat", "r+b")) == NULL)
// ShowMessage("no se puede abrir el fichero");
else{
fPtr = fopen("credit.dat", "wb");
fclose(fPtr);
return; // no exite el fichero: lo creamos y return
}
fseek(fPtr, (account - 1) * sizeof(struct clientData), SEEK_SET);
fread(&client, sizeof(struct clientData), 1, fPtr);
if (client.acctNum == 0)
ShowMessage("La cuenta no tiene informacion");
else{
Edit2->Text = client.lastName;
Edit3->Text = client.firstName;
Edit4->Text = FloatToStr(client.balance);
}
fclose(fPtr);
}
//---------------------------------------------------------------------------
|
Si algo no lo entiendes, pregunta y con gusto te ayudaré
Saludos, Bosoft |
|
| Volver arriba |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Sab 11 Abr, 2009 1:38 am Asunto: |
|
|
Bosoft gracias por dedicarle tiempo a mi problema muy agradecido de veras
hay algunas incongruencias en el codigo como:
for(;x<x<client.acctNum-2;x++)
fwrite(vacio,sizeof(struct clientData), 1, fPtr);
ya arregladas, el codigo guarda los datos , ahora no se si estaran bien guardados porque al querer leerlos segunel indice accountNum no muestra absolutamente nada !
ya me batire un tanto mas con este tema pero he perdido esperanzas
bueno amigo un millon de gracias _________________ Todos somos ignorantes, lo que no todos ignoramos lo mismo... |
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Sab 11 Abr, 2009 1:51 am Asunto: |
|
|
| ifrit escribió: | Bosoft gracias por dedicarle tiempo a mi problema muy agradecido de veras
hay algunas incongruencias en el codigo como:
for(;x<x<client.acctNum-2;x++)
fwrite(vacio,sizeof(struct clientData), 1, fPtr);
ya arregladas, el codigo guarda los datos , ahora no se si estaran bien guardados porque al querer leerlos segunel indice accountNum no muestra absolutamente nada !
ya me batire un tanto mas con este tema pero he perdido esperanzas
bueno amigo un millon de gracias |
Cambia esto
for(;x<x<client.acctNum-2;x++)
for(;x<client.acctNum-2;x++)
y esto
fwrite(vacio,sizeof(struct clientData), 1, fPtr);
fwrite(&vacio,sizeof(struct clientData), 1, fPtr);
Ya te advertí que esta hecho rápido y habrían fallos sintácticos, pero en teoría debe funcionar correcto
Si te sigue fallando me lo dices y lo pruebo para que te vaya perfecto
Saludos, Bosoft |
|
| Volver arriba |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Sab 11 Abr, 2009 3:54 am Asunto: |
|
|
bosoft como te comentaba ya esos problemas los arregle pero aun sin obtener resultados
yo pongo por ejemplo en el Edit1: 1 para que almacene en el accountNum 1
y luego para cargar esos valores pongo el 1 tambien (o cualquier otro numero ya probo con bastantes ) pero no me devulve nada , como si no leyera del fichero .dat
alguna idea
muchas gracisa por seguir el tema de veras _________________ Todos somos ignorantes, lo que no todos ignoramos lo mismo... |
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Sab 11 Abr, 2009 10:44 am Asunto: |
|
|
Prueba esto:
| Código: | void __fastcall TForm1::Button1Click(TObject *Sender)
{
//salvando el archivo credit.dat
int x=0,account;
struct clientData vacio;
struct clientData client;
account=Edit1->Text.ToInt();
client.acctNum =account;
client.lastName = Edit2->Text;
client.firstName = Edit3->Text;
client.balance = Edit4->Text.ToDouble();
FILE *fPtr = fopen("credit.dat", "r+b");
if(fPtr==NULL) fPtr = fopen("credit.dat", "wb"); // no existe el archivo: lo creamos
else x=fread(&client,sizeof(struct clientData), account - 1,fPtr); // si ya existe buscamos la posicion
// vaciamos los registros de relleno y los grabamos
setmem(&vacio,sizeof(vacio),0);
for(;x<account-1;x++)
fwrite(&vacio,sizeof(struct clientData), 1, fPtr);
fseek(fPtr, (account - 1) * sizeof(struct clientData), SEEK_SET);
x=fwrite(&client, sizeof(struct clientData), 1, fPtr);
if(x==1) ShowMessage("Registro guardado");
fclose(fPtr);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Edit2->Clear();
Edit3->Clear();
Edit4->Clear();
//cargando el archivo credit.dat
FILE *fPtr;
int account = Edit1->Text.ToInt();
struct clientData client;
if ((fPtr = fopen("credit.dat", "r+b")) != NULL);
// ShowMessage("no se puede abrir el fichero");
else{
fPtr = fopen("credit.dat", "wb");
fclose(fPtr);
return; // no exite el fichero: lo creamos y return
}
fseek(fPtr, (account - 1) * sizeof(struct clientData), SEEK_SET);
fread(&client, sizeof(struct clientData), 1, fPtr);
if (client.acctNum == 0)
ShowMessage("La cuenta no tiene informacion");
else{
Edit2->Text = client.lastName;
Edit3->Text = client.firstName;
Edit4->Text = FloatToStr(client.balance);
}
fclose(fPtr);
}
//---------------------------------------------------------------------------
|
A mi ahora me funciona correctamente
Saludos, Bosoft |
|
| Volver arriba |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Sab 11 Abr, 2009 11:59 am Asunto: |
|
|
muy agradecido bosoft por seguir tanto el tema
casi quiere, casi quiere , ahora guarda los valores no es menos cierto , pero aon sus lios, he tenido que cambiar la linea: a la hora de leer los datos
fseek(fPtr, (account - 1) * sizeof(struct clientData), SEEK_SET);
por fseek(fPtr, (account - 1) * sizeof(struct clientData), SEEK_CUR);
lo hice inconciente , despues de ver que no me daba, porque creei que leeria la posicion actual de los datos. Lo otro que aun no logra es , si el Edit2 o 3 donde se guardan firstname y lastname contienen caracteres numericos como Juan2, al la hora de cargar los datos ve a 2 como basura, asi sucede si le pongo todo el campo de nuemros, y tambien a la hora de cargar el Edit4 el de los float me muestra el nuemro mal?
Ya me batire aun mas con el codigo aunque estuve estudiando un tanto la ayuda y se puede coger alguito
muchas gracias _________________ Todos somos ignorantes, lo que no todos ignoramos lo mismo... |
|
| 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.
|