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 

Ficheros

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Ficheros Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Si son ficheros de texto (ASCII) prueba en el fopen con:
Código:
fopen("credit.dat", "at+")

_________________
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

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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?
Crying or Very sad
_________________
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

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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 ! Crying or Very sad
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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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 ! Crying or Very sad
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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Laughing 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
Ver perfil de usuario Enviar mensaje privado Enviar email
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.