jak Rozpoznać strukturę pliku rekordowego??

0

Jak w temacie. Czy jest <ort>w ogóle</ort> możliwe żeby rozpoznać strtukurę pliku.

Problem jest taki:

piszę programik który operuje na plikach rekordowych ( swoje dane przechowuje w tych plikach )
Napisałem kolejną wersję gdzie dodałem jeszcze jedno pole do rekordu.
Z tego programu ort! już parę osób ale z wcześniejszej wersji.
Chciałbym aby program po odpaleniu sprawdził czy plik rekoprdowy jest w odpowiedniej wersji, jak nie to żeby przekonwertował go do takowej.
Myslałem, że wystarczy sprawdzić czy program czasem się nie wysypie przy odczytaniu np. pliku o strukturze2 do typu struktura1. Ale on się niewysypuje tylko czyta bztedy.

Proszę o pomoc
Zgóry dzięki i sorki jeśli takie pytanie już się znalazło na forum. Ja go nie znalazłem a jestem na modemie i niestać mnie na buszowanie po forum aby poszukać dokładnie..

pozdrawiam
Rados

0

Nie da się. Jeżeli nie umieściłeś we wcześniejszej wersji jakiejś stałej, po której mógłbyś identyfikować plik to popełniłeś jeden z największych błędów w programach "na jeden raz". Takie możesz pisać sobie do pomocy, ale jeżeli coś wydajesz, to chociaż ze dwa znaczki stałe dodaj (jakiś nagłówek), aby można było rozpoznać typ pliku.

0

W pewnym sensie można... Tzn. możesz sprawdzić, czy plik jest w starej wersji...
Po prostu powinieneś sprawdzić jego wagę...

Każdy plik rekordowy ma swoją określoną objętość... nawet jeżeli jest pusty(przynajmniej tak powinno być).

Więc jeżeli np. w starym pliku masz 5 rekordów, a w nowym 6, znaczy to, że plik nowego typu pewnie będzie większy...

0

Jedyny sposób, to musisz znależć jakąś różnice pewniaka w tych dwóch plikach, np wcześniej wspomniana liczba rekordów, albo ... no nie wiem, jak te pliki są inne, bo mają inną wersje to muszą sie jakoś różnić, bo inaczej bylyby tej samej wersji.

0

Juhas ---> tez myslalem o tym ( to znaczy o tej wadze pliku )
Jednak moja idea padla. Nie wiem dlaczego moze jest to spowodowane tym ze roznica jest bardzo mala jesli chodzi o strukture a bardzo duza jesli chodzi o funkcjonalnosc. Roznica to jedna zmienna typu byte.
I zarowno w starej wersji jak i wnowej wielkosci pliku z jednym rekordem wynosi 160 bajtow. I wielkosc ta zwieksza sie symetrycznie wraz z iloscia rekordow. Kapa.

Musze pomyslec nad tym pewniakiem ale to tez jest lipa bo nie wiadomo czy uzytkownik wpisal cos w to pole czy zostil je puste. Chyba jest za duzo wyjatkow zeby mogl byc pewniak.

Pozdrawiam
Rados

0

No ale chyba musi być jakaś różnica pomiędzy nimi, jak jest, to da sie je rozróżnić a jak nie ma to są tej samej wersji !!
Jeżeli jednak nie możesz znależć tego pewniaka to jest jeszcze jedna możliwość: znależć jakiś bajt, czy ciąg bajtów x, które zawsze będą się zawierać w jakimść przedziale y. Teraz w każnej nowej wersji zapisywać w tym miejscu wersje nowego pliku w formacie nie zawierającym się przedziale y. I tak, jeżeli tym miejscu znajdzie sie liczba zawierająca sie w tym przedziale, to jest on wersji 1.0. Jak nie, to odczytaj wersje zapisaną w tym miejscu.

0

Juhas: jesteś pewien tego co powiedziałeś?
Przykład:
type TTyp1 = record
a, b: Byte;
end;
type TTyp2 = record
a, b: Byte;
c: Word;
end;
W pliku mamy zapisne wartości (podam szesnastkowo i ciągle, tak jak to widzi program):
01020304
Jeżeli jest to plik pierwszego typu to zawiera dwa rekordy z wartościami
a = 1, b = 2 i a = 3, b = 4
Jeżeli jest to plik drugiego typu to zawiera jeden rekord z wartościami
a = 1, b = 2, c = $304
Więc wszystko dobrze. W jednym mamy dwa, a w drugim tylko jeden. Ale teraz pytanie: skąd wiesz ile rekordów jest w pliku? Przecież plik może zawierać nieokreśloną liczbę rekordów. To nie jest jeden rekord.
A co do pustego pliku, to on zawsze będzie miał rozmiar zero, czyli nie zawiera żadnego rekordu, żadnego typu.

