[Delphi] Odczytywanie AnsiString z pliku

0

Zapisuję do pliku dane, w których występuje zmienna typu AnsiString.

TData = record
  ID: integer;
  Nazwa: string[30];
  //I jeszcze kilka zmiennych.
  end;
Komentarz: array of AnsiString; //Może zawierać powyżej 255 znaków

Procedura zapisu wygląda w ten sposób:

var
plik: TFileStream;
rec: TData;
n: integer;
begin
   plik := TFileStream.Create('plik', fmCreate);
   plik.WriteBuffer(liczbaRekordow, SizeOf(liczbaRekordow)); //liczbaRekordow: integer
   for i := 0 to liczbaRekordow do
   begin
      plik.WriteBuffer(rec, SizeOf(rec));
      n := Length(Komentarz[i]);
      plik.WriteBuffer(n, SizeOf(n));
      plik.WriteBuffer(PChar(Komentarz[i])^, n);
   end;
   plik.Free;
end;

Jak próbuję to później odczytać

plik.ReadBuffer(n, SizeOf(n)) //Długość stringu
plik.ReadBuffer(Komentarz[i], n);

to wywala Access Violation. Problem występuje tylko z tą zmienną, bo jak ją usunę to wszystko jest ok.
Co powoduje ten problem?

0

a spojrzales na rozmiar pliku czy pasuje? Bo ja sie troche meczylem nad zapisem stringa do pliku i w koncu zrobilem to tak ze zapisuje w dwoch bajtach dlugosc tekstu a pozniej po jednej literce. Przy odczycie pela od 1 do Odczytana_dlugosc i po jednym znaku do stringa. Wiem ze malo odkrywcze, ale dziala ;P

0
migajek napisał(a)

a spojrzales na rozmiar pliku czy pasuje?

Obejrzałem nawet plik w notatniku i zawiera wszystkie teksty co były zapisywane, ale nie można ich odczytać i nie wiem dlaczego :(

0

Strzelam - trzeba się ustawić na początku streama

// Nie doczytałem, że problem jest tylko z tą zmienną. Zwróć jeszcze uwagę, że zapisujesz inaczej niż odczytujesz. Może gdzieś tam jest błąd

0

Zapisuję na pewno prawidłowo (wziąłem to z helpa), a przy odczycie jest Access Violation i nie wiem o co dokładnie chodzi.

0
napisał(a)

Zapisuję na pewno prawidłowo (wziąłem to z helpa), a przy odczycie jest Access Violation i nie wiem o co dokładnie chodzi.

Access Violation jest generowany przy odniesieniu się do komórek pamięci które nie są przydzielone dla Twojej aplikacji, bądź jeżeli są zarezerwowane (tylko dla odczytu) lub jeżeli pamięć dla zmiennej nie jest w ogóle przydzielona.

Może spróbuj tak:

FillChar(Komentarz,0,Długość);
Stream.ReadBuffer(Komentarz, Dlugosc);

lub

FillChar(Komentarz[1],0,Długość);
Stream.ReadBuffer(Komentarz[1], Dlugosc);

Wypróbuj obydwie metody i potem napisz czy działa.

0
prgtw napisał(a)
FillChar(Komentarz,0,Długość);
Stream.ReadBuffer(Komentarz, Dlugosc);

EAccessViolation pojawia się w momencie, gdy próbuję przypisać zmienną (

TEdit.Text := Komentarz

lub ShowMessage(Komentarz)

)


 > ##### prgtw napisał(a)
> 
```delphi
FillChar(Komentarz[1],0,Długość);
Stream.ReadBuffer(Komentarz[1], Dlugosc);

EReadError: Błąd odczytu strumienia, Nieprawidłowy dostęp do komórki pamięci - podczas ReadBuffer

0

Już sobie poradziłem.

Jeśli ktoś szuka rozwiązania to odsyłam http://bdn.borland.com/article/0,1410,26416,00.html.

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