fso-TextStream - was mache ich falsch?

MacInternet

Mitglied
Hallo und guten Abend,

ich wende mich heute an Euch in der Hoffnung, mir kann jemand weiterhelfen. Ich versuche seit Tagen, dem Fehler auf die Spur zu kommen - und schaffe es nicht. Was um alles in der Welt mache ich falsch

Ich habe da z.B. eine ganz einfache Routine, die das Einlesen einer Datei erledigt:

Private Sub Einlesen_Click()
Dim fso As FileSystemObject

Set fso = New FileSystemObject

Set strfile = fso_OpenTextFile("Daten.dat", ForReading, False)

Do While Not strfile.AtEndOfStream

blahblah.....
Loop
strfile.close

So weit, so gut. Das klappt auch alles. Jetzt möchte ich in einer anderen Routine etwas an diese Datei "DATEN.DAT" anhängen. Also benutze ich das gleiche wie oben, nur statt "ForReading" hab ich "ForAppending" eingesetzt.

Aber fortan erkennt bricht das Programm mit der Meldung "RuntimeError 54 - bad file mode" ab. Es fällt über die nächste Zeile und da über das "AtEndOfStream". Im Watch-Fenster erkenne ich sehr wohl, daß er sowohl Datei- als auch Zeilenende nicht mehr erkennt - aber ich weiß nicht, warum nicht!

Wer kann bitte helfen? Wer kann mir sagen, was hier falsch läuft? Wie kann ich etwas an diese Datei anhängen, ohne Fehlermeldung und ohne daß der Inhalt stets gelöscht wird?

Bin für jeden Tipp dankbar, da schon am Rande der Verzweiflung. Bei einer so einfachen Routine....

Vielen Dank im Voraus,
Mac
 
Hi.

Wenn du die Datei mit ForAppending öffnest, kannst du auch nur etwas an die Datei anhängen, nicht lesen.

Außerdem ist es unsinnig die AtEndOfStream Methode aufzurufen, denn bei ForAppending ist man schließlich bereits am Ende der Datei.

Gruß

PS: Übrigens gibt es hier eine Suchfunktion die einem sehr schnell weiterhelfen kann. Und bitte verwende das nächste mal die entsprechenden Code-Tags für Code den du postest (also [code=vb]...[/code] für Visual Basic, [code=php]...[/code] für PHP usw.).
 
Hallo, deepthroat,

ganz herzlichen Danke für die schnelle Antwort! Habe mich am selben Tag noch dranbegeben und siehe da: jetzt geht's! :)
Dachte halt, man muß tatsächlich jedes Mal erst die Datei öffnen und bis zum Ende durchgehen, um ans EOF() zu kommen.

Das mit den Tags hab ich ehrlich gesagt nicht verstanden, ich hab doch im Forum VB gepostet. Bin aber bemüht, herauszufinden, was dahintersteckt... ;)

Viele Grüße,
Mac
 
Hi.
Das mit den Tags hab ich ehrlich gesagt nicht verstanden, ich hab doch im Forum VB gepostet. Bin aber bemüht, herauszufinden, was dahintersteckt... ;)
Den Code den du sozusagen einfach in deinen Beitrag "reingeklatscht" hast, solltest du einfach zwischen die entsprechenden Code-Tags schreiben.

Also wenn es sich um Visual Basic Code handelt, solltest du statt einfach

Dim var as String
var = "blah"

diesen Text in Code-Tags einbinden, also so:

[code=vb]Dim var as String
var = "blah"[/code]

Das Ganze sieht dann so aus:
Visual Basic:
Dim var as String
var = "blah"

Erstens sieht es viel schöner aus, und außerdem kann man den Code (dadurch das er in nicht-proportionaler Schrift dargestellt wird und Formatierungen erhalten bleiben) viel besser lesen.

Gruß
 
Ah so, ja, danke, jetzt hab ich es kapiert. Mache ich beim nächsten Mal besser, versprochen! :)

Gruß Mac

PS: Ich hatte den ProgrammCode ursprünglich schon eingerückt, aber das wollte der Editor wohl nicht akzeptieren, weil ja die Tags fehlten.
 
Hallo!

Ich häng mich mal hier dran weil das imho der passendste Thread für mein Problem ist...

Hab ein ähnliches Problem wie MacInternet, nur dass ich nicht eine Zeile an eine Textdatei "dranhängen" will, vielmehr will ich die letzte Zeile einer Textdatei durch eine andere ersetzen...

Meine erste Idee, war - zugegeben etwas umständlich - jede Zeile bis auf die letzte auszulesen, um dann alle wieder einzufügen und die letzte manuell hinterher... Auch wenn das Bull**it ist, poste ich mal den code, vielleicht ist dann ersichtlicher was ich brauche...

Visual Basic:
Dim z01 As String
Dim z02 As String
Dim z03 As String
Dim z04 As String
Dim z05 As String
Dim z06 As String
Dim z07 As String
Dim z08 As String
Dim z09 As String
Dim z10 As String
Dim z11 As String
Dim z12 As String

' Auslesen der Zeilen 1 bis 12 (von 13)
Open App.Path & "\test.dat" For Input As #1
    Input #1, z01
    Input #1, z02
    Input #1, z03
    Input #1, z04
    Input #1, z05
    Input #1, z06
    Input #1, z07
    Input #1, z08
    Input #1, z09
    Input #1, z10
    Input #1, z11
    Input #1, z12
Close #1

' Schreiben der 12 Zeilen + der 13ten, neuen Zeile

Open App.Path & "\test.dat" For Output As #1
    Write #1, Mid(z01, 2, Len(z01) - 2)
    Write #1, Mid(z02, 2, Len(z02) - 2)
    Write #1, z03
    Write #1, z04
    Write #1, z05
    Write #1, z06
    Write #1, z07
    Write #1, z08
    Write #1, z09
    Write #1, z10
    Write #1, z11
    Write #1, z12
    Write #1, "neue Zeile 13"
Close #1

Das würde sogar so funktionieren, nur kommt dann eine neue Textdatei bei raus, in der jede Zeile mit Anführungszeichen anfängt und endet, und das alles für mich unbrauchbar macht :(

Es wäre nett, wenn sich jemand kurz Zeit nehmen könnte, bestimmt ist es nur ne Kleinigkeit...

Besten Dank im voraus!

MfG

€ in Codezeile 33 und 34 mein Versuch, durch die Mid-Funktion die Anführungszeichen "auszublenden", was leider dazu führte dass das erste und letzte Zeichen der eigentlichen Zeile weg war, nicht aber die Anführungszeichen...
 
Zuletzt bearbeitet:
Hi.

Na, so richtig passt das nicht wirklich in das Thema, denn du verwendest kein FSO (FileSystemObject).

Du verwendest da das Write # Statement was die Daten die hinter der Dateinummer angegeben werden so in die Datei schreibt, das sie später wieder unverändert mit Input # ausgelesen werden können. Die einzelnen Daten werden durch Kommas getrennt und in Anführungszeichen gesetzt.

Du solltest stattdessen das Print # Statement verwenden welches die Daten einfach "roh" zeilenweise in die Datei schreibt.

Die Zeilen kannst du dann wieder einzeln mit dem Line Input # Statement einlesen.

Gruß
 
Mal vom Write/Print-Problem abgesehen, wieso öffnest du deine Datei nicht mit Append? Damit kannst du gleich nach der letzten Zeile weiterschreiben und brauchst nicht alle vorherigen einlesen und neu schreiben:
Visual Basic:
Open App.Path & "\test.dat" For Append As #1
    Print #1, "neue Zeile 13"
Close #1


Der Doc!
 
Damit kannst du gleich nach der letzten Zeile weiterschreiben und brauchst nicht alle vorherigen einlesen und neu schreiben:
Das ist eben genau was ich nicht will, ich will ja nicht nach der letzten Zeile weiterschreiben, sondern die letzte Zeile überschreiben!

Aber vielen Dank, mit Print # hat es geklappt, ist mir kurz nach meinem Post eingefallen und ich hätte mir das ganze sparen können... Sorry für die unnötige Belästigung!
 
Zurück