Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: [VB6] Tiedoston lataaminen muistiin

Sivun loppuun

rautamiekka [15.02.2008 11:07:51]

#

Miten VB6:sessa ladataan koneella oleva tiedosto muistiin myöhempää prosessointia varten ? Vai eikö ole mahdollista käsitellä muistissa olevaa tiedostoa ?

Antti Laaksonen [15.02.2008 13:48:48]

#

Tiedoston lataus muistiin tarkoittaa, että määritetään sopivan kokoinen taulukko ja luetaan siihen tiedostossa olevat tiedot.

Jos haluat ladata tiedoston tavut sellaisenaan, seuraava koodi toimii:

Dim tiedosto As String
tiedosto = "c:\omat\testi.dat"
Open tiedosto For Binary As #1
ReDim tiedot(LOF(1) - 1) As Byte
Get #1, , tiedot
Close #1

Tiedoston sisällön voi näyttää vaikkapa heksaeditorin tavoin:

Cls
FontName = "Courier"
Dim i As Integer
For i = 0 To UBound(tiedot)
    Print Right("00" & Hex$(tiedot(i)), 2) & " ";
    If i Mod 16 = 15 Then Print
Next

Mutta kerropa, mitä olet tarkalleen tekemässä, niin pystyn vastaamaan paremmin.

rautamiekka [15.02.2008 14:41:14]

#

Teen softaa joka sisältää kaikkea mahdollisia ohjelmapätkiä ja toimintoja kun isän yrityksessä olisi tarvetta sellaisella. Suurinta ongelmaa toistaiseksi aiheuttaa kalenteri jonka päivämääriin pitäisi saada tietoa ja ne sitten tallennettua koneelle.

rautamiekka [15.02.2008 17:58:19]

#

Voisitko kertoa jokaisen pienenkin asian mitä tuo toinen koodi tarkalleen tekee joka kohdassa ?

rautamiekka [15.02.2008 19:14:44]

#

Tässä on ohjelman moduulista koodi joka sisältää muuttujat. En keksi koodia millä automatisoidusti ladataan jokaisesta tallennustiedostosta tiedot jokaiselle päivälle jokaisen päivän omaan muuttujaan. Kalenterin formin nimi on frmCalendar ja kalenterikontrollin nimi siellä on Calendar1. Käytössä on access Calendar Control 7.0 FI.

Option Explicit
Public Const SoftwareSettings = "C:\betasofta v0.1 - asetuskansio\betasofta v0.1 asetukset.txt"
Public Const CalendarSettings = "C:\betasofta v0.1 - asetuskansio\betasofta v0.1 - Kalenterin asetukset.txt"

Public Const CalendarSaveMonth1 = "C:\betasofta v0.1 - datakansio\betasofta v0.1 - Kalenterin tallennustiedosto, kuukausi 1.txt"
Public Const CalendarSaveMonth2 = "C:\betasofta v0.1 - datakansio\betasofta v0.1 - Kalenterin tallennustiedosto, kuukausi 2.txt"
Public Const CalendarSaveMonth3 = "C:\betasofta v0.1 - datakansio\betasofta v0.1 - Kalenterin tallennustiedosto, kuukausi 3.txt"
Public Const CalendarSaveMonth4 = "C:\betasofta v0.1 - datakansio\betasofta v0.1 - Kalenterin tallennustiedosto, kuukausi 4.txt"
Public Const CalendarSaveMonth5 = "C:\betasofta v0.1 - datakansio\betasofta v0.1 - Kalenterin tallennustiedosto, kuukausi 5.txt"
Public Const CalendarSaveMonth6 = "C:\betasofta v0.1 - datakansio\betasofta v0.1 - Kalenterin tallennustiedosto, kuukausi 6.txt"
Public Const CalendarSaveMonth7 = "C:\betasofta v0.1 - datakansio\betasofta v0.1 - Kalenterin tallennustiedosto, kuukausi 7.txt"
Public Const CalendarSaveMonth8 = "C:\betasofta v0.1 - datakansio\betasofta v0.1 - Kalenterin tallennustiedosto, kuukausi 8.txt"
Public Const CalendarSaveMonth9 = "C:\betasofta v0.1 - datakansio\betasofta v0.1 - Kalenterin tallennustiedosto, kuukausi 9.txt"
Public Const CalendarSaveMonth10 = "C:\betasofta v0.1 - datakansio\betasofta v0.1 - Kalenterin tallennustiedosto, kuukausi 10.txt"
Public Const CalendarSaveMonth11 = "C:\betasofta v0.1 - datakansio\betasofta v0.1 - Kalenterin tallennustiedosto, kuukausi 11.txt"
Public Const CalendarSaveMonth12 = "C:\betasofta v0.1 - datakansio\betasofta v0.1 - Kalenterin tallennustiedosto, kuukausi 12.txt"

Public Const Month1 = 31
Public Const Month2 = 29
Public Const Month3 = 31
Public Const Month4 = 30
Public Const Month5 = 31
Public Const Month6 = 30
Public Const Month7 = 31
Public Const Month8 = 31
Public Const Month9 = 30
Public Const Month10 = 31
Public Const Month11 = 30
Public Const Month12 = 31

Dim MaxDayPerMonth(Month1 To Month12)

Dim arrayCalendarSaveMonth1(1 To Month1)
Dim arrayCalendarSaveMonth2(1 To Month2)
Dim arrayCalendarSaveMonth3(1 To Month3)
Dim arrayCalendarSaveMonth4(1 To Month4)
Dim arrayCalendarSaveMonth5(1 To Month5)
Dim arrayCalendarSaveMonth6(1 To Month6)
Dim arrayCalendarSaveMonth7(1 To Month7)
Dim arrayCalendarSaveMonth8(1 To Month8)
Dim arrayCalendarSaveMonth9(1 To Month9)
Dim arrayCalendarSaveMonth10(1 To Month10)
Dim arrayCalendarSaveMonth11(1 To Month11)
Dim arrayCalendarSaveMonth12(1 To Month12)

petrinm [15.02.2008 20:31:45]

#

Tässä yksi ratkaisu.
En ole varma koodin toimivuudesta, kun en pääse kääntämään mutta tähän tyyliin.

Option Explicit
Public Const SoftwareSettings = "C:\betasofta v0.1 - asetuskansio\betasofta v0.1 asetukset.txt"
Public Const CalendarSettings = "C:\betasofta v0.1 - asetuskansio\betasofta v0.1 - Kalenterin asetukset.txt"

Public Const CalendarFile = "C:\betasofta v0.1 - datakansio\betasofta v0.1 - Kalenterin tallennustiedosto, kuukausi"


Dim MaxDayPerMonth(1 To 12) As Integer

Dim arrayCalendarSaveMonth(1 To 12, 1 To 31) As String



Sub Lataa()
    MaxDayPerMonth = Array(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)

    Dim i As Integer
    Dim a As Integer
    Dim rivi As String

    For i = 1 to 12
        ' Avataan tiedosto
            Open CalendarFile & i & ".txt" For Output As #1
                ' Käydään tiedostoa rivi riviltä kunnes se loppuu
                    Do Until EOF(1)
                        a = a + 1 ' lisätään rivilaskuriin yksi
                        Line Input #1, rivi ' luetaan rivi
                        arrayCalendarSaveMonth(i, a) = rivi ' talletetaan rivi
                        If MaxDayPerMonth(i) = i Then End Loop 'tarkistus ettei luetaa ylimääräistä
                    Loop
            Close #1 'Suljetaan tiedosto
            a = 0 ' nollataan rivi laskuri
    Next i
End Sub

rautamiekka [15.02.2008 21:44:25]

#

