Hol hibázok? (Free Pascal, Típusos fájlkezelés)
A teljes program a következő:
program lotto;
uses crt;
var
a:array[1..51,1..5] of byte;
i,j:byte;
F:file of byte;
begin
clrscr;
assign(F, 'D:\lottosz.dat');
reset(F);
for i:=1 to 51 do
begin
for j:=1 to 5 do
begin
read(F,a[i,j]);
write(a[i,j],' ');
end;
writeln;
end;
close(F);
repeat until keypressed;
end.
Tehát adott egy fájl, 51 sor, soronként szóközzel elválasztva 5 szám.
Hiba: A beolvasás elméletig végrehajtódik, a beolvasott számoknak viszont semmi köze a fájlban lévő számokhoz.
Két napja ezen forgok, holnap emelt érettségizek informatikából és kétségbe vagyok esve xD
Segítsetek!
Köszönöm előre is!
csak 1 hibat vetettel:
F:file of byte; -->> text
Szia.
Bájtos filetipus nem szövegfájlra vonatkozik, hanem bináris fájlra, szövegfájl esetén a szövegfájlban lévő bájtokat olvasod be egyessével igy egy szám két bájton is lehet, (pl. 25-ös nyerőszám esetén a két érték amit megkapsz 50 és 53 a "2" ascii kódja = 50 és az "5"-ös ascii kódja 53 + kezelni kellene a számokat elválasztó szóközöket is)
Word, Integer, Longint, Real, és a szám tipusok ugyanazért nem jók mint a bájtos tipus.
Ha a File tipusát mint Text-et elveted akkor csak a rekord tipus jöhet szóba vagy a karakteres tipus (chr) (String tipus sem játtszik mert a hosszát is keresi - nincs a szövegfájlban letárolva a string hossza ), Ha rekord tipus akkor :
Type lottorec = record
egy : chr ;
ket : chr ;
end ;
F: File of lottorec ;
Itt meg a következő gondokat kell lekezelni :
1. Minden nyerőszámnak (a filében) két karakteren kell tárolódnia amelyik számnak nem két karakteres a hossza ott 0-t kell használni (egyébbként elcsúszik a beolvasás, pl. "9" helyet "09")
2. A két karakterből még el kell késziteni a nyerőszámot
valmi hasonló módszerrel : A[i,j]:=(ord (egy)-48)*10+ord (ket) ;
Ha karakteres tipus ott is ugyan az van mint a rekordnál kezelni kell a két karakteres számokat+a számokat elválasztó szóközöketis, és itt is el kell késziteni a karakterből a nyerőszámot.
Tehát a legjobb megoldás a TEXT, mert abból simán be lehet olvasni a számokat
A megfolgalmazásod nem tipusos fájlra utal : "Tehát adott egy fájl, 51 sor, soronként szóközzel elválasztva 5 szám." Ez tipikus TEXT fájl.
Sok sikert.
Üdv.
Szia coopper!
És mi a helyzet akkor, ha pl. a fájlomban tárolva vannak nevek és életkorok?
Pl. a fájl:
Kiss Rita 16
Nagy Aladár 18
Hegyi Vivi 21
Ez akkor ugye már egy típusos fájl.
Légyszíves írd le magát a programot, hogy ebben az esetben, hogy olvasnád be az adatokat.
Köszi a segítséget előre is!
Szia.
A példád sem tipusos fájl, az is sima TEXT fájl (illetve karakter tipus).
Akkor lenne az, ha a 16-ost, 18-ast, 21-est nem látnád, helyette bináris karakterek lennének és a szöveg elején ott lenne a hossz (binárisan) és mind egyforma hosszú lenne és egy sorban lennének, nem soronként :
TEXT :
Kovács József 35
Kiss Péter 65
Rekord Tipus :
!Kovács József #!Kiss Péter A
Rekord szerkezete :
Type Emberek=record
Nev : string[33];
Kor : byte ;
end ;
(A szöveg csak azért lett 33-hosszú, hogy ki tudjam irni az ascii 33-at = "!" jelet, egyébbként egy string[20]-ban 20-at kellene irnom (egy karakteren), amit sajnos nem fogad el a GYK).
Üdv.
Sajnos a GYK kiszedi a többszörös szóközöket a hozzászólásból, de megpróbálom aláhuzásjelekkel tehát :
TEXT :
Kovács József 35
Kiss Péter 65
Rekord Tipus :
!Kovács József____________________#!Kiss Péter_______________________A
Ahol : ________________ szóközöknek felel meg.
Üdv.
"Ez akkor ugye már egy típusos fájl."
Nem ez nem igaz ez egy szöveges fájl. Attól még (text) szöveges fájl marad mert te szóközzel elválasztva soronként ilyen adatokat tartalmaz a fájl.
Ezt szöveges fájlként soronként beolvasod (egy stringbe) majd ezt a stinget minden beolvasás után szétszeded, a szóközöket figyelembe véve.
pl: "Kiss Rita 16" Ebből lesz egy "Kiss Rita" string és egy "16" string a "16" string-et konvertálni kell szám típusra pl integer-re.
Egy típusos fájlba nincsenek sorok. Arra úgy lehet tekinteni, mint egy tömb fájlba lévő memóriaképére.
Ez fog egy típusos fájlt létrehozni:
type
Szemely=record
nev:string[40];
kor:integer;
end;
var
sz:array [1..3] of Szemely;
f:file of Szemely;
begin
sz[1].nev:='Kiss Rita';
sz[1].kor:=16;
sz[2].nev:='Nagy Aladar';
sz[2].kor:=18;
sz[3].nev:='Hegyi Vivi';
sz[3].kor:=21;
assign(f,'ki.dat');
rewrite(f);
write(f,sz[1],sz[2],sz[3]);
close(f);
end.
Ha megnyitod commanderrel F3-al akkor nem fogsz benne pl 16-ot látni. Hexa nézetben látszik a byte-ok sorozatának hexadecimális alakja, ki lehet számolni hogy milyen byte pozíciótól kezdődve meddig tart az integer, ebből ki lehet számolni hogy ez a bináris bytesorozat milyen (integer) szám értéket tartalmaz. Gyakorlatilag mintha csak a tömb memóriaképét néznénk.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!