Waardes veranderen in een file

Status
Niet open voor verdere reacties.

Jan Van Haaren

Gebruiker
Lid geworden
27 okt 2002
Berichten
202
Hoi,

Ik weer ja :o. Vaat raadde me aan best een nieuw topic te starten... Mijn vraag is hoe je het beste waardes in een bestaand document vervangt zonder de hele file opnieuw te moeten wegschrijven. Ik wil iets maken dat een document opent, bepaalde waardes zoekt en op dezelfde plaats andere waardes kan wegschrijven. Het document dat ik wil openen is een gewoon bestand dat je kan openen met notepad bijvoorbeeld. Ergens in de file staat dit:

xposition=10
yposition=12
zposition=15

Deze dingen zouden gelezen moeten worden zodat er op die plaats andere waardes geschreven kunnen worden, bijvoorbeeld:

xposition=20
yposition=41
zposition=16

Hoe is dit mogelijk? Dank bij voorbaat!
 
Sorry Jan,

zit midden in mijn tentamens en heb even geen tijd om dit voor je te programmeren. Ben meer een javaprogrammeur en moet de exacte syntax van een Random Access File weer even opzoeken.

Heb jouw 'probleem' in ieder geval meerder keren opgelost in visual basic, dus het kan absoluut. Het gaat het hier in ieder geval even om dat je dus niet de file inleest en meteen wegschrijft tot je de waarde hebt gevonden, de waarde aanpast en dan de rest wegschrijft. Die lees -en schrijfoperaties duren te lang bij lange datafiles.

Zal het ergens volgende week voor je programmeren, tenzij Dennis ofzo langs schiet en het al voor me doet.
 
Zal het zo uitwerken.

Hallo Jan,

Het is hier bij ons koopzondag. Even wat boodschapjes
gaan doen en zal hierna even het probleem voor jou gaan oplossen.

Mvg,

Dennis.

P.S. Ik wens Vaat alle succes toe met zijn tentamen.
 
Re: Zal het zo uitwerken.

Geplaatst door DENNIS90
Hallo Jan,

Het is hier bij ons koopzondag. Even wat boodschapjes
gaan doen en zal hierna even het probleem voor jou gaan oplossen.

Mvg,

Dennis.

P.S. Ik wens Vaat alle succes toe met zijn tentamen.

misschien is het handig om bijvoorbeeld 2 variabele te declareren in een bass module:

naam (bijv xposition)
nummer (bijv 10)

en deze "objecten" op te slaan in een collection. Dan kan je makkelijk toevoegen enzo.

In de form_load lees je deze collection in vanuit de random access file en bij terminate schrijf je dit weg.

Je hebt dan in het hele programma geen lees -en schrijfoperaties nodig op files, wat je programma erg vertraagd.

Word de collection heel groot dat gaat het geheugengebruik een rol spelen, maar dat zal wel niet.
 
He he, ben eindelijk weer terug!

Hallo Jan,

Allereerst even het volgende. We hebben het hier over
bestandsorganisatie. Het voert hier te ver om al over die
zaken te gaan bespreken. Ik probeer het kort te houden.

Probleem van aanpak zal ik hier als volgt bechrijven.
Misschien is wat ik hier beschrijf niet helemaal wat je bedoelt,
(althans v.w.b. de indeling van je .txt bestand) maar neem het maar even voor
lief als je het niet erg vingt, want het gaat hier om de benadering
om tot het juiste resultaat te komen.

Met FSO (File System Object) zal het niet gaan lukken en met
Visual Data Manager evenmin, omdat er een .mdb bestand aangemaakt
wordt. Je wilt immers een .txt bestand gebruiken.

Toch zitten wij met die .mdb (Microsoft DataBase) gedachte dicht in de
buurt, want het gaat hier tenslotte ook om een DataBase.
Toch kun je je .txt bestand ook als zodanig definieren door in het VB-Module
een UDT (User Define Type=Eigen gemaakte type variabele) te declareren en
de Mode voor het Open statement als Random te kiezen en verder het bestand
met Get en Put te manipuleren.

Het meest elementaire element v.e. database is een bit, maar aan
deze informatie heb je niet zoveel aan. Dus even globaal de opbouw v.d.
boomstructuur:
Database -> records -> velden. M.a.w. een database bestaat uit
records(regels), bv. de records van je NAW-gegevens. Deze NAW-gegevens
bevinden zich in velden (ook kolommen genoemd).

Ik ga er hier vanuit, dat je .txt bestand op deze manier ingedeeld is
en niet anders!:

xposition=10
yposition=12
zposition=15
............
............
............
enz.........


We stellen nu vast, dat de lengte per regel ALTIJD 12 posities zal zijn.
En stellen wij ook verder vast, dat een record uit SLECHTS één veld (kolom)
bestaat. Hetgeen een vaste (fixed) lengte heeft en niet variabel is.

Je databasje is nu gedefineerd.

Hierboven heb ik het over een veld, dat een vaste lengte van 12 posities heeft.
Toch moet het veld nog 2 posities erbij hebben en waarom? Omdat aan het einde
van elke regel zich onzichtbare ascii-codes (13 en 10;VbCrLf) bevinden.
Zie hieronder (wordt verderop ook uitgelegd) hoe je dit in je module (.bas)
moet definieren.

Public Type Resolutie
Waarde As String * 14 'Dus niet 12 posities maar 14.
End Type

Nu komt de volledige beschrijving hoe het probleem aan te pakken.
Helaas kan ik jou de volledige code niet geven, omdat ik je
eigen source niet ken. Ik weet niet welke variabelen, controls enz...
je in je programma hebt gebruikt. Dus ik houd het een beetje algemeen
en moet je nog verder bijschaven. Ook het ondervangen van ONGELDIGE
invoer van de texboxen moet je nog programmeren. Dit is van het grootste
belang. En nog andere meer, bv correcte variabelenamen te gebruiken enz..
Ik heb de kern v.h. probleem even willen oplossen, en dat is dat je bij
verandering van één regel in je bestand niet het hele bestand opnieuw
behoeft te worden geschreven. En dit gaat uitstekend.

1) Maak een Module aan. Dit doe je door Project/Add Module
2) en declareer in je module:
Public Type Resolutie
Waarde As String * 14 'Dus niet 12
End Type
3) Plaats 2 extra TexBoxen op je Form. Een knop moet je al hebben om
een bestand te selecteren/openen middels het CommonDialog control dat
ook op je Form al aanwezig is.
In de ene TexBox voer je de waarde in die moet worden vervangen en
de andere bevat de nieuwe waarde. De knop bevat het feitelijke
doel v.h. programma (oude resolutie waarde met een niuwe vervangen)
4) Nogmaals, je had al een CommonDialog control op je Form. Na het
selecteren v.e. bestand is het pad en je bestandsnaam bekend. (sFile)
5) Plaats de code hieronder op je eigen bestaande knop, die dient om een
bestand te selecteren en het vervolgens te openen EN NU ook om het
geselecteerde bestand te manipuleren.


Code:
'==== Begin aanvulling declaratie/toekenning
Dim NieuweWaarde As Resolutie
Dim vervang As String
Dim oude As String
Dim teller As Integer
Dim num
num = FreeFile
teller = 1
'==== Einde aanvulling declaratie/toekenning


'===== Begin dit stond er al
With dlgCommonDialog 
    .DialogTitle = "Choose your adboard" 
    .CancelError = False 
    .Filter = "Bitmapfiles (.bmp)|*.bmp" 
    .ShowOpen 
    If Len(.FileName) = 0 Then 
        Exit Sub 
    End If 
    sFile = .FileName 
End With 

picShow.Picture = LoadPicture(sFile) 

Text1.text = sFile 'Dit moet je nog erbij doen.
'===== Einde dit stond er al

'===== Begin toegevoegde code
Open sFile For Random Access Read Write As #num Len = Len(NieuweWaarde)
    While Not EOF(num)
        Get #num, teller, NieuweWaarde
        'Text1.text zul je al hebben, dus even aanpassen.
        'In deze textbox vul je de waarde die moet worden gezocht
        'en met de waarde v.d. andere textbox wordt vervangen.
        oude = Text1.Text & vbNewLine 
        If oude = NieuweWaarde.Waarde Then
	    'Text2 zul je ongetwijfeld ook al
	    'hebben, dus ook even aanpassen.	
             vervang = Trim(Text2.Text) & vbNewLine
             NieuweWaarde.Waarde = vervang
             Put #num, teller, NieuweWaarde.Waarde
             Close #num
             Exit Sub
        End If
        teller = teller + 1
    Wend
Close #num
'===== Einde toegevoegde code

Volgorde nadat het programma gerund is: de 2 textboxen invullen en
op de knop klikken (jouw eigen gedefinieerde knop voor Common-
Dialog control). Heb zelf gauw een testprogrammaatje gemaakt en getest.
En het werkt naar behoren.

Mvg,

Dennis.

