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
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
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!
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
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.
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
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.
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
"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.
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, 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!