Newsgroup: it.comp.lang.delphi
Titolo: Maledette stringhe





Ciao,


ho un problema con le stringhe perchè ogni volta 
che ne prendo una da una casella di testo o da un elemento di una 
listbox e la trasferisco in un array di char, la stringa contiene altri 
caratteri, ovviamente non visibili ma che non sono nulli come credevo. 
Ecco:


 


 


var


tempnomi:array [0..255] of char;


a:integer;


 


for a:=0 to 255 do
if 
txtnome.Text[a]<>#0 
then
begin
showmessage(txtnome.Text[a]);
tempnomi[count]:=(txtnome.text[a]);
count:=count+1;
end;


 


Se salvo l'array di char con blockwrite in un 
file binario, quando lo riapro con blockread, l'array che ne riviene fuori 
contiene anche gli altri caratteri che erano nella stringa 
iniziale.


Come posso ovviare il 
problema?
 



Come posso ovviare il problema? 
hmmm, cosa vuoi fare? :)
hai fatto un po' di "porcate".... ;)))
perchè  "txtnome.Text[a]<>#0" non è mica una stringa null
terminated...
...e se la proprietà text fosse meno di 255 caratteri? .. vai aleggre
chissà dove...
..."count" lo inizializzi?
se spieghi cosa vorresti ottenere forse esiste un modo piu' pulito...
Ciao, :)
Alan Solo

se spieghi cosa vorresti ottenere forse esiste un modo piu' 
pulito...


Mi serve trasferire la stringa nell'array di char per poi poterlo salvare 
in un file binario (con le string non si può fare)



se spieghi cosa vorresti ottenere forse esiste un modo piu' pulito...
Mi serve trasferire la stringa nell'array di char per poi poterlo salvare in
un file binario (con le string non si puņ fare)
credo che si possa salvarla lo stesso la stringa, mi pare si faccia
BlockWrite( f, s[1], length(s));
Attento che prima devi salvare la lunghezza, cosi' quando leggi il file
scrivi:
// carica lunghezza in a
setlength(s,a);
BlockRead(f, s[1], a);
Se non funziona chiedo venia.. ma mi pare che vada.

On Mon, 14 May 2001 22:03:59 +0000 (UTC), 
mic...@mail.com
("DelphiGuy") wrote:

I caratteri dopo il null terminator non sono significativi comunque:
var
  Buf: array[0..255] of char;
StrPCopy(Buf, TxtNome.text);
Per "pulire" l'array potresti fare prima del StrPCopy:
FillChar(Buf, SizeOf(Buf), 0);
Se vuoi scrivere sul file solo il numero di caretteri significativi:
BlockWrite(F, Buf, StrLen(Buf) + 1);
Spero di esserti satato d'aiuto.
Ciao,
Massimo.
-- 
"Ciao Rex, che cavolo di situazione eh? Due dentro, due fuori, puo' succedere di tutto!"

On Mon, 14 May 2001 22:03:59 +0000 (UTC), 
mic...@mail.com
("DelphiGuy") wrote:

Dimenticavo: per favore non postare HTML
Grazie.


Mi serve trasferire la stringa nell'array di char per poi poterlo salvare in un file binario (con le string non si puň fare)
solo la stringa? perche' non un file di testo?
var L: TStringList;
 L := TStringList.Create;
 try
  L.Add( Edit1.text );
  L.SaveToFile('c:\pippo.txt');
 finally
  L.Free;
 end;
Ciao,
Alan Solo

// carica lunghezza in a


 


Si, ma se non sò quale è l'esatta lunghezza di una stringa, come posso fare 
per leggerla?


// carica lunghezza in a
Si, ma se non sò quale è l'esatta lunghezza di una stringa, come posso fare
per leggerla?
Length(s)





Allora, il mio problema principale è 
questo:


 


Ho un file binario che contiene diversi tipi di 
dati ed anche delle stringhe null terminated,


quando arrivo a leggere la stringa null terminated, 
non sò quanto sia lungha quindi per evitare di


leggere 255 byte con il blockwrite per ricavarne 
magari 5 o 6 mi occa tornare indietro nel file con il seek


e preseguire a caricare gli altri dati. 



C'è un modo alternativo per non tornare indietro, 
leggendo direttamente la lunghezza della stringa?


 


Io adesso faccio così:


 


          
BlockRead(myfile,arraydichar,255);
          
seek(myfile,(FilePos(myfile))-255);
          
StrPCopy(arraydichar,arraydichar);