Werken met bestanden in Liberty BASIC

Cursussen, tutorials
Plaats hier uw bijdrage.

Werken met bestanden in Liberty BASIC

Berichtdoor Gordon » za jun 16, 2007 5:30 pm

Hier volgt een vertaling van de help file
Code: Selecteer alles
Liberty BASIC ondersteunt bewerkingen voor de volgende bestandstypen:
Sequentiële, Binaire en Random Acess Files.

Zie ook de aparte hoofdstukken over:
OPEN, Sequentiële bestanden, Binaire bestanden, RAF bestanden, INPUT, INPUT$, INPUTTO$, LINEINPUT, PRINT

Bestanden kunnen met het OPEN commando worden gecreëerd.
Bestanden kunnen met het NAME commando anders genoemd worden.
Bestanden kunnen met het KILL commando verwijderd worden.

Wanneer een bestand wordt gelezen, geeft de functie EOF() een 0 weer als het eind van het dossier NIET is bereikt, anders geeft het een -1 weer. De lengte van een bestand kan met de functie LOF() worden verkregen. De drive specificaties voor de computer waarop een programma loopt zitten in een speciale variabele Drive$.

Het bestand waarin een programma op schijf staat is te vinden in de speciale variabele DefaultDir$. Mappen, ook wel Folders genoemd, kunnen met het commando MKDIR (makedir) worden gecreëerd. Mappen, ook wel genoemd Folders, kunnen met het commando RMDIR (removedir) worden verwijderd.

De verschillende methodes om bestanden te benaderen

Sequentiële bestanden worden van het begin tot het eind, opeenvolgend ingelezen.
Het is niet mogelijk om een stuk gegeven ergens in het midden van het bestand te lezen of te schrijven.
Uit een bestand dat voor INPUT worden geopend kan slechts worden gelezen.
Naar een bestand dat voor OUTPUT of voor APPEND (TOEVOEGEN ) worden geopend kan slechts worden geschreven. Voor meer details, zie het hoofdstuk Sequentiële bestanden.

Binaire bestanden zijn bestanden die voor binaire toegang worden geopend en zij kunnen worden gelezen of worden geschreven, beginnend bij om het even welke plaats binnen het bestand. Voor gedetailleerde informatie voor het gebruik van binaire bestanden, zie Binaire Bestanden.

Random Bestanden zijn bestanden die voor directe toegang worden geopend. Indien geopend kunnen deze bestanden willekeurig per record gelezen of beschreven worden. De lengte van een record in het bestand wordt vooraf vastgelegd in de OPEN statement. Voor gedetailleerde informatie bij het gebruiken van RAF bestanden zie de aparte hoofdstukken voor Directe toegankelijke bestanden (RAF = Random ACCESS FILE) .

String en Numerieke gegevens,  teksten of getallen, worden altijd als ASCII- tekstkarakters in de bestanden geschreven, zoals het volgende voorbeeld illustreert:

open "test.txt" for output as # F
print   # F, "12345"
print   # F, 12345
close  # F

open "test.txt" for input as # g
txt$ = input$(#g, lof (#g))
close # g
print  txt$
end

 ' produceert 12345 12345

Avatar gebruiker
Gordon
Site Admin
 
Berichten: 684
Geregistreerd: zo mei 22, 2005 12:50 am

Berichtdoor Gordon » za jun 16, 2007 9:26 pm

Code: Selecteer alles
Sequentiële bestanden worden geopend met het OPEN statement.
Wanneer zij niet meer nodig zijn, of wanneer het programma beëindigt, moeten zij met het CLOSE statement worden gesloten. Sequentiële bestanden staan toe dat gegevens uit een bestand worden gelezen of naar een bestand worden geschreven van het begin tot het eind. Het is niet mogelijk om gegevens in te lezen die in het midden van het bestand beginnen, noch is het mogelijk om gegevens ergens in het midden aan het bestand toe te voegen bij het gebruik van de sequentiële lees/schrijf methode.

Data kan uit een bestand gelezen worden  indien die voor INPUT wordt geopend. Het inlezen begint aan het begin van het bestand. Elke verdere input statement leest het volgende stuk data in het bestand.

Data wordt naar een bestand geschreven dat voor OUTPUT is geopend met een print statement en het schrijven begint aan het begin van het bestand, en elke volgende print statement schrijft verder gegevens aan het eind van het open bestand.

Wanneer een bestand voor APPEND wordt geopend, schrijft elke print statement gegevens aan het eind van het geopende bestand.

Sequentiële lees/schrijf methode
INPUT

De bestanden die voor INPUT worden geopend kunnen worden gelezen. Er kan niet naar ze worden geschreven.
Een bestand dat voor INPUT wordt geopend moet reeds op schijf bestaan, of het programma zal met een fout stoppen. Zie het Testen voor het bestaan van een bestand.

Het INPUT statement leest een stuk data in tot de volgende komma of de teken voor een volgende regel.
Het LINEINPUT statement leest een stuk data in dat ook komma’s kan bevatten (die zijn nu geen afbakeningen), en houdt op gegevens in te lezen tot het volgende nieuwe regel teken.
Het Input$ statement leest gegevens van een gespecificeerde lengte uit een bestand.
Het Inputto$ statement leest gegevens tot een gespecificeerde afbakening.

Hier is een illustratie van de verschillen tussen de diverse vormen van de het INPUT statement.

Voorbeeld programma’s:
 
' creëer een test bestand
open "test.txt" for output as #1
print #1, "123 Sesame Street, New York, NY"
close #1

'INPUT

open "test.txt" for input as #1
INPUT #1, txt$
print "INPUT item is: ";txt$
close #1

'LINE INPUT
open "test.txt" for input as #1
LINE INPUT #1, txt$
print "LINE INPUT item is: ";txt$
close #1

'INPUT$
open "test.txt" for input as #1
txt$ = INPUT$(#1, 10)   'read 10 characters
print "INPUT$ item is: ";txt$
close #1

'INPUTTO$
open "test.txt" for input as #1
txt$ = INPUTTO$(#1, " ") 'use a blank space as delimiter
print "INPUTTO$ item is: ";txt$
close #1

Produces:
INPUT item is: 123 Sesame Street
LINE INPUT item is: 123 Sesame Street, New York, NY
INPUT$ item is: 123 Sesame
INPUTTO$ item is: 123




Meervoudige INPUT van gegevens
Hier is een kort programma dat een tekstbestand opent en steeds één regel in leest, en die regel in de mainwin toont.

filedialog "Open ","*.txt", file$
if file$="" then end
open file$ for input as #1
while eof(#1) = 0
    line input #1, text$
    print text$
wend
close #1

'print a notice that the end of file is reached:

print:print:print "EOF"

OUTPUT
We kunnen naar bestanden die voor OUTPUT worden geopend opeenvolgend schrijven. Als een bestand dat voor OUTPUT wordt geopend niet bestaat, zal het worden gecreëerd. Als het bestand reeds op schijf bestaat, zal de vorige inhoud worden overschreven, en daarom verloren gaan. De zorg zou moeten worden genomen wanneer het openen van dossiers voor OUTPUT zodat het kritieke gegeven niet toevallig wordt gewist. Zie het Testen voor het Bestaan van het Dossier.

Data wordt naar een bestand dat voor OUTPUT geopend is, geschreven met een PRINT statement. Een regelafbakening of een nieuwe regel wordt automatisch naar het bestand geschreven bij elke PRINT statement. De nieuwe regel kan worden onderdrukt door de code regel met een puntkomma te beëindigen.

Voorbeeld programma:

' creëer een testbestand
open "test.txt" for output as #1
'write some data with line delimiters
print #1, "line one "
print #1, "line two "
'write some data without line delimiters
print #1, "item three ";
print #1, "item four ";

'more data with line delimiters added

print #1, "item five"
print #1, "done"
close #1

'INPUT to see what we wrote
open "test.txt" for input as #1
txt$ = input$(#1, lof(#1))
print "Contents of file: "
print
print txt$
close #1

Contents of file:

line one
line two
item three item four item five
done


Append
Bestanden die voor APPEND worden geopend kunnen sequentieel worden bewerkt. Als een bestand dat voor APPEND wordt geopend niet bestaat, zal het worden gecreëerd. Als het bestand reeds op schijf bestaat, zullen alle nieuwe gegevens die naar het bestand met een PRINT statement worden geschreven aan het eind van het bestand worden toegevoegd. Het schrijven van de gegevens naar een bestand dat voor APPEND is geopend werkt op de zelfde manier als bij een bestand dat voor OUTPUT wordt geopend, maar in plaats van dat de bestaande data in de file wordt overschreven, wordt het nieuwe gegeven altijd toegevoegd aan het eind van het bestand. Als bij een voor OUTPUT geopend bestaand bestand naar het bestand wordt geschreven, worden de bestaande gegevens van voor het openen overschreden.

Voorbeeld programma:
open "test.txt" for append as #1

'write some data with line delimiters
print #1, "line one "
print #1, "line two "

'write some data without line delimiters

print #1, "item three ";
print #1, "item four ";
'more data with line delimiters added

print #1, "item five"
print #1, "done"
close #1

File Copy
Een bestand kunne we kopiëren door gebruik te maken van de enkele bestandsbewerkingen.
Het te kopiëren bestand wordt geopend voor INPUT.
Het bestand dat een kopie moet zijn wordt dan geopend voor OUTPUT.
De inhoud van het oorspronkelijke bestand wordt teruggehaald met een Input$ statement en naar het nieuwe exemplaar (kopie) met een PRINT statement geschreven. Beide bestanden worden daarna gesloten.

Hier is een voorbeeld:

  open "mybytes.bin" for input as #original
  open "copybyte.bin" for output as #copy
  print #copy, input$(#original, lof(#original));
  close #original
  close #copy
  end
Avatar gebruiker
Gordon
Site Admin
 
Berichten: 684
Geregistreerd: zo mei 22, 2005 12:50 am

Berichtdoor Gordon » za jun 16, 2007 11:59 pm

Code: Selecteer alles
OPEN filename FOR RANDOM AS #handle LEN=n

OM een bestand in de random access mode te benaderen en te bewerken, moet deze met een OPEN statement geopend worden. Wanneer het bestand niet meer gebruikt, en in elk geval voordat uw programma eindigt, dient u het met het CLOSE commando af te sluiten. Zie ook : Filedialog, File Operations, Path and Filename , PUT, FIELD, GET, GETTRIM

Een Random Access File (RAF bestand) bestaat uit records. Het gehele bestand is verdeeld in vele records. Elk record heeft dezelfde lengte. De lengte wordt gespecificeerd wanneer het bestand wordt geopend met de LEN parameter. Het onderstaande voorbeeld  opent een bestand  “ members.dat” en zet de recordlengte op 256
 
OPEN "members.dat" FOR RANDOM AS #1 LEN=256

Lezen en schrijven in een bestand dat willekeurig toegankelijk is (RAF) wordt stuk voor stuk per record gedaan. Het record mag zich echter overal in de file bevinden. Een record wordt ingelezen door het statement GET of met GETTRIM. Een record wordt naar het bestand geschreven met het PUT statement. Deze statements worden hierna verder gedetailleerd behandeld. 

FIELD Statement
Elk record is onder verdeeld in “fields (velden)”, elk met een gegeven lengte. Het field statement moet ingevoegd worden direct na het OPEN statement om de grootte van elk veld op te zetten. Elk veld is benoemd door een variabele naam en heeft een specifieke lengte. Wanneer de lengtes van alle velden bij elkaar geteld worden, dan zal hun som gelijk moeten zijn aan de recordlengte die bij het OPEN statement met de LEN parameter was meegegeven. In het bovenstaande voorbeeld is dat dus 256. Een “$” teken geeft aan dat het betrokken veld dat zal bevatten die door een string variabele zal worden benaderd. Indien er geen “$” teken is dan zal het veld een getal bevatten. De velden voor “members.dat” zouden er als volgt uit kunnen zien:

OPEN "members.dat" FOR RANDOM AS #1 LEN=256

    FIELD #1,_    ' set up the fields for file opened as #1
    90 AS Name$,_ ' 1st 90 bytes contains Name$, string
    110 AS Address$,_   ' 2nd 110 bytes contains Address$, string
    50 AS Rank$,_       ' 3rd 50 bytes contains Rank$, string
    6 AS IDnumber       ' 4th 6 bytes contains IDnumber, numeric

De waarde achter “LEN=” is 256, en is verkregen door het optellen van 90 + 110 + 50 + 6 of te wel de totale lengte van alle velden in FIELD#. Het FIELD statement dient na het OPEN statement te staan en het moet gebruikt worden voordat u probeert te lezen of te schrijven van of naar het bestand door middel van GET of PUT.

PUT
PUT #handle, number
 
Dit statement wordt gebruikt om de gegevens die vervat zijn in de variabelen die in de FIELD statement zijn genoemd naar een gespecificeerd record te schrijven. De records in een RAF bestand zijn genummerd beginnend bij 1 en niet 0. Als de lengte van een variabele in een gegeven veld korter is dan de veldlengte specificeert, dan worden spaties toegevoegd om aan te vullen. Als de lengte van de data groter is dan de veldlengte, dan wordt de data op de door FIELD gespecificeerde lengte afgekort. Om data in record 3 van het hierboven vermelde bestand te plaatsen doen we het volgende:
   
Name$ = "John Q. Public"
Address$ = "456 Maple Street, Anytown, USA"
Rank$ = "Expert Programmer"
IDnumber = 99

PUT #1, 3


GET
GET #handle, number

Dit statement leest een volledig record in en vult de variabelen die in het  FIELD statement zijn genoemd.

GET #1,3

Print Name$ would produce "John Q. Public                                             "
Print Address$ would produce "456 Maple Street, Anytown, USA                             "
Print Rank$ would produce "Expert Programmer                "

print IDnumber would produce "99"

enzovoort

GETTRIM
GETTRIM #handle, number

Dit commando haalt het record op dezelfde manier op als GET dat doet, maar nu verwijderd het alle leidende of nalopende spaties in het record.

GETTRIM #1,3

Print Name$ would produce "John Q. Public"   
' no blank spaces are included
Avatar gebruiker
Gordon
Site Admin
 
Berichten: 684
Geregistreerd: zo mei 22, 2005 12:50 am

Berichtdoor anthonio » ma jun 18, 2007 12:02 am

zeer goede vertaling gordon, zeker handig voor mensen die minder goed engels kunnen.
Ik wil hier even bij toevoegen dat de KILL commmand ZEER GEVAARLIJK IS.
even een verduidelijking.
De KILL command verwijderd een bestand van de harde schijf. Dit verwijdert bestand wordt niet naar de prullenbak gestuurd, het wordt gewoon van de schijf gewist, met andere woorden, eens verwijdert met de KILL command is het bestand niet meer terug te vinden/krijgen.
KNOEI/SPEEL niet met deze command, vraag uitleg als je niet goed weet hoe deze command te gebruiken.
Dual boot: Ubuntu 8.04 - WIndows XP SP2 (via VMware) - Windows Vista 32bit - Toshiba L40 - Dual Core @ 1,76GHz - 1GB RAM - 120GB HDD - VDSL Connection
Avatar gebruiker
anthonio
 
Berichten: 281
Geregistreerd: zo mei 20, 2007 9:58 pm

Berichtdoor Abcott » ma jun 18, 2007 4:25 pm

Ik mis nog een stuk over Binaire bestanden of zie ik het
over het hoofd?

Abcott.

Overigens goed om dit te lezen voordat je start met de uitdaging
waar het van pas komt.
Het maken van een adressenbestand?
Avatar gebruiker
Abcott
 
Berichten: 115
Geregistreerd: wo mei 25, 2005 9:58 pm

Berichtdoor Gordon » zo jul 22, 2007 8:51 pm

Abcott schreef:Ik mis nog een stuk over Binaire bestanden of zie ik het
over het hoofd?

Abcott.

Overigens goed om dit te lezen voordat je start met de uitdaging
waar het van pas komt.
Het maken van een adressenbestand?


Goed gezien.
Het komt binnenkort. Ik zal tevens een demo geven van het gebruik
van dergelijke file typen om gegevens uit een MP3 bestand te halen.

Gordon
Avatar gebruiker
Gordon
Site Admin
 
Berichten: 684
Geregistreerd: zo mei 22, 2005 12:50 am

Berichtdoor Gordon » za aug 18, 2007 10:13 am

Het ontbrekende stuk over binaire files staat intussen op het
Internet. Ga daarvoor naar de website (klik op het LibertyBASIC)
ikoon linksboven op deze pagina.

Zoek BINARY in de commando's lijst op en .....


Gordon.
Avatar gebruiker
Gordon
Site Admin
 
Berichten: 684
Geregistreerd: zo mei 22, 2005 12:50 am


Keer terug naar Leren programmeren met Liberty BASIC

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers. en 1 gast

cron