PDA

Ver la Versión Completa : Duda urgente con ficheros c++


romanuel
05-02-2008, 11:32:14
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
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:


ifstream filein("archivo.txt") ; // entrada

ofstream fileout("archivo.txt"); // salida;