0
  1. ... a może programik, który "przekonwertuje" pliki danych starszej wersji programu na nowe. W nowe pole rekordu wstaw opcjonalnie jakąś wartość. Przy instalacji nowej wersji Twojego programu, najpierw uruchamiałby się program konwertujący.
    2)... a może po zainstalowaniu nowej wersji Twojego programu zapamiętać datę, czas i stosować ją jako odnośnik czy plik danych jest starej wersji czy nowej.

Oba pomysły mają jednak wadę. Kiedy użytkownik będzie korzystał na przemian z pierwszej i drugiej wersji programu może być nieciekawie.

Pozdrawiam

0

Mam !!!!!!!!!!!!!!!!
Użyj innego rozszerzenia !!!!

A najlepiej jakbyś jeszcze <ort>napisałstruktóre </ort>tych rekordów w starej i nowej wersji, oraz czy liczba rekordów jest konkretnie ustalona.

0

Jesli poprzednia wersja pliku jest tylko jedna, to do drugiej dodaj jakiś stały nagłówek, który będziesz (zmieniony oczywiście) dodawał do każdej następnej wersji pliku. Jeśli plik nie posiada nagłówka, to jest to stara wersja, którą należy przekonwertować, jeśli posiada, rozpoznajesz wersję po nagłówku.

0

thenkles: a co, jeżeli w starym nie ma żadnego nagłówka i przez przypadek zdarzy się, że dane ułożą się w taki sam nagłówek jak w nowym pliku?
Sądzę, że inne rozszerzenie jest najlepszym wyjściem z tej sytacji :)

0

No właśnie, i w tym problem. Ale jeżeli początkowe bajt(y) w starym pliku układają sie w określonym przedziale to wersje można zapisać w formacie wykraczającym poza ten przedział.
Np. jeżeli w pierwszym bajcie znajdowałby się wiek, to na pewno nie przekroczy on 200. Więc można wersje zapisywać 202 - wersją 2, 203 - wersja 3. I teraz, jeżeli ten bajt to x:
if x<200 then wersja:=1 else wersja:=x-200;

0

Ja zawsze dodaję na początku record:

Header = record
Typ: array[1..3] of byte; //lub char
Program: word; //co to za program
Wersja: byte;

jest to bardzo przydatne gdy program używa kilka rodzajów plików.

0

No ale stara wersja pliku nie posiada header, a autor programu też ją chce obsugiwać.

0

Można jakoś tak:

var
R1: jakisrecord;
R2: jakisrecord1;
F1: file of jakisrecord;
F2: file of jakisrecord1;

begin

assignfile(f1, plik);
assignfile(f2, plik);

reset(f1);
reset(f2);

wersja:=0;

{-I}
read(f1, r1);
if ioerror<>0 then
begin

read(f2, 2);
if ioerror<>0 then
begin

 end

 else wersja:=2;

end

else wersja:=1;

{+I}

end;

to jest taki pseudokod, bo pisałem na sucho. chodzi mi oto abyście zrozumieli pomysł.

0

Tylko, że nie będzie błędu odczytu, bo to jak zinterpretujemy dane, zależy od nas. Te same dane mogą być poprawnie odczytane zarówno jako jeden, jak i drugi rekord.

0

mozna wykorzystac wage pliku wewnetrznie tzn policzyc ile bajtow danych ma stara wersja, odczytac tyle i jezeli nie ma znacznika konca pliku to znaczy ze jest to nowa wersja - tu sie moge mylic bo nie znam sie na strukturze zapisu rekordow

mozna tez zawsze kazac mu czytac jako nowa wersje i jezeli na koncu beda bzdury (nil?) to uznac za stara wersje

0

thenkles: a co, jeżeli w starym nie ma żadnego nagłówka i przez przypadek zdarzy się, że dane ułożą się w taki sam nagłówek jak w nowym pliku?

Wtedy będzie źle. Ale jak zrobi się odpowedni (dłuższy niż kilka bajtów) nagłówek, który np. układa si.ę w nazwę programu i wersję, to bedzie bardzo małe prawdopodobieństwo, iż przypadkowo dostaniemy taki zestaw bajtów. Wiem, że program powinien zawsze działać dobrze, ale to chyba najlepsze i najprostsze rozwiązanie.

0

Wielkie dzięki. Naprawdę w tym momecie mi pomogliście.
Faktycznie teraz najprościej chyba zmienić<ort> rozszeżenie</ort> pliku. I do nowego dodać nagłówek z wersją pliku.

100 kroć THX

Pozdro
Rados

0

feerial i wszyscy proponujący "wagę" jako wzór: proponuję jednak poczytać o plikach rekordowych, bo wygląda, jakbyście uważali, że w pliku jest tylko jeden rekord, albo że z każdym plikiem jest skojarzony konkretny typ rekordu.

0

A ja dalej nie wiem czy liczba rekordów jest z góry określona

0

Nie liczba rekordów nie jest z góry ustalona. Jest to swego rodzaju baza danych więc rekordy się zwiększają wraz z ilością elementów.

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