Fájlkezelés

Ahhoz, hogy egy fájlba belelássunk, először meg kell nyitni, kiolvasunk, beírunk adatokat, majd ha kész vagyunk, lezárjuk. Hasonlóan egy könyvhöz, ha akarunk belőle olvasni, először ki kell nyitnunk, olvasunk, írunk belőle/bele, majd becsukjuk.
QBASIC-ben az OPEN paranccsal nyitunk, a CLOSE-zal zárunk. Az írás, olvasás kicsit bonyolítva van attól függően, hogy milyen típusú fájlt írunk vagy olvasunk, másképp kell megnyitnunk.

OPEN fajlnev [FOR mode] [ACCESS] [LOCK] AS [#]fajlszam [LEN=rekordhossz]

A fájlnévnek az elérési utat is tartalmaznia kell, ha nincs az aktuális könyvtárban.
Az ötféle mód:

  • OUTPUT: szekvenciális fájl írása.
  • INPUT: szekvenciális fájl olvasása.
  • APPEND: szekvenciális fájl bővítése, a fájlmutatót a fájl végére irányítja, vagy a rekordszámot az utolsó rekordra. Ezután PRINT vagy WRITE utasításokkal lehet hozzáírni.
  • RANDOM: Ez az alapértelmezett mód. Rekordonkénti írás/olvasás.
  • BINARY A fájl bináris megnyitása. A fájlt GET-tel olvasni, PUT-tal írni lehet, akár bájtonként.
CLOSE #fajlszam
Lezárja a fájlt.

PRINT# fileszam, valtozo
WRITE# fileszam, valtozo
Szekvenciális fájlba írnak mindketten, de a WRITE# egy vesszőt is kitesz minden írásnál.

INPUT$(n, fajlszam)
A megnyitott fájlból n darab bájtot olvas egy sztringbe, tehát n nem lehet nagyobb 32.767-nél, vagy a rekordméretnél, ha RANDOM-mal nyitottuk meg.

LINE INPUT fajlszam%, sztringvaltozo$
Ezzel az utasítással egy sztringet lehet beírni egy fájlba.

INPUT fajlszam%, valtozo
Ezzel pedig egy akármilyen változót.

SEEK #fileszam, pozicio&
A pozíció RANDOM fájloknál a rekordot, az összes többi megnyitási módnál pedig az éppen olvasott, irt bájtot jelenti. Típusát tekintve LONG. Az első rekord, bájt helyét 1, a másodikét 2, és így tovább...

fajlszam%= FREEFILE
Egy üres fájlszámot ad vissza (0-255).

mutato&= LOC
Az aktuális fájlmutató helyzetét adja meg.

meret&= LOF
A fájl mérete.

EOF(fajlszam)
Boolean kifejezés, fájl vége jel. Ha már nincs több beolvasnivaló adat, TRUE (-1) értéke lesz.

valami= FILEATTR(fileszam, attr)
Random fájlok: A Rekordok méretét a LEN kulcsszóval állíthatjuk be. Az alapértelmezett szekvenciális fájl esetén 512 bájt, random fájl esetén 128 bájt.
Bináris fájlok: Minden egyes bájtját el tudjuk érni. Ha nem adjuk meg pozíciót, a legutoljára beolvasott bájt utánit fogja kiolvasni. Fájlformátumok olvasásánál előszeretettel használják.

Lemezegység

CHDIR sztring$
CHangeDIRectory, könyvtárat válthatunk.

MKDIR konyvtar$
MaKeDIRectory, könyvtárat hozhatunk létre.

RMDIR konyvtar$
ReMoveDIRectory, könyvtárat törli.

KILL filenev$
A filenev nevű fájlt törölhetjük.

NAME filenev1$ AS filenev2$
A DOS-os rename-nek felel meg, vagyis a fájl nevét, illetve kiterjesztését változtathatjuk meg.

FILES
Az aktuális könyvtárban lévő fájlokat írja ki a képernyőre.

Matematikai műveletek

Szögfüggvények. Egy közös bennük, mindegyiknek radiánban kell megadni értékét.

CONST Pi= 3.1415926

radian= fok*Pi/180

LOG(), EXP(), SQR()
Logaritmus, exponens és négyzetgyök.

ABS(), SGN()
Abszolutérték és előjel.
abszolut= ABS(-56) ' =56
elojel= SGN(56) ' =1

Logikai műveletek

Eltolás (shift) nincs QBasic-ben, mint például C-ben.

AND OR XOR NOT IMP EQV
Az and-et bizonyos bitek törlésére egy maszk segítségével használják. Az or az ellenkezője, azokat a biteket 1-re állíthatjuk.

bájt%= szam% AND &HFC ' $FC= 1111 1100b, az alsó két bit nulla lesz.
bájt%= szam% OR &H3 ' $3= 0000 0011b, az alsó két bit egyre állítódik.
A xor tulajdonsága, hogy ha egy egy maszkal kétszer xorolunk egy számot, ugyanazt a számot kapjuk vissza. Egy másik alkalmazása, ha egy számot önmagával xorolunk nullát kapunk eredménynek.

nulla%= bájt% XOR bájt% ' Az eredmény akármilyen szám esetében nulla lesz.
uj%= (regi% XOR maszk%) XOR maszk% ' A valtozok barmilyen erteket felvehetnek, de az
' uj% es a regi% megegyeznek, a maszk% illetve a regi%
' erteketol fuggetlenul.

Szubrutinok

Kétfajta alprogram létezik QB-ben. A SUB és a FUNCTION. Ezeket CALL szubnév, vagy simán szubnév-vel hívhatjuk meg. Ilyen egyszerű. Ennyi. Az egész leginkább arra jó, hogy ne legyen km-hosszú a program. Paramétereket is átadhatunk. A főprogram elején a szubrutinok deklarációja található.

DECLARE SUB neve (para1%, para2#, para3$)
DECLARE FUNCTION nev$ (para1&, para2!)

' Ennek a szubrutinnak nincs sok ertelme, felesleges ezert szubrutinba tenni.
SUB Kepernyotorles
  CLS
  SCREEN 13
END SUB
Függvényeknél még az bonyolítja a helyzetet, hogy maga a szubnév is átad egy értéket.

FUNCTION Igazhamis% (char$)
IF char$>" " THEN
Igazhamis%=-1
EXIT FUNCTION
END IF
Igazhamis%= 0 ' Hamis (False)
END FUNCTION

DIM SHARED: Már volt róla szó, a főprogramban így kell a globális változókat deklarálni.
STATIC: ha a fejléc alatt szerepel, az utána álló változók lokálisak lesznek, vagyis csak az a szubrutin használhatja.

Hibakezelés

ERR
ERL
Ha túlcsordulás történt vagy típus-összeférhetetlenség, akkor az interpreter megszakítja programunkat és hibajelzést ad. Ha az INPUT utasítással egy mondjuk INTEGER változóba szám helyett betűket irtunk REDO FROM START jelenik meg a képernyőn. Ezt sajnos nem tudjuk kiküszöbölni..

ON ERROR GOTO hibakezelo
' Ide a program kerul.
END
hibakezelo:
PRINT "Error kod"; ERR
PRINT "Error sor"; ERL
RESUME NEXT

Események (EVENT)

Az előző téma is esemény volt. Ezek végül is megszakításon alapulnak. Ilyen a TIMER event a COM soros port megszakításkérés, vagy a joystick STRIG event.

TIMER ON
ON TIMER(18) GOSUB idozito
DO
LOOP UNTIL INKEY$=" "
idozito:
' blabla
RESUME NEXT

PEEK, POKE

QBasicben közvetlenül ezzel a két utasítással érhetjük el a memóriát. Mivel tudjuk, hogy valós módban vagyunk, ami annyit jelent 1 MBájtot tudunk megcímezni, és szegmensek meg offszetek vannak, ezért még kell a DEF SEG is, ami a szegmenscímet tárolja.

Olvassuk ki a $40:13h cimen lévő word-öt (2 bájt):
DEF SEG = &H40
meret&=PEEK(&H13)+256*PEEK(&H14)
PRINT meret&, "kBájt szabad"
DEF SEG

Írjunk a karakteres képernyő memóriacímébe, ami mint tudjuk &HB800 szegmensen helyezkedik el. Páros számon az ASCII kód szerepel, páratlanon az attribútum.

abc$="abcdefghijklmnopqrstuvwxyz"
DEF SEG=&HB800
FOR sz=0 TO 25
POKE 2*(sz-1), ASC(MID$(abc$,sz,1))
NEXT sz

Kérdezzük le e INTEGER változó memóriában helyét és olvassuk ki onnan értékét.

valt%= 12345
DEF SEG = VARSEG(valt%)
et%=PEEK(VARPTR(valt%))+ EEK(VARPTR(valt%))

Sztringeknél egy kicsit más a helyzet. Itt az első bájt a sztring hossza. Maga a szöveg a harmadik bájttól kezdődik.

sztring$="Elso ket bajt a hossz"
DEF SEG = VARSEG(sztring$)
ofszet%=VARPTR(sztring$)
hossz%=PEEK(ofszet%)+PEEK(ofszet%+1)
FOR sz%=0 TO hossz%
PRINT PEEK(ofszet%+3+sz%);
NEXT sz%

De, ha a sztring memóriában elfoglalt helyére vagyunk kíváncsiak, akkor használjuk a SADD()-ot.

sztring$="SADD-al olvastuk"
DEF SEG = VARSEG(sztring$)
ofszet%=SADD(sztring$)
FOR sz%=0 TO LEN(sztring$)-1
PRINT PEEK(sz%);
NEXT sz%

INP, OUT

Portműveleteket e két utasítással véhezhetjük el. Egy alkalmazási példa:

DO
toggle%= toggle% XOR 2 ' 2:Num 1:Scroll 4:Caps
OUT &H60, &HED
OUT &H60, toggle%
SLEEP 1
LOOP UNTIL LEN(INKEY$)
 
 
(folytatjuk...)