Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   metodo write() de la clase TFileStream (https://www.clubdelphi.com/foros/showthread.php?t=61120)

11_8_88 26-10-2008 20:32:38

metodo write() de la clase TFileStream
 
Hola a todos, mi cuestion es por q no se usar el metodo write(const *void, int &) de la clase TFileStream, lo q intento en escribir un AnsiString en un fichero.

Muchas gracias.

coso 26-10-2008 21:11:33

hola, prueba de hacer algo como

Código Delphi [-]
char *s;
TFileStream *T;
 
T = TFileStream->Create("c:\test.txt");
 
getmem(s,255*sizeof(char));
...
strcopy(s,"1234567890");
T->Write(s,4);
dispose(s);

o bien

Código Delphi [-]
string s;
 
s = "asdfjsdjfasdj";
...
T->Write(@s,4); // si no funciona con @, prueba con &
...

Lepe 26-10-2008 21:14:56

No te doy respuesta inmediata, pero quizás pilles la idea.

El primer parámetro es un puntero a cualquier cosa, así que puedes mandar a escribir un integer, un Tbitmap o un string.

El segundo parámetro es la cantidad de bytes que contiene el primer parámetro, normalmente en delphi se usa la función "sizeof(nombrevariable)" como segundo parámetro.

Quizás un ansiString es ya un puntero a una cadena, por lo que quizás puedas escribir algo parecido a :
Código Delphi [-]
  ansistring *a = 'mi string superlarga';
  MiStream.write(a, sizeof(a));

Edito: coso ya te colaste en medio.... :D ;)

Suerte !!

11_8_88 26-10-2008 23:30:47

Muchas gracias por contestar, os paso el trozo de código, y os comento q no
me escribe toda la información, me escribe la de realx[0] y una parte de realx[1] y de momento no doy con el error.

TFileStream* rotar = new TFileStream ("hola.txt", fmCreate);

AnsiString coordenada_x;

coordenada_x = (AnsiString)realx[0] + " " + (AnsiString)realx[1] + " " + (AnsiString)realx[2];

rotar->Write(coordenada_x.data(),sizeof(coordenada_x));

delete rotar;

jorge82 27-10-2008 05:46:46

Hola, extraído de la ayuda de C++ Builder:
Código:

...
In C++, sizeof(classtype), where classtype is derived from some base class, returns the size of the object (remember, this includes the size of the base class).
...

AnsiString está implementada como una clase, entonces sizeof(coordenada_x) va a devolver el tamaño en bytes del objeto, no de su contenido.

Código:

Length:
Returns the length of the AnsiString.

int __fastcall Length() const;

Description

Length returns the number of bytes in this AnsiString.

Luego entonces, para saber el numero de bytes que necesitas pasarle como parámetro al método Write debes usar Length:
Código Delphi [-]
...
  rotar->Write(coordenada_x.data(), coordenada_x.Length());

escafandra 27-10-2008 07:19:31

Cita:

Empezado por 11_8_88 (Mensaje 322490)
AnsiString coordenada_x;
rotar->Write(coordenada_x.data(),sizeof(coordenada_x));

Código:

rotar->Write(coordenada_x.data().c_str(), coordenada_x.Length());
Saludos.

11_8_88 27-10-2008 09:17:06

Muchimas gracias amigos ya esta solucionado.

Un saludo


La franja horaria es GMT +2. Ahora son las 17:15:26.

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