Toon posts:

[vb6] Max. filegrootte van in te lezen file

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik moet een bepaald bestand uitlezen vanuit mijn programma, daar ik bij visual basic geen fatsoenlijke leesfunctie voor files heb kunnen vinden heb ik de standaard API's van windows maar gebruikt en die wil mijn file niet inlezen.

Functie:
code:
1
 Declare Function CreateFile Lib "kernel32.dll" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long


het enigste wat ik met die functie kan inlezen is een kleine textfile of iets dergelijks wat klein is en dan praat ik over < 1kb. Het gaat erom dat ik op een bepaalde offset een bepaald aantal bytes kan lezen. Wie weet of dat ook met visual basic functies gaat of waaraan het kan liggen dat die api functie maar zo'n kleine files pakt

  • Mir
  • Registratie: Maart 2001
  • Niet online

Mir

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
'Schrijven
open sFile for output as #1
    print #1, " tralala" 
close #1

'Lezen
open sFile for input as #1
    Line Input #1, sBuffer
close #1

'Append (erbij schrijven)
open sFile for append as #1
    print #1, " tralala"
close #1


?

[ Voor 0% gewijzigd door Mir op 28-08-2002 16:21 . Reden: wat uitvoeriger ]


Verwijderd

Topicstarter
Ja die had ik ook gevonden maar ik moet 4 bytes inlezen op verschillende offsets in de file en dat gaat met die functie niet. :)

  • Mir
  • Registratie: Maart 2001
  • Niet online

Mir

Open sFile for binary as #1

:)

Verwijderd

Hallooooooo! Hoezo layout verneuken? Kun je in het vervolg eerste even kijken hoe je bericht eruit komt te zien? Ik denk dat veel mensen je dankbaar zullen zijn.

  • Mir
  • Registratie: Maart 2001
  • Niet online

Mir

Goed, en dan gaan we nu zinnig antwoord geven he raccoon?

Who cares about it..ik vind api's niet te lezen als je ze wrapt!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 30-08 17:59

Gerco

Professional Newbie

code:
1
2
3
4
5
6
Dim b(0 to 3) As Byte

Open "bestand.dat" For Binary As #1
  Seek #1, offset
  Get #1, , b()
Close 1

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Verwijderd

Topicstarter
Maar hoe zet je de pointer dan op bijv. 100 bytes vanuit het begin v.d file gezien. En hoe lees je op die plek dan 4 bytes in, zet je die om naar big endian byte order, deelt deze door 2 en berekent met dit getal de offset voor de volgende record. Doe dat eens met die functie. :)

  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 28-08 17:06

Sponge

Serious Game Developer

Get #1, 100, variable*
Get #1, 200, variable*

leest op posite 100 en 200 in de file de lengte in van de variabele

dus als je een integer variabele gebruikt 2 bytes, een long 4 bytes. Als je gewoon de bytes wil hebben, kun je gewoon een byte array gebruiken (dim variabele(3) as byte = 4 bytes)

Ik zou aanraden om naar msdn.microsoft.com te gaan en daar naar "Get" en "put" te zoeken, voor VB. Denk dat je daar wat meer aan hebt dan allemaal individuele replies :)

Verwijderd

Topicstarter
En trouwens racoon, normaal wrap ik mijn code altijd maar lees hem zo maar eens dan:

Declare Function CreateFile Lib "kernel32.dll" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long

daar wordt je toch niet wijs uit. :)

  • pasz
  • Registratie: Februari 2000
  • Laatst online: 16-08 23:04
code:
1
2
3
4
5
Dim A(4) AS byte

Open "bestand.dat" For Binary As #1
  Get #1,100 , A()
close 1


dan heb je vier bytes in je array A
de rest bereken je zelf maar :)

woei!


  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 28-08 17:06

Sponge

Serious Game Developer

Overigens, voor de BigEndian gedoe (weet niet wat VB standaard doet eigenlijk), moet je een aantal functie hebbendie of direct met een getal werken, zoals integer/long, of met de bytes werken. Denk dat je op pscode.com of met google kunt vinden hoe je dat precies doet.. Zelf heb ik het nog nooit gedaan namelijk.

Verwijderd

Topicstarter
Dat is het juist die hoeven niet in een array, het gaat erom dat ik gewoon in die file op die verschillende offsets kan lezen. nu doe ik dat zo:

alle vars wat je zijn zijn van het type long

lowbyte = SetFilePointer(hFile, lowbyte, highbyte, FILE_BEGIN)
retval = ReadFile(hFile, rdrecnum, 4, numread, ByVal CLng(0))

hfile is de file handle
lowbyte en highbyte zijn de offsets
FILE_BEGIN wil zeggen vanuit het begin bekeken
rdrecnum is de lengte van de record waar de pointer op dat moment staat
4 is het aantal bytes wat hij inleest in rdrecnum
numread krijgt na het lezen de waarde hoeveel bytes hij gelezen heeft (kijken of het niet EOF is)

ik heb de msdn cd's zelf maar daar staat het niet zo duidelijk in

Verwijderd

Topicstarter
intel heeft standaard little endian, big eindian is van sun en motorola.

(offtopic)
mocht iemand hier ooit data moeten omzetten van big naar little endian:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Function Swap_32(n As Long) As Long
    Dim TempLong As LongType
    Dim OrigBytes As FourByteType
    Dim NewBytes As FourByteType
      
    TempLong.l = n
    LSet OrigBytes = TempLong
    NewBytes.b1 = OrigBytes.b4
    NewBytes.b2 = OrigBytes.b3
    NewBytes.b3 = OrigBytes.b2
    NewBytes.b4 = OrigBytes.b1
    LSet TempLong = NewBytes
    Swap_32 = TempLong.l
End Function

(/offtopic)

die heb ik al gemaakt dat is heel simpel het ging me om het inlezen... :)
Pagina: 1