Avatar billede jensee Nybegynder
10. oktober 2006 - 15:04 Der er 4 kommentarer og
1 løsning

Skrivning til Binær fil

Jeg sidder med et program der i hver linie i en binær fillæser en række variable og skriver dem til en ny efter de er korrigeret.

Det fungerer sådan set fint, men skrivningen til den nye fil kører langsomt, og det er efterhånden blevet en gene.

jeg skriver på nuværende tidspunkt de omtalte variable til den nye binære fil på følgende måde.

Dim XKorLokal As Long
Dim YKorLokal As Long
Dim ZKorLokal As Long
Dim RelYKorLokal As Integer
Dim KortTextLokal As String * 12

Put #FileID, , XKorLokal
Put #FileID, , YKorLokal
Put #FileID, , ZKorLokal
Put #FileID, , RelYKorLokal
Put #FileID, , KortTextLokal, osv



Der er ca 20 variable i hver linie, og jeg ville gerne kunne skrive dem på én gang, sådan at programmet ikke skal have fat i den nye fil så mange gange og skrive ned i den.

Jeg har et tilsvarende program der arbejder med Ascii filer, og der samler jeg bare variablerne til en lang streng og skriver en hel linie af gangen.

Kan noget tilsvarende lade sig gøre for binære data??
Avatar billede learningvba Nybegynder
11. oktober 2006 - 08:29 #1
Brug en Type-erklæring.

(OBS: Nedenstående er lavet i Excel-VBA, så det kan måske være nødvendigt med justeringer til VB)

'Lav et modul, copy'n'paste koden ind:

Option Explicit

'Data bliver gemt i en "Record" af denne type:
Type tKortData
  XKorLokal As Long
  YKorLokal As Long
  ZKorLokal As Long
  RelYKorLokal As Integer
  KortTextLokal As String * 12
End Type

Dim KortData As tKortData

Sub WriteRecord()
  Dim lFileNumber As Long
  Dim bCounter As Byte
  Const FilNavn As String = "C:\Temp\KortData.Bin" ' Ret sti & navn til :-)
 
  lFileNumber = FreeFile 'Returnerer ledigt filnummer.
 
  'Åben binær-filen for skrivning. Lås for andre.
  Open FilNavn For Binary Access Write Lock Write As lFileNumber
 
 
  'Hæld lidt testdata ind:
  For bCounter = 0 To 254
      With KortData
        .XKorLokal = 1000
        .YKorLokal = 2000
        .ZKorLokal = 3000
        .RelYKorLokal = bCounter
        .KortTextLokal = "Lokal12"
      End With
     
      'Skriv Record i filen
      Put #lFileNumber, , KortData
  Next bCounter
  'Luk filen
  Close lFileNumber
 
  'Rens Record. Evt. fejl giver så en forkert værdi ved genindlæsning.
  With KortData
      .XKorLokal = 0
      .YKorLokal = 0
      .ZKorLokal = 0
      .RelYKorLokal = 0
      .KortTextLokal = ""
  End With
 
  lFileNumber = FreeFile 'Returnerer ledigt filnummer
 
  'Åben binær-filen for læsning. Lås for andre.
  Open "C:\Temp\KortData.Bin" For Binary Access Read Lock Read As lFileNumber
 
  While Not EOF(lFileNumber)
      'Læs record fra filen
      Get #lFileNumber, , KortData
      'Vis hentet indhold
      With KortData
        MsgBox "Hentet" & vbNewLine & _
                "XKorLokal = " & .XKorLokal & vbNewLine & _
                "YKorLokal = " & .YKorLokal & vbNewLine & _
                "ZKorLokal = " & .ZKorLokal & vbNewLine & _
                "RelYKorLokal = " & .RelYKorLokal & vbNewLine & _
                "KortTextLokal = " & .KortTextLokal, _
                vbOKOnly, "Data gemt i filen:"
      End With
  Wend
  'Luk filen
  Close lFileNumber
End Sub
Avatar billede jensee Nybegynder
11. oktober 2006 - 12:02 #2
Det ser jo ud til at være det jeg leder efter. Har rygende travlt, men håber jeg får tid til at teste det lidt senere. Foreløbig tak.
Avatar billede jensee Nybegynder
11. oktober 2006 - 15:46 #3
Det virkede perfekt, og det sparer en del tid - så smid et svar.

Der er temmeligt meget data i nogle af de filer jeg bearbejder, og programmet har jo stadig den nye fil åben til skrivning en gang på linie. Ville det kunne spare yderligere tid at skrive alle linierne i et array, og så skrive filen en gang for alle til sidst??

Jensee
Avatar billede jensee Nybegynder
11. oktober 2006 - 15:46 #4
og der skulle stå pr. linie og ikke på linie...
Avatar billede learningvba Nybegynder
12. oktober 2006 - 08:06 #5
Tak for respons, jeg er glad for at det kunne hjælpe dig :-)

Tidsbesparelse: ja, du vil kunne hente lidt tid, men da OS'et cacher data fra/til hd'ere tror jeg ikke at du vinder timer :-).
"Temmeligt meget data" er et lidt abstrakt begreb :-), for hvis du har så meget data at dit programmet skal bruge virtuel hukommelse (hd-plads) så ryger besparelsen lidt.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester