Błąd przy zapisie rekordu za pomocą strumieni.

0

Problem polega na tym, że:
mam coś takiego


TWektor = array[0..2] of char;
TStrukura = record
                     pole1 : AnsiString;
                     pole2 : Boolean;
                     pole3 : TWektor
                     pole4 : Byte;
...
var
  S : TStrukura
  TF : TFileStream;
...
  TF : TFileStream.Create(PATH, fmCreate);
  TF.WriteBuffer(S, SizeOf(S));
  TF.Free;
...
end;

Czy mógłby mi ktoś pokazać, w jaki sposób miałbym coś zmienić, aby rekord był zapisany na dysk, próbowałem zamienić zapis do plików typowanch, ale przy tym też musiałem zamieniać typ AnsiString na PChar ale wtedy miałem problemy na słowach End;

// btw. mam pytanie, za co mój post był usunięty :-/

0

WriteBuffer(S, SizeOf(S));

a czy pierwszy parametr nie powinien być wskaźnikiem ?

[<font color="green">dopisane</span>]
zmieniłem zdanie :>
teraz sądze, ze zapomniałeś o :

  tf := TFileStream.Create(f, fmOpenReadWrite);
0

Hmmm... mi podejrzany wydaje się AnsiString, jako że nie ma określonej długości. Czy błąd nie wyskakuje Ci przypadkiem podczas ODCZYTU? To jest bardziej możliwe, wg mnie.

0

ansistring zakres = 2^31 znaków

0

przy zapisie najpierw zapisujesz rozmiar ansistring, a potem zawartość zmiennej czyli:

Len: Cardinal;
...
Len := Length(nazwa zmiennej AnsiString);
Stream.WriteBuffer(Len, SizeOf(Len));
Stream.WriteBuffer(Pointer(nazwa zmiennej AnsiString)^, Len);

i odczyt:

SetLength(Nazwa zmiennej AnsiString, Len);
Stream.ReadBuffer(PChar(Nazwa zmiennej ansistring)^, Len);
0

Tak jeżeli chodzi o fmOpenreadWrite to: przy fmCreate plik jest też otwierany do zapisu

Co do błędu przy odczycie: nie wsytępował, bład był przy operacjch na łańcuchu, ponieważ miał on zerową długość.
Co do długości i zapisu przed to: o tym nie wiedziałem i zapewne to sprawdzę..i jeszcze trzeba będzie zminić procki zapisu/odczytu....

1 użytkowników online, w tym zalogowanych: 0, gości: 1