Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: Onko kaikki tiedot luettu ?

Sivun loppuun

mrkebab [02.04.2006 13:12:14]

#

Eli luen tietoja tauluun tiedostosta.

Nyt ongelmana on se, tiedostossa on rivien välissä useampia
välilyöntejä, joten tämä tarkistus ei pelaa:

If TekstiRivi = "" Then Exit Do

Eli olisiko jotain funktiota tms. joka tarkistaisi paremmin, että onko tiedosto tosiaan luettu kokonaan loppuun ?

Työkaluna: MS Visual Basic 2005 Express Edition


EDIT: eli ei ole mistään tietokantataulusta kyse, vaan taulu on määritelty näin:

Dim Table As New ArrayList

setä [02.04.2006 13:25:31]

#

EOF(#F) = True kun tiedosto #F on luettu loppuun (Ainakin VB:ssä, eiköhän tuossakin)

mrkebab [02.04.2006 13:57:14]

#

Kiitos. Nyt vain ihmetyttää, että missä voin määritellä, että tiedosto olisi vaikka 1

Ohjeissa oli esimerkki:

FileOpen(1, "TESTFILE", OpenMode.Input)
Do While Not EOF(1)

Mutta olen jo aikaisemmin määritellyt, että tiedosto on auki jne..

Dim fs As New FileStream("C:\kansio\tiedosto.txt", FileMode.Open, FileAccess.Read)

Joten miten saisin määriteltyä, että voisin laittaa näin näin: EOF(1)

setä [02.04.2006 14:31:00]

#

Jos tossa Expressissä toimii, käytä avaukseen Open-käskyä:
Open "C:\kansio\tiedosto.txt" For Input As 1
Edit. Tai siis avaa se tuolla ohjeen esimerkillä.

Metabolix [02.04.2006 14:52:52]

#

FileStream-luokassa ei ole EOF-metodia, mutta korvikkeeksi löytyy purukumia:

If fs.Length = fs.Position Then
    ' Loppu tuli.
End If

Length on siis tiedoston pituus, ja Position on sijainti sillä hetkellä. Jos sijainti on sama kuin tiedoston pituus, ollaan tietenkin lopussa.

mrkebab [02.04.2006 18:53:34]

#

Olen "hiukan" käsi ohjelmoinnissa, mutta kokeilin tällätavalla rakentaa looppia, mutta nyt looppiin ei mennä ollenkaan, vaan saan heti tekstin: poistuttiin loopista ?

Do While fs.Length = fs.Position

        Dim RiviTekstia As String

            RiviTekstia = sr.ReadLine
            Table.Add(RiviTekstia)
            MsgBox("Päästiinko looppiin?")


        Loop
        MsgBox("Poistuttiin loopista")
        sr.Close()

Metabolix [02.04.2006 18:56:51]

#

Looppaat nyn niin kauan kuin ollaan tiedoston lopussa. Eli yhtäsuuruusmerkki erisuuruusmerkiksi tai pienempi-kuin-merkiksi, niin sitten toimii.

Sisennyksiäkin voisi hieman harjoitella. Luulin ensi silmäyksellä, että tuosta puuttuu silmukan loppuosa, kun ei sisennys ollut kohdallaan. Ja VB:lle on aivan omakin kooditagi nimeltään vbkoodi, suosittelen.

mrkebab [02.04.2006 20:09:51]

#

No ei nyt ihan vielä toiminut?.

Vähän ihmetyttää, kun käytän ascii tiedostoa (yli 6000 riviä), niin silloin toimii paremmin, vaikka silloinkin jää n. 20 riviä loppupäästä puuttumaan, mutta nyt kun testaan 10 rivisellä tiedostolla (tiedosto.txt), niin ainoastaan ensimmäinen rivi luetaan taulukkoon:

Dim fs As New FileStream("C:\kansio\tiedosto.txt", FileMode.Open, FileAccess.Read)
Dim sr As New StreamReader(fs)
Dim Table As New ArrayList
Dim RiviTekstia As String
Dim Taulunkoko As Integer


     Do While fs.Length <> fs.Position

            RiviTekstia = sr.ReadLine
            MsgBox("" & RiviTekstia)
            Table.Add(RiviTekstia)



     Loop

sr.Close()
Taulunkoko = Table.Count
MsgBox("Taulun koko:" & Taulunkoko)

Metabolix [02.04.2006 20:35:42]

#

StreamReader todennäköisesti lukee valmiiksi muistiin jotain, jolloin tiedosto loppuu jo ennen kuin kaikki on saatu StreamReaderista ulos.

Jos olisit jaksanut Googleen kirjoittaa StreamReader, olisit löytänyt MSDN:stä esimerkin, josta löytyy hyvin yksinkertainen tapa:

Do
  Rivi = sr.ReadLine()
  Table.Add(Rivi)
Loop Until Rivi Is Nothing

mrkebab [02.04.2006 20:42:58]

#

Käyttelen VB:tä melkeinpä ensimmäistä kertaa, joten olen aika pihalla vielä.

Mutta nyt toimii, kiitos paljon!.


Sivun alkuun

Vastaus

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

Tietoa sivustosta