[Delphi] FileStream begint met Chr(8) ?

Pagina: 1
Acties:

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
Als ik een nieuwe file aanmaak ...
code:
1
2
3
4
5
6
var TempString: String[10];
    FileStream: TFileStream;

begin

FileStream:=TFileStream.Create('c:\Test.Txt',fmCreate);

... en ik ga daarin schrijven ...
code:
1
2
3
4
FileStream.Seek(0,soFromBeginning);

TempString:='00000001'+Chr(13)+Chr(10);
FileStream.Write(TempString, 10);

... en ik open 'em daarna weer en geef alle karakters + hun ordinate weer in een memo, dan zie ik dat het allereerste karakter nummer 10 heeft, da's dus een CR. Maar waarom staat die er VOOR en niet er na? Waarom dat 'ie daar staat is me helemaal niet duidelijk. En dan ook nog eens hoe ik 'em weg krijg !

Dus: Hoe krijg ik die Chr(10) op de eerste regel weg ?



edit: Oh my er klopte niks van mijn verhaal. Nu wel :)

Mother, will they like this song?


Verwijderd

code:
1
FileStream.Write(PChar(TempString)^, 10)

Voor strings, uit mijn hoofd..

  • PipoDeClown
  • Registratie: September 2000
  • Niet online

PipoDeClown

Izze Zimpell

kan delphi geen lege files aanmaken ofzo?

God weet alles, want hij is lid van de Mosad. To protect your freedom i will take that away from you. Mijn drankgebruik heeft ernstig te lijden onder mijn gezondheid.


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 10:45

Creepy

Tactical Espionage Splatterer

Op dinsdag 23 juli 2002 19:07 schreef PipoDeClown het volgende:
kan delphi geen lege files aanmaken ofzo?
Jawel.

Het "probleem" hier is dat ie een string weg schrijft. De eerste byte van een string variabele bevat de lengte van de string (een overblijfsel van Pascal). Bij de tweede byte begint de string dus echt.

Als je de string cast naar een pchar, zal dit niet zo zijn, maar dan vind je aan het einde van je string een 0 terug, want dat is het karakter om het einde van een pchar aan te geven (als je sizeof gebruikt voor het aangeven van de size voor het wegschrijven)

Je string in een array of char omzetten, en deze aan de filestream meegeven is waarschijnlijk een oplossing. Een andere oplossing is een file of byte aanmaken, en hierin per byte gaan schrijven (of complete stukken geheugen m.b.v. blockwrite)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Heeft te maken of je pascalstring of een null-terminated string hebt. Een pascalstring begint altijd bij index 1, dus een string 'blah' ziet er zo uit:

[4][b][l][a][h]
0 1 2 3 4

die 4 geeft de lengte aan van de string. Een null-terminated string is:

[b][l][a][h][#0]
1 2 3 4

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 10:45

Creepy

Tactical Espionage Splatterer

Op woensdag 24 juli 2002 09:48 schreef Wibber het volgende:
Heeft te maken of je pascalstring of een null-terminated string hebt. Een pascalstring begint altijd bij index 1, dus een string 'blah' ziet er zo uit:

[4][b][l][a][h]
0 1 2 3 4

die 4 geeft de lengte aan van de string. Een null-terminated string is:

[b][l][a][h][#0]
1 2 3 4
Tja.. kan me herinneren dat ik ook zoiets gezegd hebt! :P

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Tja... misschien moet ik de thread wat beter lezen :) sorry

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 13:23

Tomatoman

Fulltime prutser

Bij een string van het type ShortString staat op positie 0 inderdaad altijd de lengte. Vanaf Delphi 2 kent het type 'string' een nieuwe implementatie, die echter verschillend is van een null-terminated string. Voor het woord 'fiets' is dit de geheugenlayout:
code:
1
2
3
4
5
6
7
8
9
10
11
12
         ShortString            string
         ===========            ======

positie:   0  1  2  3  4  5  6    0  1  2  3  4  5  6
letter:    #5 f  i  e  t  s  ?    ?  f  i  e  t  s  ?


         PChar (null-terminated string)
         =====

positie:   0  1  2  3  4  5  6
letter:    #5 f  i  e  t  s  #0

#5 Betekent hier de byte-waarde 5, ? betekent: waarde onbekend.

Tot dusverre staat op positie 0 bij een string (dus: string[0]) altijd de lengte van de string en daarvóór op een negatieve offset de reference count van de string. De precieze layout heeft Borland nooit gepubliceerd, omdat de implementatie in de toekomst kan wijzigen. Bij een string S van het type 'string' mag je dus NIET S[0] gebruiken om de lengte van de string te lezen! Daarvoor gebruik je Length(S).

Een goede grap mag vrienden kosten.


  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
Right :)


Omdat ik uit het PChar gedeelte niet uitkwam (pointers, nooit geleerd :)), heb ik het zo opgelost :
code:
1
2
3
4
5
  for x:=1 to 10 do
    begin
    Character:=TempString[x];
    FileStream.Write(Character, 1);
    end;

Thanks !

Mother, will they like this song?

Pagina: 1