[Delphi] Odczytywanie AnsiString z pliku

[Delphi] Odczytywanie AnsiString z pliku
0

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

Kopiuj
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:

Kopiuj
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ć

Kopiuj
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?

migajek
  • Rejestracja:ponad 21 lat
  • Ostatnio:ponad 6 lat
  • Postów:370
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 :(

Bula
  • Rejestracja:ponad 20 lat
  • Ostatnio:ponad 14 lat
  • Postów:263
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


Nowe pomysły są inną kombinacją starych elementów. Nie ma nowych elementów. Są tylko nowe kombinacje.
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.

prgtw
  • Rejestracja:prawie 23 lata
  • Ostatnio:około 5 lat
  • Postów:255
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:

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

lub

Kopiuj
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)
Kopiuj
FillChar(Komentarz,0,Długość);
Stream.ReadBuffer(Komentarz, Dlugosc);

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

Kopiuj
TEdit.Text := Komentarz

lub ShowMessage(Komentarz)

Kopiuj
)


 > ##### 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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.