Miten voin luoda koodilla binääritiedoston ja vastaavasti tuhota sen? Olen koko päivän yrittänyt etsiä vastausta Googlesta, mutta kaikki metodit tuntuvat olevan vain .txt-tiedostojen luomiseen.
Haluan siis tuhota aina edelliset tiedot, kun tallennan uudet.
Mistähän kielestä (QB, VB, VB.Net) mahtaa olla kyse?
Binääritiedoston käsittely ei paljonkaan eroa tekstitiedoston käsittelystä. Kummallista, ettet ole löytänyt netistä mitään ohjeita: jo ensimmäinen keksimäni haku tuottaa vaikka kuinka monta tulosta ja Putkastakin löytyy jotain.
Edit (pyyhin aika paljonkin pois): Löysin kyllä kaikki nuo sivut, mutta niissä tiedosto on luotu jo käsin valmiiksi.
Mutta: onko tässä koodissa jotain ongelmaa?
Dim fso As New FileSystemObject, file As File polku = App.path & "\alustukset.dat" 'jos on jo niin tuhotaan If fso.FileExists(polku) = True Then Set file = fso.GetFile(polku) file.Delete End If 'lähinnä tämä rivi, onko ongelmia? Call fso.CreateTextFile(polku, True)
Eli pystyykö tuollaisen tekstitiedoston luovalla metodilla tekemään .dat-päätteisen tiedoston? Tuntuisi näin alustavasti ainakin toimivan.
Moikka taas kisahalo!
Aluksi: Jos haluat operoida binaaritiedostoilla niin unohda Scripting.FileSystemObject (tiedostopääte .dat tai mikään muukaan pääte ei automaattisesti tee tai määrää tiedoston formaattia)
Open "c:\testi.dat" For Binary As #1
luo C:-aseman juureen tiedoston nimellä testi.dat mikäli tiedostoa ei ole ennestään olemassa. Mikäli tiedosto on jo olemassa samainen koodi avaa ko. tiedoston.
Open "c:\testi.dat" For Binary Access Write As #1
avaa olemassa olevan tiedoston tai luo uuden jos sitä ei ole ennestään olemassa
ja avaa luodun tiedoston. Access Write (ei pakollinen) määrittää että tiedostoon voidaan kirjoittaa.
Open "c:\testi.dat" For Binary Access Read As #1
avaa olemassa olevan tiedoston ja Access Read määrittää, että tiedostoaa voidaan ainoastaan lukea.
Mikä tahansa tiedosto voidaan avata binaarimuodossa, mutta binaaritiedostoa ei voi avata esim. Open ... For Input ... -metodilla.
Nyt ompi niin, että jos avaat olemassa olevan binaaritiedoston ja kirjoitat sinne uutta dataa niin tapauksessa, että uuden datan pituus on lyhempi, kuin alkuperäisen tiedoston datan pituus data kirjoitetaan tiedoston alkuun (mikäli tiedoston kohdistinta ei erikseen siirretä) vanhan datan päälle ja loppuosa jää entiselleen. Kohdistinta voidaan siirtää Seek-metodilla.
Open "c:\testi.dat" For Binary Access Write As #1 Seek 1, LOF(1)
avaa tiedoston kirjoitustilaan jaa siirtää kohdistimen tiedoston loppuun, jolloin uusi data voidaan kirjoittaa vanhan datan perään. Itse asiassa kohdistin siirretään viimeiseen merkkiin joka on binaaritiedostossa erityinen binary-sign ja uusi data kirjoitetaan viieisestä merkistä alkaen mikä ei haittaa, koska Write metodi kirjoittaa smaisen merkin uudelleen uuden datan perään. Seek-metodi voidaan korvata Put/Get -metodissa.
Put #1, 10, data
kirjoittaa kirjoitettavan data alkaen tiedoston 10. merkistä jne.
Get #1, 10, data
lukee tiedoston sisällön muuttujaan data alkaen 10. merkistä jne.
Jos pilkkujen väli on tyhjä Get/Put -metodissa niin luku/kirjoitus alkaa tiedoston alusta.
Lopuksi: Elikä kun kirjoitat dataa binaaritiedostoon ja haluat varmistaa, että tiedostossa on vain viimeisin päivitetty data niin on parasta tuhota vanha tiedosto ja luoda samalla nimellä uusi tiedosto.
If Dir("c:\testi.dat") <> "" Then Kill "c:\testi.dat" End If Open "c:\testi.dat" For Binary Access Write As #1 Put #1, , data: Close #1
toivottavasti tämä selventää binaaritiedoston käsittelyyn littyviä ongelmia...
Nea, kiitos suunnattomasti jälleen avustasi. Viestisi todella selvensi asiaa ja samalla tuli selväksi tuo fso:kin. Mielestäsi kirjoittamasi selvennys pitäisi lisätä VB-oppaaseen (jossa ei varoiteta mitään tietojen häviämisestä) tai ainakin koodivinkkeihin.
Mitä nyt olen testaillut niin ainakin toistaiseksi näyttää toimivan.
Ei toimi. Vaikka tuhoaisin edellisen tiedoston tuolla tavalla ja loisin uuden, jos lisään uuteen tiedostoon jonkin uuden tiedon, ne eivät lataudu enää oikein. Toisin sanoen ohjelma hävittää edelleen tietoja.
Moi taas kisahalo!
1. Jos ja kun käytät oliotasi (UDT-structure) asetustietojen säilönä niin älä pukkaa asetustiedostoosi yhtään mitään muuta, kuin oliosi!!!
2. Jos ja kun testailet ohjelmaasi VB6 debuggerilla, suljet ohjelman debuggerilla ja asetustietojesi päivitys tapahtuu pääformin QueryUnload-tapahtumasasa niin tiedot eivät välttämättä päivity.
Elikä testaa toimintaa ajamalla käännettyä ohjelmaa (.exe)!!!
3. Oletko myös tarkistanut, että kaikki tarvittavat tiedot päivittyvät em. säilöön ennen varsinaista asetustietojen tallentamista???
4. Oletko myös tarkistanut, että avattaessa ohjelmasi pystyy automaattiseti hakemaan säilöstä kaikki tarvitsemansa asetustiedot???
5. Jos kaikki asetustiedot päivittyvät säilöön eikä tallennuspuoli siltikään pelitä, niin yksi mahdollisuus on napata VarPtr-funktiolla säilöstä pointteri, kopioida tavut CopyMemory-API'lla muistista Byte-taulukkoon ja sitten tallennella taulukko binaaritiedostoon.
neau33 kirjoitti:
1. Jos ja kun käytät oliotasi (UDT-structure) asetustietojen säilönä niin älä pukkaa asetustiedostoosi yhtään mitään muuta, kuin oliosi!!!
En teekään.
neau33 kirjoitti:
2. Jos ja kun testailet ohjelmaasi VB6 debuggerilla, suljet ohjelman debuggerilla ja asetustietojesi päivitys tapahtuu pääformin QueryUnload-tapahtumasasa niin tiedot eivät välttämättä päivity.
Elikä testaa toimintaa ajamalla käännettyä ohjelmaa (.exe)!!!
En talleta tietoja ohjelmaa suljettaessa, ainoastaan silloin kun jotain asetuksia muutetaan. En ole testannut ohjelmaa siksi .exe:llä, että tiedot häviävät aina silloin, kun lisään oliolle ominaisuuden. Tämä on sikäli kriittistä, että minulla on tietty mittausdata binääritiedostossa, eikä sitä saisi sössiä. Tiedot häviävät lisäksi silloin tällöin juuri tuon datan pituuden muuttumisen takia.
neau33 kirjoitti:
3. Oletko myös tarkistanut, että kaikki tarvittavat tiedot päivittyvät em. säilöön ennen varsinaista asetustietojen tallentamista???
Tarkoitatko, että talletan tiedot muuttujiin onnistuneesti, ja vasta sitten tallennan ne tiedostoon? Jos kyllä, niin kyllä.
neau33 kirjoitti:
4. Oletko myös tarkistanut, että avattaessa ohjelmasi pystyy automaattiseti hakemaan säilöstä kaikki tarvitsemansa asetustiedot???
Kyllä, silloin kun mitään ei ole muutettu.
neau33 kirjoitti:
5. Jos kaikki asetustiedot päivittyvät säilöön eikä tallennuspuoli siltikään pelitä, niin yksi mahdollisuus on napata VarPtr-funktiolla säilöstä pointteri, kopioida tavut CopyMemory-API'lla muistista Byte-taulukkoon ja sitten tallennella taulukko binaaritiedostoon.
Olen miettinyt tätä kaikkea ja tullut siihen tulokseen, että ehkä on parempi siirtää mittausdata ja tulostaa se tavalliseen tekstitiedostoon. Tällöin ainakin tietää mitä saa, ja fyysikot, jotka käyttävät ohjelmaani, voivat tarvittaessa tarkistaa mittausdatan tiedostosta.
Ajattelin käyttää kahta tiedostoa, tekstitiedostoa mittausdatalle, kalibrointikertoimille yms. ja binääritiedostoa ulkoasuun, yhteysasetuksiin yms. Tällöin en suoraan sanottuna välitä jos jotain menee pieleen binäärissä. :) Tämä siksi, että niitä tietoja muutetaan harvoin ja jos ne muuttuvat, ne on helppo ja nopea korjata.
NO MORJENS taas kisahalo!
Aluksi:
EPÄILEN TODELLA VAHVASTI, että joku olla on ongelmia binaaritiedoston käsittelyn kanssa ja joka kyselee ohjeistusta tällä sivustolla kykenisi saamaan aikaiseksi mitään mistä olisi hyötyä TODELLISILLE FYYSIKOILLE!!!
Ja sitten:
Jos ohjelmasi tarkoitus on kyetä keräämään/tallentamaan[/vertaamaan/analysoimaan] mittaustuloksia, niin unohtaisin välittömästi kaikennäköisten ulkoisten teksti- tai muiden tiedostojen kanssa käpistelyn ja siirtyisin yksinkertaisesti vain käyttämään tietokantoja!
Ystävällisin terveisin
Nea Uusitalo
neau33 kirjoitti:
EPÄILEN TODELLA VAHVASTI, että joku olla on ongelmia binaaritiedoston käsittelyn kanssa ja joka kyselee ohjeistusta tällä sivustolla kykenisi saamaan aikaiseksi mitään mistä olisi hyötyä TODELLISILLE FYYSIKOILLE!!!
Täysin tarpeeton ja asiaton loukkaus. Fyysikon koulutukseen ei (valitettavasti) kuulu ohjelmointi, vaan olen joutunut tekemään sitä töissä. Minun on pitänyt lähteä siis täysin pohjalta opettelemaan ohjelmointia, eikä se ole ollut helppoa. Jos minulta kysytään, en haluaisi ohjelmoida lainkaan.
Usko tai älä, meillä on kahden sädehoitokiihdyttimen huollot tulossa, ja niissä käytetään ohjelmaani, koska se todistetusti toimii.
neau33 kirjoitti:
Jos ohjelmasi tarkoitus on kyetä keräämään/tallentamaan[/vertaamaan/analysoimaan] mittaustuloksia, niin unohtaisin välittömästi kaikennäköisten ulkoisten teksti- tai muiden tiedostojen kanssa käpistelyn ja siirtyisin yksinkertaisesti vain käyttämään tietokantoja!
En lähde rakentamaan tietokantaa tämäntyyppiseen tapaukseen, varsinkin kun se pitäisi tehdä VB6:lla, koska mittalaitteen kanssa kommunikointi tapahtuu sillä. Väänsin tallennuksen tavallisella tekstitiedostolla, missä on se hyvä puoli, että nyt dataa pystyy tutkimaan suoraan tiedostosta katsomalla.
Kommenttisi harmittaa, koska se romutti hetkessä sen arvostuksen, jonka olit kerännyt silmissäni auttamalla minua ongelmissani.
Ystävällisin terveisin,
Kimmo Halonen
Fyysikko, ei ohjelmoija
kisahalo kirjoitti:
Fyysikon koulutukseen ei (valitettavasti) kuulu ohjelmointi, vaan olen - -
Turussa on asiat hyvin ja täällä fysiikan pääaineopiskelijat opiskelevat myös muutaman ohjelmoinnin peruskurssin.
sory, hieman offtopiciksi meni
Miksi haluat tallettaa mittausdatan binäärinä?
Voithan toki tallettaa digitaaliarvot muutenkin, jolloin ei tartte kikkailla binäärimuunnosten kanssa.
Jos piirrät käyrää datasta, voit esim tallettaa samplen x ja y arvot.
Jos käsittelet puhtaasti numeraaleja,käytä toki niitä.
Itse teen usein oman tietomallin, johon tallentuu samplet mittauksen alusta loppuun tarvittavilla lisätiedoilla (esim silloisen parametrit etc.). ja kun dataa halutaan lukea, on omasta mallista helppo tehdä tietue ja käsitellä.
Tämä helpottaa myös eri mittauskertojen tulosten käsittelyä. voit lukea useamman mittauskerran tulokset tietueisiin, ja käsitellä foreach silmukassa kerralla.
kisahalo kirjoitti:
En lähde rakentamaan tietokantaa tämäntyyppiseen tapaukseen, varsinkin kun se pitäisi tehdä VB6:lla, koska mittalaitteen kanssa kommunikointi tapahtuu sillä. Väänsin tallennuksen tavallisella tekstitiedostolla, missä on se hyvä puoli, että nyt dataa pystyy tutkimaan suoraan tiedostosta katsomalla.
VB6:ssa on muuten aika hyvät työkalut tietokantojen käyttämiseen, joten jossain vaiheessa ehkä kannattaa harkita niitäkin. Ymmärrän toki että jos ja kun tietokannat vaatii vielä hieman lisäopiskelua, ei se välttämättä innosta jos ohjelman tekeminen on muutenkin vain "välttämätön paha".
Hei, Kisahalo.
Vastaavanlaisessa tilanteessa olen avannut tiedoston FOR RANDOM. (TempK vastannee sinun Dataa?) Onko sinulla syytä avata juuri FOR BINARY?
Tietojen tuhoaminen käy deletoimalla faili tai päällekirjoittamalla.
Ohessa pätkä koodista, (jossa faili avataan lukemiseen)
Dim TempK As kalustetyyppi, i As Long, pit As Long, n As Integer n = FreeFile Open Trim(Projekti.KomponenttiFile) For Random As n Len = Len(TempK) pit = LOF(n) / Len(TempK) For i = 1 To pit Get n, i, TempK If TempK.Äiti = 0 Then ÄidinSivu = TempK.Sivu Exit For End If Next Close n
Kiitos teille kaikille lisävastauksista, mutta ratkaisin ongelman jo käyttämällä tavallista tekstitiedostoa.
groovyb: Siksi, että en halunnut lähteä käsittelemään isohkoja kolmiulotteisia matriiseja merkkijonoja parsemalla. Mutta nyt kun binääri tuotti ongelmia, päädyin tekemään sen.
Grez: Aiemmassa projektissa käytin Access-tietokantaa, joskin suora tietokantapuljaaminen VB:n avulla on vielä hakusessa. Mitä itse ohjelmointiin tulee, niin kyllä se parhaimmillaan mielenkiintoista on, mutta ei suoraan sanottuna sitä, mitä haluan tehdä. Erityisesti kun en ole tutkimuspuolella. Fysiikassa ohjelmat ovat usein muutenkin kokemukseni mukaan yhden asian purkkaviritelmiä.
Sitten sen kerran, kun on kunnianhimoa ohjelman tekemiseen niin kuin nyt, niin joudun kysymään apua, ja joudun nielemään Nean kaltaisia kommentteja. Anteeksi vain, etten ole yhtä kokenut ohjelmoija tai löydä apua Googlesta.
Heippa taas!
Kimmo@: Tarkoitukseni ei ollut mitenkään loukata, ainoastaan herättää ajatuksia...
Tuntuisi kuitenkin äkkiseltään aika ihmeelliseltä, että talossa jossa tullaan hoitamaan niinkin hienojen, kuin sädehoitoon liittyvien laitteiden huoltoja ja että ko. huoltotoimiin liittyy tietokoneohjelmilla suoritettavat mittaukset ja analyysit, ei löydy hyvin koulutettua todella asiansa osaavaa ohjelmoijaa ja oletuksena on kuitenkin, että em. tietokoneohjelma/t tehdään talossa (tai ostetaan talon työntekijältä).
Mutta:
Kuvailemasi kaltaisessa systeemissä olisi tietokannan käyttö todella monessa suhteessa edukasta.
Dataa voi tallentaa/tuoda/päivitää milloin tahansa ja vain sitä dataa, jota on kulloinkin tarpeellista käsitellä. Kun tietokantayhteys luodaan ohjelman avaamisen yhteydessä on kaikki tarvittava käsillä heti ilman, että joutuu siirtämään dataa erikseen taulukoituun olioon (olion muuttujiin) koska täysin samat operaatiot voidaan suorittaa suoraan tietokannan tietueiden kenttiin. Tästä seuraa mm. se hyöty, että itse ohjelmasta tulee kevyempi.
Halutessa voidaan samaan tietokantaan säilöä helposti todella suuria määriä myös mahdollisia edellisiä mittaustuloksia, tuoda niistä haluttuja arvoja ohjelman muuttujiin ja suorittaa vertailuja joiden perusteella tehdä analyysejä jne...
Ajatellaan, että tietokanta rakennetaa esim. Microsoft Access-pohjalle ja ongelmaksi muodostuisi, että talossa ei ole käytössä Access'ia. No hätä, koska Microsoft tarjoaa aivan ilmaiseksi Access Database-moottorin, jonka avulla voidaan käsitellä monenlaisia Microsoft Office-tiedostoja ilman, että Office-paketti on asennettu järjestelmään. Jotta JET 4.0 mootooria voidaan käyttää VB6:ssa on järjestelmässä oltava Service Pack 6 asennettuna.
Mitä tulee itse tietokannan/talujen/kenttien rakentamiseen ja käyttöön VB6:lla niin Internet on aivan pullollaan esimerkkejä ja ohjeita sekä suomeksi että myös lukuisilla ulkomaisilla kielillä.
Oppaita ja ohjeita löytyy esim. näiden muutamien linkien takaa
Aihe on jo aika vanha, joten et voi enää vastata siihen.