Avatar billede karl_fritjof Nybegynder
14. november 2000 - 19:40 Der er 27 kommentarer og
2 løsninger

Skrive en linje til en txtfil.

Kan jeg skrive bare en linje til en txtfil i toppen. Uden at skulle loade hele filen. Den måde jeg har lært det på, er at gemme hver linje som en værdi i et arrey. Altså noget i retningen af:

CommonDialog1.ShowSave
Open CommonDialog1.FileName For Output As #1
For pnummer = 0 To 6
    Print #1, person(pnummer)
Next
Close #1
Avatar billede joern Nybegynder
14. november 2000 - 20:06 #1
Hej karl Fritjof.

Det tvivler jeg på er muligt.  Du kan tilføje i slutningen med: Open Filename for Append as #1

Men for at undgå det med arrays kan du bruge to filer:
Open fil1 for input as #1
Open fil2 for output as #2
  for pnummer = 0 to 6 
    print #2, person(pnummer)
  Next
  Do while EOF(1)=False
    Line input #1, string
    print #2, string
  Loop
Close #1
Close #2

FileCopy fil2, Fil1
Kill fil2

Kill hvis du vil rydde op.  Du kan nemlig godt åbne en fil for output, selv om den i forvejen ikke eksisterer.

Med venlig hilsen



Avatar billede steven Nybegynder
14. november 2000 - 20:14 #2
Det du har fat i, er random acces til en fil. Det du skal bruge er sekvensiel access.

Prøv at se om du kan bruge følgende:

Sub OpenTextFile( )
    Const ForReading = 1
    Const ForWriting = 2
    Const ForAppending = 3
    Dim fso    \'Fil System Objekt
    Dim textfil    \'TextStream Fil

    Set fso = CreateObject(\"Scripting.FileSystemObject\")
    Set textfil = fso.OpenTextFile( path , ForWriting , True , TristateFalse)
    textfil.WriteLine \"linie der skal skrives til fil\"
    textfil.Close
End Sub

/Steven
Avatar billede karl_fritjof Nybegynder
14. november 2000 - 20:25 #3
Tak steven det virkede. Du kunne vel ikke forklare torie lidt nærmere. Jeg fandt selv ud af, at man skulle bruge call OpenTextFile (har lavet lidt ASP).
Avatar billede karl_fritjof Nybegynder
14. november 2000 - 20:35 #4
Jeg prøvede lidt videre.Den skriver ikke en ny linje, men den overskriver den gamle!
Avatar billede steven Nybegynder
14. november 2000 - 20:41 #5
Hej karl_fritjof

torie = teori??!?!?!

\'Konstanter der bruges til at fortælle om man skal læse, skrive eller vedhæfte på filen
    Const ForReading = 1
    Const ForWriting = 2
    Const ForAppending = 3

\'Erklæring af to variable. fso er et fil system objekt, som skal bruges når man skriver til en fil på denne måde. textfil, er den variabel, som repressenterer filen når vi bruger fso
    Dim fso    \'Fil System Objekt
    Dim textfil    \'TextStream Fil

\'fso initialiseres
    Set fso = CreateObject(\"Scripting.FileSystemObject\")

\'filen på disken (path) bliver åbnet, ForWriting indikerer at vi ønsker at skrive i filen der kunne lige så godt have stået 2, true fortæller at en ny fil skal oprettes - false fortæller at der ikke oprettes en fil, tristateFalse åbner filen i ASCII - tristateTrue fortæller at filen åbnes i UniCode
    Set textfil = fso.OpenTextFile( path , ForWriting , True , TristateFalse)

\'Her bliver der skrevet en linie i filen
    textfil.WriteLine \"linie der skal skrives til fil\"

\'fil lukkes
    textfil.Close

Det skulle være det hele

/Steven
Avatar billede steven Nybegynder
14. november 2000 - 20:45 #6
Jeg tror ovenstående forklarer lidt nærmere!

/Steven
Avatar billede karl_fritjof Nybegynder
14. november 2000 - 21:26 #7
Jeg kan ikke se ud af teorien, hvordan jeg skal gøre, så den skriver en ny linje i stedet for at overskrive den gamle. Plzzz help
Avatar billede steven Nybegynder
14. november 2000 - 21:29 #8
hvad skal det bruges til?

/Steven
Avatar billede joern Nybegynder
14. november 2000 - 21:51 #9
Jeg kan godt se at Steven er inde i sagen, jeg er bare VB-amatør.  Men lur mig om problemet med overskrivning af de første linier løses med \"fso\".  Jeg har nemlig en laaaang DOS-fortid med meget direkte skrivning til ascii-filer.

M.v.h.  Jørn
Avatar billede steven Nybegynder
14. november 2000 - 21:57 #10
du skal bruge ForAppending i stedet for ForWriting i linien:
Set textfil = fso.OpenTextFile( path , ForWriting , True , TristateFalse)

/Steven
Avatar billede tdaugaard Nybegynder
14. november 2000 - 22:13 #11
ForAppending virker på samme måde som Open.. For Append As .. nøjagigt det samme!
Avatar billede tdaugaard Nybegynder
14. november 2000 - 22:15 #12
DefLng L
DefInt I
DefStr S

Private Sub Command1_Click()
    Open \"c:\\test.txt\" For Input As #1
        strContent = Input$(LOF(1), 1)
    Close #1
   
    Open \"c:\\test.txt\" For Output As #1
        Print #1, \"En ny linie!\"
        Print #1, strContent
    Close #1
End Sub


DET virker!
Avatar billede tdaugaard Nybegynder
14. november 2000 - 22:16 #13
Sku ha været et svar ...
Avatar billede karl_fritjof Nybegynder
14. november 2000 - 22:19 #14
Jeg er ked af det, men det virker ikke, når jeg skriver Set textfil = fso.OpenTextFile( path , ForAppending , True , TristateFalse).

Avatar billede steven Nybegynder
14. november 2000 - 22:20 #15
Set textfil = fso.OpenTextFile( path , ForAppending , True , TristateFalse)

er path = CommonDialog1.FileName ?

/Steven
Avatar billede tdaugaard Nybegynder
14. november 2000 - 22:23 #16
Drop alt det FileSystemObject sjov der ... det er for besværligt ..
Avatar billede karl_fritjof Nybegynder
14. november 2000 - 22:27 #17
Tak tdaugaard
det hjalp. Kunne du ikke fortælle lidt om
Input$(LOF(1), 1)

Og lige et spm mere. Hvordan kan jeg oprette filen, hvis den ikke eksisterer?


Avatar billede karl_fritjof Nybegynder
14. november 2000 - 22:28 #18
steven>>
Jeg havde skrevet en \"fil.txt\" som path. Det virkede godt nok.
Avatar billede tdaugaard Nybegynder
14. november 2000 - 22:30 #19
karl_f:>

Input$(antal_karakterer, fil_handle)
LOF(1) returnerer længden i bytes (tegn) på en fil (1=filhandle)


DefLng L
DefInt I
DefStr S

Private Sub Command1_Click()
    strFile = \"c:\\test.txt\"

    \' Checker om filen eksisterer
    If Dir$(strFile) > \"\" Then
        Open strFile For Input As #1
            strContent = Input$(LOF(1), 1)
        Close #1
    End If
   
    Open strFile For Output As #1
        Print #1, \"En ny linie!\"
        Print #1, strContent
    Close #1
End Sub
Avatar billede karl_fritjof Nybegynder
14. november 2000 - 22:36 #20
Mange tak for hjælpen tdaugaard. Steven får også nogle af pointene, da hans svar egentlig også kunne bruges.
Avatar billede tdaugaard Nybegynder
14. november 2000 - 22:38 #21
\'så lidt.

Hvordan kunne hans svar bruges ? Det skrev jo kun til filen (og overskrev, eller tilføjede til filen i slutning ..) anyway, tak.
Avatar billede steven Nybegynder
14. november 2000 - 22:38 #22
karl_fritjof>>

ÆV og Tak på en gang! ;-)

/Steven
Avatar billede privaten Nybegynder
14. november 2000 - 22:45 #23
Bakker op om tdaudaard\'s løsning, der er nu engang ikke grund til at gøre det mere besværligt end højst nødvendigt. Blot skal man huske at hvis der indlæses til en gammel (fixed-length) streng er man stadig underlagt 64kb grænsen
Avatar billede tdaugaard Nybegynder
14. november 2000 - 22:53 #24
privaten:> Nææ ..

gammel fixed length streng ?
Mener du i ældre versioner af VB, eller ?
Avatar billede buhl Nybegynder
14. november 2000 - 23:07 #25
privaten (& tdaugaard)>>

Alle ikke-fixed-strings skulle befinde sig på heapen og ikke i datasegmentet (i hvert fald i VB6), så der skulle ikke være fare for 64K segment overskridelser her.

Bortset fra dette er joern\'s teknik bestemt stadig brugbar, da han indlæser filen post for post fremfor hele filen på én gang. Lidt afhængig af filstørrelsen kan dette være fordelagtigt.
Avatar billede tdaugaard Nybegynder
14. november 2000 - 23:12 #26
buhl:> VB 5 har heller ikke problemet med 64K ..
joerns svar kan kun fordelagtigt bruges hvis du har filer på over et par megs der skal læses..
Avatar billede joern Nybegynder
14. november 2000 - 23:24 #27
Tak for det Buhl.  Jeg kender godt metoden med at indlæse en hel fil i én streng, men vil også mene der kan opstå problemer, hvis den er stor.
Med \"Line Input\" er det ascii-værdi 13 der skiller posterne.  Ved indlæsning af en fil i en større tekstboks med multiline=true giver det en nydelig gengivelse af det oprindeligt indtastede. Dette anvender jeg jævnligt, men det er jo en anden sag.

Jeg blev ellers forbavset over at der var 17 kommentarer i timen på spørgsmålet her.

M.v.h.  Jørn
Avatar billede privaten Nybegynder
15. november 2000 - 09:17 #28
tdaugaard> Det var noget jeg læste i msdn for nogen tid siden. Og så vidt jeg husker stod der noget med fixed/non-fixed strings, og noget med en 64kb grænse. Det kan da godt være jeg husker galt, i så fald... damn it :-)
Avatar billede tdaugaard Nybegynder
15. november 2000 - 10:19 #29
privaten:> hæ hæ .. jeg kan huske der er den grænse i QBasic meen ..
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