Luulen että ymmärsit koodini paremmin kuin itse :). Itse tarkoitin

MaxDayPerMonth(Month1 to Month12)

muistiksi että kuinka monta päivää on jokaisessa kuukaudessa ja näiden päivien maksimi määritin Month1-12 muuttujiin, mutta unohdin miten olin ajatellut käyttää tätä MaxDayPerMonth-muuttujaa. Näytät keksineen paremman tavan järjestää tuo arrayCalendarSaveMonth (muuttujan nimi kyllä on väärä, liikaa ajateltavaa kerralla ollut).

rautamiekka [16.02.2008 15:04:06]

#

Miten tallennan kalenterin datan ?

setä [16.02.2008 16:57:06]

#

Tuossa petrinm:n esimerkissä pitää ilmeisesti olla For Outputin tilalla For Input, kun tiedostoa kerran luetaan. Tallennus tiedostoon hoituu sitten avaamalla tiedosto Output-moodissa.

Antti Laaksonen [16.02.2008 17:18:26]

#

Tässä tulee toinen esimerkki kalenterin tietojen tallennuksesta. Tiedot ovat taulukossa, jota varten on määritetty oma tietotyyppi. Jokaisella taulukon rivillä on päivämäärä ja siihen liittyvä tieto. Aliohjelma UusiTieto lisää uuden päivämäärän ja tiedon taulukkoon ja kasvattaa laskurimuuttujaa. Aliohjelma Tallennus tallentaa kalenterin tiedot binääritiedostoon, ja aliohjelma Lataus lataa tallennetut tiedot binääritiedostosta. Lisäsin formille vielä kaksi nappia, joista toinen lisää kalenteriin kolme tietoa ja tallentaa sen ja toinen lukee tiedot tiedostosta ja näyttää tämän vuoden helmikuuhun osuvat tiedot.

Option Explicit

Private Type Kalenteritieto
    pvm As Date
    tieto As String
End Type

Dim tiedot(1000) As Kalenteritieto
Dim maara As Integer

Sub UusiTieto(pvm As Date, tieto As String)
    maara = maara + 1
    tiedot(maara).pvm = pvm
    tiedot(maara).tieto = tieto
End Sub

Sub Tallennus(tiedosto As String)
    Dim i As Integer
    Open tiedosto For Binary As #1
    Put #1, , maara
    For i = 1 To maara
        Put #1, , tiedot(i)
    Next
    Close #1
End Sub

Sub Lataus(tiedosto As String)
    Dim i As Integer
    Open tiedosto For Binary As #1
    Get #1, , maara
    For i = 1 To maara
        Get #1, , tiedot(i)
    Next
    Close #1
End Sub

Private Sub Command1_Click()
    UusiTieto "2008-02-20", "kokous"
    UusiTieto "2008-12-24", "jouluaatto"
    UusiTieto "2008-02-27", "loma"
    Tallennus "c:\omat\kalenteri.dat"
End Sub

Private Sub Command2_Click()
    Dim i As Integer
    Lataus "c:\omat\kalenteri.dat"
    For i = 1 To maara
        If Year(tiedot(i).pvm) = Year(Now) And Month(tiedot(i).pvm) = 2 Then
            MsgBox tiedot(i).pvm & ": " & tiedot(i).tieto
        End If
    Next
End Sub

En tunne käyttämääsi kalenterikontrollia, mutta toivottavasti tästä esimerkistä on kuitenkin apua. Jos kontrolliin itseensä pystyy tallentamaan tietoja, erillinen taulukko on kenties tarpeeton, mutta ei siitä ole koskaan haittaa.

rautamiekka kirjoitti:

Voisitko kertoa jokaisen pienenkin asian mitä tuo toinen koodi tarkalleen tekee joka kohdassa ?

Kaipaatko vielä selvennystä tuohon heksaeditorikoodiin, vaikka se ei juuri liitykään aiheeseen?


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta