Avatar billede maagefinke Nybegynder
15. april 2003 - 10:43 Der er 24 kommentarer og
1 løsning

VB 6.0 Undgå overskrivning af gamle data i fil

Jeg sidder og studerer(fnis!)og vil gerne undgå at overskrive de data jeg allerede har gemt. Hvordan gør jeg det. Jeg har nedenstående:
Option Explicit
Dim navn(200)
Dim antalnavne As Integer

Private Sub Command1_Click()
antalnavne = 0
Do
antalnavne = antalnavne + 1
navn(antalnavne) = InputBox("Skriv navn nr. " & antalnavne & ". Afslut med tomt navn")
If navn(antalnavne) = "" Then
antalnavne = antalnavne - 1
Exit Do
End If
Loop
MsgBox "Du skrev " & antalnavne & " navne."
End Sub

Private Sub Command2_Click()
Dim navnid As Integer
Open "c:\vbprojekter\familie.txt" _
For Output As #1
    For navnid = 1 To antalnavne
        Print #1, navn(navnid)
    Next
    Close #1
End Sub
   
  Private Sub Command3_Click()
antalnavne = 0
Open "c:\vbprojekter\familie.txt" _
For Input As #1
    Do While EOF(1) = False
        antalnavne = antalnavne + 1
        Line Input #1, navn(antalnavne)
        Loop
  Close #1
End Sub


Private Sub Command4_Click()
Dim navnid As Integer
    List1.Clear
    For navnid = 1 To antalnavne
    List1.AddItem navn(navnid)
    Next

End Sub
Avatar billede klaphat Nybegynder
15. april 2003 - 10:45 #1
Omdøber den første fil til et eller andet, f.eks. BUP (BackUP), skriver en ny fil, sletter .BUP-filen.
Avatar billede maagefinke Nybegynder
15. april 2003 - 10:48 #2
>Klaphat Jeg vil gerne fortsat kunne skrive til samme fil. Altså lave tilføjelser.
Avatar billede jelzin101 Praktikant
15. april 2003 - 10:48 #3
istedet for open for input kan du bruge open for append.
Avatar billede maagefinke Nybegynder
15. april 2003 - 10:49 #4
For append #1?
Avatar billede jelzin101 Praktikant
15. april 2003 - 10:53 #5
Open "test.txt" for append as #1

  print #1, Variable

Close #1

for eks.
Avatar billede maagefinke Nybegynder
15. april 2003 - 11:02 #6
jelzin101
Så blev min kode ændret til:
og det virker ikke. Jeg kan måske godt skrive til filen men jeg får intet frem igen. Kunne du prøve at skrive hele koden ind i den jeg har oplyst?
  Private Sub Command3_Click()
antalnavne = 0
Open "c:\vbprojekter\familie.txt" For Append As #1
  Do While EOF(1) = False
        antalnavne = antalnavne + 1
        Print #1, navn(antalnavne)
        Loop
  Close #1
End Sub
Avatar billede martin_moth Mester
15. april 2003 - 11:13 #7
http://www.eksperten.dk/kat/5/?searchtype=txt&words=append&method=and&sort=score&catid=5

Er du utryg ved Append, kan du læse filens linier til et array af linier, og skrive linierne til filen een gang til, med de nye tilføjelser
Avatar billede martin_moth Mester
15. april 2003 - 11:17 #8
>> maagefinke: Din kode ser lidt sjov (forkert) ud, og jeg kan ikke gennemskue hvad du forsøger (hvad bruger du EOF til?) - men kik på nogle af de links jeg gav dig, der er masser af gode forklaringer :o)
Avatar billede martin_moth Mester
15. april 2003 - 11:18 #9
PS: måske kunne du også gøre brug af Redim Preserve på dit navne-array (bare et forslag, det er jo ikke det du spørger om ;o)
Avatar billede maagefinke Nybegynder
15. april 2003 - 11:35 #10
>martin moth Jeg forsøger blot at lære at skrive til en fil. Og lave tilføjelser til den. Koden virker men når jeg tilføjer - overskrives der.
Det er fra bogen start Visual Basic 6.0 men jeg er ikke nået så langt. Måske foregriber jeg begivenhedernes gang. Men sådan lærer jeg bedst.
Det jeg bare lige ville have at vide er hvad jeg skal tilføje for ikke at overskrive.
Avatar billede klaphat Nybegynder
15. april 2003 - 11:49 #11
Problemet med tekstfiler er at du er nødt til at behandle dem som var de en gammel matrix-printer :-) eller skrivemaskine :-)