P.S. Heb onderste code even goed geordend.
(Gestructureed in compound-statement)
 
Laatst bewerkt:
lijkt mij goed zo, maar Jan onthoud in ieder geval dat dit op conceptueel niveau niet de juiste methode is.

Je dient ten alle tijde het aantal lees -en schrijfoperaties tot het minimum te beperken. Ik zou het dus op eerder genoemde methode doen.

Het ging hier echter om het juiste gebruik van Random Access Files en bovenstaande code laten dat gebruik goed zien.

Je bent wel vooruit gegaan Dennis. :) Je deed een een soort informatica studie. toch ??????

ps het afvangen van exceptions bij het gerbuik van files is ook een noodzaak, maar dat is weer een nieuwe thread :)
 
Ja, Informatica gedaan.

Niet het programmeren op zich is een probleem, maar hoe je een
probleemstelling EENDUIDIG (ondubbelzinnig) definieert. Er bestaan er
een aantal methodieken om dit te bewerkstelligen.
De code wordt daarna bv. aan de hand van PSD's geschreven en is het
probleem in feite al lang opgelost. Alleen de vertaling naar de niet
menselijke taal, niet het moeilijkste deel, moet als laatste nog
plaatsvinden. Het coderen dus.
Wiskundig is een programma niet naar zijn correctheid te bewijzen, PSD's
doen dit in zekere zin wel. Pascal heb ik altijd als een goede
programmeertaal gezien. De compiler is zo ingericht dat je niet zomaar in
het wilde weg kan programmeren. Het probleem moet eerst goed worden
omschreven en het vooraf gebruik van variabelen/constanten moet al
bekend zijn.

Derhalve is het van zeer groot belang, dat een probleemomschrijving
goed omschreven wordt. Ik heb in dit Forum wel vaker moeten gissen van
wat er bij sommige vragen precies bedoeld wordt.

Het afvangen van exceptions, heb ik ook vermeld onder "je moet het
programma nog gaan bijschaven" De uitleg zou anders veel te langdradig zijn,
dat was het eigenlijk ook al. Het afvangen van exceptions valt onder één
v.d. voorwaarden bij het programmeren.

We hebben op het werk DASD (Direct Access Storages Devices) staan, zeg mmar
een soort hardeschijf, maar supersnel natuurlijk. Ja, mainframes he)

Ik wil het over de woorden "Direct Access" gaan hebben. Dus, directe toegang
en het besparen van lees- en schrijfoperaties.

Nogmaals, mijn uitleg aan Jan zou nog langer geweest zijn, wanneer ik
hem aanraad een Listbox te gaan gebruiken. Een klik op een listbox
vang je het nummer dat gerelateerd is aan het geklikte item. Stel, dat
dit een 6 is en we dit aan de variabele Index toekennen.
Dan kunnen we met "Get #num, Index, NieuweWaarde" de lees- en schrijkoppen
v.d. hardeschijf direct (Direct Access) toegang geven tot die sector
waar dat deel v.h. bestand bevindt. Het zoeken is dus geadresseerd.
En dus niet lezen vanaf 1 t/m 5.

Of ik vooruit ben gegaan Vaat? Dit weet ik niet zo zeker hoor.
Informatica studie? Ja, maar eigenlijk leren we die zaken, die men al voor ons al
uitgevonden hebben. Denk maar even aan George Boole (Boleese Algebra),
we moeten hem wel dankbaar zijn. Zijn Logica leer hebben we nu in impulsen
omgezet (flip/flops), wat nu de computer is. Dit is zeer magnifiek. In zijn tijd
bestond de electronica nog niet eens. De menselijke taal (syntaxis, semantiek en
pragmatiek) bevat franjes, waardoor zaken soms dubbelzinnig of hyperbolisch
worden uitgedrukt.

Succes met je tentamens.
 
je stelt dat met gebruik van random access files het aantal lees -en schrijfoperaties vermindert word omdat je meteen daar de juiste record kan springen zonder eerst de lijst te doorlopen. Ben ik het helemaal mee eens en dat is o.a. ook de reden dat ik Jan van Haren uitnodigde om een nieuwe topic te openen. En dat ik er uberhaupt over begon in die andere thread.

Neemt niet weg dat het minimum bestaan uit 1 leesoperatie en 1 schrijfoperatie en dat wel degelijk geimplementeerd kan worden. Dit stelde ik in mijn vorige bericht.

Dus het kan nog meer beperkt worden. Maar goed misschien zit Jan helemaal niet te wachten op onze uitgebreide uitleg over de bestaande procedures ???
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan