Ĺadny brzuch
Witam.
Planuję dla poszerzenia wiedzy, zabicia nudy itd napisać program, który będzie przechowywał pewne dane (różnego rodzaju) w jednym pliku. Do tego celu chcę użyć rekordów, wydają mi się odpowiednie.
Na większość pól wystarcza mi ograniczenie ilości znaków w rekordzie.
Niestety jedna rzecz będzie wymagała zgromadzenia większej ilości znaków, powyżej 255 (np. około 1000).
Czy dobrym rozwiązaniem będzie coś w stylu:
type
TOsoba= packed record
DlugaTresc: array of String[255]; //czy tam array[0..9], nie wiem, czy dynamiczne tablice mogą być w rekordach
//nie bawiłem się w to jeszcze, Length zwiększać o 1 (wcześniej podzielę długość znaków w memo przez 255)
//do tego Low(tablica), High(tablica)
end;
I dane z TMemo np. 900 znaków będzie dzielona na części po 255 znaków i pakowana do tej tablicy?
A przy wczytywaniu rekordów do TMemo użyję: Copy i w pętelce będę łączył te tablice DlugaTresc.
Wszystko powinno działać.
Jeśli ten pomysł jest w porządku to dobrze, w przeciwnym razie proszę o jakieś wskazówki na inny sposób.
więc tak, kiedy zapisujesz dane do pliku to w momencie gdy użyjesz typu string bez podania długości, zapisany zostanie wskaźnik czyli zupełnie nie to o co chodzi :)
bawienie się w dzielenie na kawałki jest bez sensu, bo zawsze ogranicza Cię długość. Dlatego proponowałbym przy zapisie stosować format
[długość1][tekst_o_długości1] - czyli najpierw zapisujesz do pliku wynik length(string) a poźniej wszystkie znaki stringa.
Przy odczycie wczytujesz najpierw długość, później do bufora ładujesz dane o odczytanej długości.
Druga metoda to oczywiście null-terminated string czyli po zapisaniu znaków zapisujesz znak #0. Gdy przy odczycie trafisz na #0 wiesz że przyszła pora na następne pole ;)
@migajek: on chyba chciał użyć jednak bazy opartej na plikach typowanych, a to, co mu podajesz to czytanie z pliku "na żywca":)
ja polecam zapoznać się z tym: http://4programmers....SQLite_w_Delphi
SQLite jest całkiem dobrym rozwiązaniem i też opiera się na jednym pliku (chyba, że ktoś woli kilka baz w różnych plikach) i pozwala na deklarację tekstu o nieokreślonej długości.
@migajek: on chyba chciał użyć jednak bazy opartej na plikach typowanych, a to, co mu podajesz to czytanie z pliku "na żywca":)
ja polecam zapoznać się z tym: http://4programmers....SQLite_w_Delphi
SQLite jest całkiem dobrym rozwiązaniem i też opiera się na jednym pliku (chyba, że ktoś woli kilka baz w różnych plikach) i pozwala na deklarację tekstu o nieokreślonej długości.
chyba trochę wyważasz otwarte drzwi :) do tak prostych rzeczy lepiej chyba "normalnie" ;) zwłaszcza jeśli autor chce się przy tym czegoś nauczyć :P
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Planuję dla poszerzenia wiedzy, zabicia nudy itd napisać program, który będzie przechowywał pewne dane (różnego rodzaju) w jednym pliku. Do tego celu chcę użyć rekordów, wydają mi się odpowiednie.
Na większość pól wystarcza mi ograniczenie ilości znaków w rekordzie.
Niestety jedna rzecz będzie wymagała zgromadzenia większej ilości znaków, powyżej 255 (np. około 1000).
Czy dobrym rozwiązaniem będzie coś w stylu:
type
TOsoba= packed record
DlugaTresc: array of String[255]; //czy tam array[0..9], nie wiem, czy dynamiczne tablice mogą być w rekordach
//nie bawiłem się w to jeszcze, Length zwiększać o 1 (wcześniej podzielę długość znaków w memo przez 255)
//do tego Low(tablica), High(tablica)
end;
I dane z TMemo np. 900 znaków będzie dzielona na części po 255 znaków i pakowana do tej tablicy?
A przy wczytywaniu rekordów do TMemo użyję: Copy i w pętelce będę łączył te tablice DlugaTresc.
Wszystko powinno działać.
Jeśli ten pomysł jest w porządku to dobrze, w przeciwnym razie proszę o jakieś wskazówki na inny sposób.
więc tak, kiedy zapisujesz dane do pliku to w momencie gdy użyjesz typu string bez podania długości, zapisany zostanie wskaźnik czyli zupełnie nie to o co chodzi :)
bawienie się w dzielenie na kawałki jest bez sensu, bo zawsze ogranicza Cię długość. Dlatego proponowałbym przy zapisie stosować format
[długość1][tekst_o_długości1] - czyli najpierw zapisujesz do pliku wynik length(string) a poźniej wszystkie znaki stringa.
Przy odczycie wczytujesz najpierw długość, później do bufora ładujesz dane o odczytanej długości.
Druga metoda to oczywiście null-terminated string czyli po zapisaniu znaków zapisujesz znak #0. Gdy przy odczycie trafisz na #0 wiesz że przyszła pora na następne pole ;)
@migajek: on chyba chciał użyć jednak bazy opartej na plikach typowanych, a to, co mu podajesz to czytanie z pliku "na żywca":)
ja polecam zapoznać się z tym: http://4programmers....SQLite_w_Delphi
SQLite jest całkiem dobrym rozwiązaniem i też opiera się na jednym pliku (chyba, że ktoś woli kilka baz w różnych plikach) i pozwala na deklarację tekstu o nieokreślonej długości.
@migajek: on chyba chciał użyć jednak bazy opartej na plikach typowanych, a to, co mu podajesz to czytanie z pliku "na żywca":)
ja polecam zapoznać się z tym: http://4programmers....SQLite_w_Delphi
SQLite jest całkiem dobrym rozwiązaniem i też opiera się na jednym pliku (chyba, że ktoś woli kilka baz w różnych plikach) i pozwala na deklarację tekstu o nieokreślonej długości.
chyba trochę wyważasz otwarte drzwi :) do tak prostych rzeczy lepiej chyba "normalnie" ;) zwłaszcza jeśli autor chce się przy tym czegoś nauczyć :P