Dvs. du kan tilføje, og ikke andet. (Her bruger du Append)

Hvis du vil ændre i rækkefølgen, så er det en ny fil.
Hvis du vil slette et navn, så er det en ny fil.

Har ikke lige vb her, så jeg kan desværre ikke lige skrive lidt kode :-)
Avatar billede martin_moth Mester
15. april 2003 - 11:53 #12
maagefinke: Den kode du har vist kan jeg i bedste vilje kun få til at ligne noget vrøvl.
Skrive/læse fra fil: http://www.eksperten.dk/spm/252223
Appende til fil:
  Open "C:\MinFil.txt" For Append As #1
  Print #1, "Blaaaa - denne linie bliver TILFØJET UNDER de andre"
  Close #1

I din kode ligner, at du forsøger at både læse, appende og alt muligt på een gang ;o)
Avatar billede maagefinke Nybegynder
15. april 2003 - 11:53 #13
>tak,klaphat men skal jeg skrive
for append as #1 i stedet for
For Input As #1
Avatar billede maagefinke Nybegynder
15. april 2003 - 11:55 #14
Min kode virker. Men overskriver tilføjelser. Det ville være rart med lidt konkret kode. Det må være command3.
Avatar billede martin_moth Mester
15. april 2003 - 12:00 #15
maagefinke: Hvad vil du have - sådan skåret ud i pap?
Avatar billede martin_moth Mester
15. april 2003 - 12:09 #16
Du læser og skriver til en fil som beskrevet i http://www.eksperten.dk/spm/252223

Du appender til en fil sådan:

Open "C:\MinFil.txt" For Append As #1
  Print #1, "Blaaaa - denne linie bliver TILFØJET UNDER de andre"
Close #1

Du kan ikke skrive/læse/appende samtidigt - een ting ad gangen :o)
Avatar billede maagefinke Nybegynder
15. april 2003 - 12:42 #17
Med command1 skaffer jeg data til filen. famile.txt
Med command2 gemmer jeg data
Med command3 indlæser jeg data fra filen
Med command 4 får jeg vist data
i filen famile.txt
alt virker.
Jeg indtaster  fx
1 a-sen
2b-sen
gemmer og henter frem igen
vil tilføje
3 c-sen og
4 d-sen
gemmer og vil se filen
nu står der i filen
c-sen og
d-sen
a-sen og
b-sen
blev overskrevet.
Det jeg spørger om er ganske enkelt (efter min mening)
hvordan skal jeg ændre de bestående 4 koder
hvis jeg vil kunne se alle 4 navne i filen ?
Avatar billede martin_moth Mester
15. april 2003 - 12:55 #18
Så går det galt når du tilføjer data - sikkert fordi du åbner som Input og ikke append. Du kan jo åbne filen i en texteditor, for at følge med i hvad der sker med filen. Denne kode tilføjer til en fil uden at overskrive:

Open "C:\MinFil.txt" For Append As #1
  Print #1, "Blaaaa - denne linie bliver TILFØJET UNDER de andre"
Close #1

Men vis din kode, så skal jeg nok finde fejlen :o)
Avatar billede maagefinke Nybegynder
15. april 2003 - 13:07 #19
>martin moth
Mine koder står alle 4 i forbindelse med mit spørgsmål.
Avatar billede maagefinke Nybegynder
15. april 2003 - 13:19 #20
Her er hele min kode.
Hvis jeg laver en command5.tilføj data hvordan skal den så se ud.
Jeg vil gerne beholde inputboxen som vist under "SkafData"
Avatar billede maagefinke Nybegynder
15. april 2003 - 13:20 #21
Option Explicit
Dim navn(200)
Dim antalnavne As Integer
Private Sub SkafData_Click()
antalnavne = 0
Do
antalnavne = antalnavne + 1
navn(antalnavne) = InputBox("Skriv navn nr. " & antalnavne & ". Afslut med tomt navn")
If navn(antalnavne) = "" Then
antalnavne = antalnavne - 1
Exit Do
End If
Loop
MsgBox "Du skrev " & antalnavne & " navne."
End Sub

Private Sub GemData_Click()
Dim navnid As Integer
Open "c:\vbprojekter\familie.txt" _
For Output As #1
    For navnid = 1 To antalnavne
        Print #1, navn(navnid)
    Next
    Close #1
End Sub
   
  Private Sub IndlaesData_Click()
antalnavne = 0
Open "c:\vbprojekter\familie.txt" _
For Input As #1
    Do While EOF(1) = False
        antalnavne = antalnavne + 1
        Line Input #1, navn(antalnavne)
        Loop
  Close #1


End Sub


Private Sub VisData_Click()
Dim navnid As Integer
    List1.Clear
    For navnid = 1 To antalnavne
    List1.AddItem navn(navnid)
    Next

End Sub
Avatar billede martin_moth Mester
15. april 2003 - 14:22 #22
Ovenstående virker fint, antager jeg?

Her har du den til TilføjTilFil:

Private Sub TilføjTilFil_Click()
 
'Gemmer antalnavne i en lokal variabel
  Dim OprindeligtAntal as integer
  Dim i As Integer
  OprindeligtAntal = antalnavne

'Beder brugeren om at indtaste nye navne i dit array
  Do
    antalnavne = antalnavne + 1
    navn(antalnavne) = InputBox("Skriv navn nr. " & antalnavne & ". Afslut med tomt navn")
    If navn(antalnavne) = "" Then
      antalnavne = antalnavne - 1
      Exit Do
    End If
  Loop
  MsgBox "Du TILFØJEDE " & antalnavne & " navne."

'Tilføjer til filen
  Open "c:\vbprojekter\familie.txt" For Append As #1
    for i = oprindeligtantal to antalnavne
      Print #1, "navn(i)
    next i
  Close #1
End Sub


Der er plads til masser af forbedringer i dit program - du resetter antalnavne i SkafData_Click(), og klikker du på den flere gange i dit program mens det kører, går der ged i det. Desuden bør du nok kikke på Redim og Preserve mht. dit Array - der er ingen grund til fra start at gøre plads til 200 poster i det. Desuden fylder du aldrig noget ind på første plads i arrayet (der starter med index 0, ikke index 1)  Osv. Men du siger jo selv at du er i "opstartsfasen", så det kommer nok ;o)

I ovenstående kode har jeg ikke skrevet noget, der ikke har været nævnt i dette spørgsmål 6-7 gange før, men det kan jo være svært at se det hele i den store sammenhæng ;o)

Good luck, Martin
Avatar billede martin_moth Mester
15. april 2003 - 14:24 #23
PS: Alternativt behøver du slet ikke bruge append, du kan jo åbne filen for OUTPUT og så lade tælleren gå fra 1 til antalnavne i stedet for fra oprindeligtantal til antalnavne - så skriver du bare HELE arrayet til filen een gang til (og overskriver det der stod før), fra start til slut af arrayet. Er der 10000000 linier er det dog langt hurtigere at bruge Append :o)
Avatar billede maagefinke Nybegynder
15. april 2003 - 14:54 #24
Mange tak for de gode råd. Det er lidt overvældende. Problemet når man er nybegynder er jo at formulere problemet! Jeg har forhøjet lidt fordi det nok var sværere end som så. Mange tak.
Avatar billede martin_moth Mester
15. april 2003 - 15:27 #25
ok - du fandt løsningen :-)

I øvrigt en GOD ide at læse en bog som du gør...
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