witam
w jaki sposób zamienić dane z pliku w takim formacie:
imie;nazwisko;adres; na plik z rekordami?
Normalnie!!
Gdybyś popróbował i się pomęczył ze 3h to byś wiedział. Ja tak zawsze robie nim zapytam kogoś o pomoc.
Tworzysz typ rekordowy, deklarujesz plik typowany.
Potem tylko rozdzielasz tego stringa z ';' i pakujesz do rekordu i następnie zapisujesz.
Type TLosowanieLotka=Record
Data:String;
Blabla1:String;
Liczby:Array[0..19] of Byte;
End;
Plik typowany: Var Plik:File Of TLosowanieLotka;
Popierwsze tworzysz nowy typ record o strukturze jaka wymagasz.
Potem procedurka zczytujaca plik wejsciowy (readln) i wyluskujaca lancuchy pomiedy srednikami. To co wyluska przyporzadkowuje do odpowiednich pol rekordu czyli rekord.nazwisko:= lancuch1, itd...
A gotowy rekord zapisuje do nowego pliku typu File of TypTwojRecordu.
No i masz nowy plik. [browar]
Dobra..... :|
Pomóżcie mi jedynie z procedurą zczytującą string między średnikami...
bo z tym mam kłopot.. [glowa]
z resztą sobie poradzę :-8
Robisz TStringList, i dajesz coś takiego StringList.text:=StringReplace(Linia,';',#13#10,[rfReplaceAll]); i potem masz w StringList.Strings[nr stringa] pozycje.
Type TLosowanieLotka=Record
Data:String;
Blabla1:String;
Liczby:Array[0..19] of Byte;
End;Plik typowany: Var Plik:File Of TLosowanieLotka;
BŁĄD!!!! W rekordzie zapisywanym do pliku nie można użyać długich stringów. Stringi są dynamiczne, czyli są wskaźnikami. W powyższym przykładzie jako Data i Blabla1 zostaną zapisane tylko 4-bajtowe wskaźniki dołańcuchów, a nie zawartość tych łańcuchów. Oczywiście przy późniejszym odczycie te wskaźniki będą bez sensu a zawartość łańcuchów nie zostanie odzyskana. A nawet jakby się zapisały, to długie stringi mają z definicji zmienną długość, więc skąd program przy odczycie ma znać wielkości pól rekordu?? Do rekordów należy uzywać krótkich stringów (np. string[10] - uwaga, w rekordzie zajmie 11 bajtów) albo array[0..9] of char.
I jeszcze jedno - do plików lepiej uzywać packed record. Zwykły record jest dla przyspieszenia zapisywany z wyrównywaniem pól, tzn między pola są wstawiane dodatkowe bajty. Jeśli plik bedzie czytany programem napisanym w czym innym (lub skompilowanym z innymi opcjami wyrównywania pól) t się może skopać.
pq to był przykład na zachętę, nigdy nie chce podawać gotowego rozwiązania, niech sobie człowiek pomyśli i wysili się skoro ta ma być jego program no nie??
pq całokowicie się z tobą zgadzam, bo String może pomieścić 2GB a może i 40 bajtów. [cya]
Co do oddzielania stringów średnikami to trochę głupi pomysł. Najlepiej trochę pomyśleć i... Stringa zamienić na array of char, a przed nim wstawić informacje o długości (byte, word, longword)