Seite 1 von 1
Textdatei "for Random" öffnen, Wert lesen und zurü
Verfasst: Mo, 08.11.2004 11:12
von michael_s
Hallo,
versuche eine VBA-Lösung die wir einsetzen auf StarBasic umzusetzen.
In einem Modul wird eine simple Textdatei geöffnet (for Random), ein Wert wird gelesen, um eins erhöht und zurückgeschrieben.
Benutze Get zum Lesen, Put zum Schreiben.
Der Inhalt der Datei wird nicht korrekt gelesen, schreibe ich etwas mit Put in die Datei und schaue mir das Ergebnis mit dem Editor an, so stehen nur kryptische Daten drin.
Wie muss ich vorgehen, kann mir jemand helfen?
Benutze Win2K, OOo 1.1.2.
Das Beispiel aus der Hilfe funuktioniert übrigens leider nicht, Makro bricht mit Fehler(Geräte E/A-Fehler) ab.
Vielen Dank im Voraus
Michael
Verfasst: Mo, 08.11.2004 12:16
von Stephan
Ich weiß nicht was die Datei konkret enthält. Andrew Pitonyak liefert in seinem Buch "openOffice macros explained" den Hinweis das get Unicode-Zeichen nur bis zur Kodierung 255 exakt schreibt und boolsche Werte nicht exakt verarbeitet, obwohl ich Letzteres nicht verstehe.
Besteht den nicht die Möglichkeit die Datei zeilenweise zu lesen und ebenso wieder zurückzuschreiben. Ich habe mich nicht weiter damit beschäftigt, aber hier ist ein leicht umgeformter Code aus der Hilfedatei, der das erledigen sollte:
Code: Alles auswählen
Sub ExampleWorkWithAFile
Dim iNumber As Integer
Dim sZeile As String
Dim aFile As String
Dim sMsg(0) as String
aFile = "c:\daten.txt"
iNumber = Freefile
Open aFile For Input As iNumber
i = 0
While not eof(iNumber)
Line Input #iNumber, sZeile
If sZeile <>"" then
'Hier mit Bedingung auf die Zeile
'prüfen die den gesuchten Wert enthält
'wenn richtige Zeile gefunden
'den Wert lesen und um eins erhöhen
sMsg(i) = sZeile
i = i + 1
Redim Preserve sMsg(i) As String
end if
wend
Close #iNumber
iNumber = Freefile
Open aFile For Output As #iNumber
For x = 0 to i-1
'w = w & sMsg(x) & CHR(13)
Print #iNumber, sMsg(x)
Next x
Close #iNumber
'msgbox w
End Sub
Du müßtest nun nur eine Bedingung formulieren mit der Du die Zeile erkennst in der Dein Wert steht und diese Zeile dann verändern.
Gruß
Stephan
Verfasst: Do, 11.11.2004 07:40
von michael_s
Hallo Stephan,
zunächst mal Dank für die Lösung hatte als Ultimaratio auch schon diese Idee. Das Problem ist, das Lösung in einer Mehrbenutzerumgebung eingesetzt werden soll. in der Textdatei steht eine Zahl, die systemweit nur einmal vorkommen darf. Benutzer liest die Zahl, inkrementiert um eins und schreibt zurück.
Bei der dargestellten Lösung besteht die Gefahr, dass zweiter Benutzer die Datei zwischen Lesen Benutzer1 und Schreiben Benutzer1 öffnet und Zahl liest(zugegebenermassen mit geringer Wahrscheinlichkeit). Dann käme die Zahl zweimal vor oder aber Benutzer 1 könnte wegen Dateisperre Zahl nicht zurückschreiben..
Eine funktionierende Lösung mit einmaligem Öffnen einer Datei mit Schreib- und Lesezugriff wäre deshalb schon wichtig.
Gruss
Michael
Verfasst: Mi, 01.12.2004 08:54
von Toxitom
Hallo Holger,
Es scheint so als wäre das noch nie von jemand irgendwie
verwendet worden zu sein.
Doch. Allerdings gab es unter OOo 1.0x sowie mit OOo 1.1.0 diverse Probleme mit get und put. Beide funktionierten nur mit Bit-Operationen, also mit binären Werten - ich glaube auch Hex-Werte wurde richtig verarbeitet.
Sicher jedoch keine Ascii-Zeichen. Da gab es stets die von dir beschriebenen Fehler.
Weiweit das inzwischen funktioniert (mirt Versionen 1.1.2, 1.1.3) weiss ich leider nicht. Ich spiele gerade mit der 1.9.xx , hab das aber auch noch nicht getestet.
Wenn ich was weiss, werde ich es posten.
Bis denn
Thomas
Verfasst: Mi, 01.12.2004 09:13
von Toxitom
Hallo Holger,
Nachtrag:
get 1,,a$
Ich nehme an, diese Zeile ist nur beispielhaft und nicht tatsächlich so geschrieben?
Dann würde nämlich mindestens das Doppelkreuz vor der 1 fehlen. Dies ist
Zwingend!
müsste also heissen:
Vielleicht war das der Fehler?
Gruss
Thomas
Verfasst: Do, 02.12.2004 13:02
von Holger.M
Ein Nachtrag dazu.
Mit dieser kleinen Behelfsfunktion kann man Binär und Random Daten lesen.
Schreiben ist aber leider grundsätzlich nicht möglich da er wenn
kein "ACCESS" beim öffnen angegeben wird, die komplette Datei löscht (bzw. den Inhalt)
"ACCESS read write" killt die Daten ebenso. Lediglich "ACCESS read" läßt sie am Leben.
Da das bereits unmittelbar beim Öffnen geschieht, würde ich es als _ziemlich_ schlimmen Fehler einstufen. :-/
Beispiel Code:
SUB Main
open "meinedatei" for binary ACCESS read as #5
' Lese ab dem dritten Byte einen 20 Byte langen String
zz$=getBin$(5,3,20,0)
PRINT zz$
END SUB
' BinOderRandom
'0=Binär (laenge& = Stringlänge ,abPosition& =Byte Position )
'1=Random (laenge& = Satzlänge ,abPosition& =Satznummer )
FUNCTION getBin$(dateiHandle,abPosition&,laenge&,BinOderRandom)
dim kk as integer
zz$=""
IF BinOderRandom =1 THEN abPosition& = 1+((abPosition&-1) *laenge&)
FOR t& = 0 TO laenge&-1
get #dateiHandle,abPosition&+t&,kk
m%=FIX(kk/256)
m%= kk- (m%*256)
zz$=zz$+CHR$(m%)
NEXT t&
getBin$ =zz$
END FUNCTION