Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Duda urgente con ficheros c++ (https://www.clubdelphi.com/foros/showthread.php?t=52937)

romanuel 05-02-2008 11:32:14

Duda urgente con ficheros c++
 
No se porke despues de supuestamente salvar no me carga nada de el fichero anteriormente salvado... please alguna sugerencia

OJO "dic" es un map de la STL

map<AnsiString, Ansistring> dic

void Diccionario::Salvar(AnsiString n)
{
AnsiString *d;
int total=dic.size()*2;
d=new AnsiString[total];
map<AnsiString, AnsiString>::iterator iter=dic.begin();
int pos=0;

while(iter!=dic.end())
{
d[pos]=(*iter).first;
d[pos+1]=(*iter).second;
iter++;
pos+=2;
}

FILE*file=fopen(n.c_str(),"w+");
if(file!=NULL)
{
fwrite(&total,sizeof(int),1,file);
fwrite(d,sizeof(d),total,file);
}
fclose(file);
}
void Diccionario::Cargar(AnsiString n)
{
dic.clear();
AnsiString *d;
int total;
FILE*file=fopen(n.c_str(),"r+");
if(file!=NULL)
{
fread(&total,sizeof(int),1,file);
d=new AnsiString[total];
fread(d,sizeof(AnsiString),total,file);
for(int i=0; i<total; i+=2)
{
pair<AnsiString, AnsiString> p(d[i],d[i+1]);
dic.insert(p);
}
}
fclose(file);
}

ucanneo 25-02-2008 08:12:05

En varias ocasiones no sólo basta con cerrar el archivo, sino explícitamente hacer una descarga de lo que tiene en el buffer hay metodos como el fflush(),

Pues bueno un sugerecia seria no complicar tanto lo que haces con memoria dinámica que "nunca liberas", ademas de que muchas veces a AnsiString le cuesta trabajo funcionar con ficheros estilo c, en fin, te recomendaria hacerlo de la forma tradicional, es más codigo pero no hay problemas, o usando la forma de Builder

#include <vcl.h>
void cargar( AnsiString Ruta)
{
TStringList* sl;
sl = new TStringList;
sl->LoadFromFile(Ruta);
/*
Ya que lo tienes en una StringList mandalo a donde te plazca, a
un memo a un edit, a un txt, donde sea
*/
delete sl;
}



void cargar( AnsiString Ruta )
{
TStringList* sl;
sl = new TStringList;
/*Aca las rutinas necesarias para guardar las cadenas de texto*/
sl->SAveToFile(Ruta);
delete sl;
}
_____________________________________________________________-

Si suponemos que no es texto lo que estas guardando
builder te ofrece otra alternativa

//---------------------------------------------------------------------------
void copiarArchivo( AnsiString &rutaArchivoOrigen,
AnsiString &nombreDestino )
{
if (!FileExists(rutaArchivoOrigen)) return;
if ( FileExists(nombreDestino)) DeleteFile(nombreDestino);
//probando la creacion po FORZOMETRIA

TFileStream *OldFile = new TFileStream(rutaArchivoOrigen,
fmOpenRead);
TFileStream *NewFile = new TFileStream(nombreDestino, fmCreate);
NewFile->CopyFrom(OldFile, OldFile->Size);
delete OldFile;
delete NewFile;
}
//---------------------------------------------------------------------------

Negriz 25-02-2008 19:15:45

Miexperiencia en programacion no es mucha y no se de que tanta ayuda sea este comentario pero no se supone que cuando dices:
"FILE*file=fopen(n.c_str(),"w+"); "
al poner la W+ esto borra el contenido del asrchivo y si no existe lo crea...
porque no pruevas con r+ a ver que pasa...

Saludos y espero que te ayude.

lfb 26-02-2008 08:53:27

Otra
 
Hola colegas
Yo te recomiendo que para el trabajo con ficheros utilices la biblioteca <fstream.h> es una biblioteca super buena para estas cosas.
Te adelanto que:

Código:


ifstream filein("archivo.txt") ; // entrada
 
ofstream fileout("archivo.txt");  // salida;



La franja horaria es GMT +2. Ahora son las 06:37:13.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi