Hej! Hade en tråd om "Problem med att läsa in okända tecken i VB". Nu så har det löst sig för att jag fick skitansbra tips av folk hur jag kunde få fram okända tecken i VB. Hej Tony Så här är grund principen men detta är nog inte optimalt.Problem med inläsning av fil.... igen....
Nu så har ett annat problem dykt upp och det är längden på texten som jag inte får det till att stämma...
Jag läser in texten från en txt-fil med följande kod:
For i = 0 To (List1.ListCount - 1)
Open List1.List(i) For Binary Access Read As #ihl
'Read de textlength
Get #ihl, , itLength
'Create a buffer big enough to read the text
tBuffer = String$(itLength, 32)
'Read the text
Get #ihl, 1, tBuffer
'Let me see wat we read
Text1.Text = tBuffer
Close #ihl
Next
Det visar sig att jag inte får med alla tecken... två konstiga fel,
1. text1.text visar inte hela strängen som finns inne i txt-filen.
2.längden på strängen stämmer inte vad jag har i txt-filen.
När jag tar:
text2.text = len(tBuffer)
så får jag en längd på 18511, detta kan kanske bero på tBuffer = String$(itLenght,32) men ändå, den mäter ju fel....
Hur kan jag göra för att få ut hela strängen, dvs den verkliga längden av texten ska stämma...
MVH
TonySv: Problem med inläsning av fil.... igen....
Det där med binär läsning kan vara lite struligt och i detta fall har du strulat till det lite väl mycket. Om du tänker dig att du läser en fil precis som en gramofonskiva binärt och flyttar nålen framåt, sen bakåt - då börjar du om från början igen. Med ditt andra kommando i loopen så pekar du ut att du skall läsa från position 1 igen vilket resulterar i att du aldrig går framåt.
Skriver du:
<code>
for a=1 to 10
Get #f, , buffer
next
</code>
så läser den in buffer 10 gånger. om buffer är dimentionerad som sträng och 1 tkn så är du sen när du är klar med loopen på position 11. Om du istället anger position, kommer du hamna på samma ställe hela tiden, dvs:
<code>
for a=1 to 10
Get #f, 1, buffer
next
</code>
Så i detta fall får du antingen ha en variabel som du ökar och skriver i ditt get-kommando, eller vara utan - du kan inte göra både och. Ex:
<code>
dim buffer as string * 1
for a=1 to 10
Get #f, a, buffer
next
</code>
Om du vill läsa 10 tecken itaget,
<code>
dim buffer as string * 10
for a=1 to 10
Get #f, , buffer
next
</code>
gör att du hoppar 10 i taget. Det hade även gått med
<code>
dim buffer as string * 10
for a=1 to 100 step 10
Get #f, a , buffer
next
</code>
osv, osv. Hoppas du förstår mekaniken och det gör dig lite klokare i hur det fungerar. Om vi istället säger att du skall läsa position 1-5, 180-185 och sen därefter från position 500 till slutet av filen:
<code>
dim buffer as string * 5
Get #f, 1 , buffer
Get #f, 180 , buffer
dim largebuffer as string * 1024
for a=500 to lof(#f) step 1024
Get #f, a , largebuffer
next
</code>
Lof(#f) säger hur många bytes hela filen är så vi får därmed reda på längden. Det gör även att den sista läsningen troligen inte är exakt 1024 tecken så då måste du göra en avslutande loop där du i förväg dimentionerar "resten" och kör den.
Det finns ett bra exempel på filesplit i programarean om jag inte minns fel som visar hur du läser binärt för att göra saker. Håller du på med zip-filsheader eller liknande finns också sådana exempel liggandes om jag inte minns fel.
Fråga gärna igen om du inte förstår hur det går till eller att jag varit otydlig. Lycka tillSv: Problem med inläsning av fil.... igen....
Det tar en fruktansvärt lång tid om det är en stor fil.
Bara vänta så kommer Text1 att fyllas.
Jag har missat något men kommer inte på det jus nu.
<code>
Option Explicit
Private Sub Command1_Click()
Dim ihl As Long, buffLen As Long
Dim byteBuff As Byte
Dim i As Long
ihl = FreeFile
'Se till att det står rätt sökväg här
'detta är min test på ca 70 000 byte
'tar förskräckligt lång tid
Open "C:/volvo.jpg" For Binary Access Read As #ihl
buffLen = LOF(ihl)
Text1.Visible = False
Command1.Caption = "Vänta Jag Jobbar"
Screen.MousePointer = vbHourglass
DoEvents
For i = 1 To buffLen
Get #ihl, i, byteBuff
'Viktigt Text1 skall vara Multiline = True
Text1.Text = Text1.Text & Chr$(byteBuff)
Next 'i
Text1.Visible = True
Close #ihl
Screen.MousePointer = vbDefault
Command1.Caption = "Klar"
End Sub
</code>