ich habe eine Verbundvariable angelegt und möchte die Datenstruktur in eine sequentielle Datei schreiben. Das geht wohl nicht direkt - „Typen unverträglich“ beim Write. In anderen Sprachen kenne ich die Überlagerung, mit der eine Struktur als String angesprochen werden kann, in VB fehlt mir das Vokabular, um in der Hilfe gezielt zu suchen. Wer weiß was?
angelegt und möchte die
Datenstruktur in eine sequentielle Datei schreiben.
Daß ich ‚sequentielle Datei‘ noch mal lese …
Im DVS ist das einfach eine Textdatei mit der Endung .dat
Das geht wohl nicht direkt - „Typen unverträglich“ beim Write.
Poste mal Code.
In
anderen Sprachen kenne ich die Überlagerung, mit der eine
Struktur als String angesprochen werden kann, in VB fehlt mir
das Vokabular, um in der Hilfe gezielt zu suchen. Wer weiß
was?
Wie schreibst Du denn? Wenn ich eigene Datentypen verwende lese und schreibe ich mit Put und Get und hatte noch nie Probleme.
„benutzerdefinierter Datentyp“ heißt das in der Hilfe, Verbundvariable habe ich aus „Access 2003“ von Said Baloui.
Im DVS ist das einfach eine Textdatei mit der Endung .dat
Die Endung wäre mir wurscht, DVS kenne ich nicht
Poste mal Code.
Type Vorsatz
Satzlänge As String \* 4
Satzart As String \* 1
End Type
Dim A As Vorsatz
Public Sub Write\_A()
'------------------------------------------------------
' Datenträgeraustauch Vorsatz
'------------------------------------------------------
With A
.Satzlänge = "0128"
.Satzart = "A"
Open "c:\test.txt" For Output As 1 Len = 128
Write #1, A
End Sub
Wie schreibst Du denn? Wenn ich eigene Datentypen verwende
lese und schreibe ich mit Put und Get und hatte noch nie
Probleme.
Na ja, mit Put schreibe ich Direktzugriffsdateien, so jedenfalls steht’s in einem Buch. Was ich brauche, ist eine stinknormale .txt.
Na ja, mit Put schreibe ich Direktzugriffsdateien, so
jedenfalls steht’s in einem Buch. Was ich brauche, ist eine
stinknormale .txt.
Das wird auch eine, nur mit Steuerzeichen gibt es weniger Probleme.
Option Explicit
Private Type Vorsatz
Satzlänge As String \* 4
Satzart As String \* 1
End Type
Dim A As Vorsatz
Public Sub Write\_A()
Dim ff As Integer
ff = FreeFile
With A
.Satzlänge = "0128"
.Satzart = "A"
End With
Open "c:\test.txt" For Binary As #ff
Put #ff, , A
Close #ff
End Sub
(Getestet, läuft.)
In der Datei steht dann ‚0128A‘.
Wenn Du Zeilenumbrüche möchtest, musst Du noch ‚VbCrLf‘ einfügen.
Wenn Du ein Array hast, das Du schreiben möchtest, brauchst Du mit der methode auch keine Schleife, es genügt:
besternten Dank. Was ich schmerzlichst vermisse, ist der „User’s Guide“, der vor 30 Jahren bei jeder anständigen Software dabei war, wo dem Einsteiger erstmal gezeigt wird, was überhaupt geht.
> Open "c:\test.txt" For Binary As #ff
> Put #1, , A
> Close #1
> End Sub
(Getestet, läuft.)
Na?!? Mit Put #1 eher zufällig
Wenn Du Zeilenumbrüche möchtest, musst Du noch ‚VbCrLf‘
einfügen.
Sieht schon mal gut aus, bis auf eine Kleinigkeit: Notepad zeigt einzelne Zeilen, der Editor von Windows hängt die Strings hintereinander. Muss ich mir da Sorgen machen?
besternten Dank. Was ich schmerzlichst vermisse, ist der
„User’s Guide“, der vor 30 Jahren bei jeder anständigen
Software dabei war, wo dem Einsteiger erstmal gezeigt wird,
was überhaupt geht.
Bei mir sind Beispiele dabei, in denen fast alles verwendet wird und man sich ansehen kann, wie. Du hast Die beiden MSDN-CDs installiert?
Open „c:\test.txt“ For Binary As #ff
Put #1, , A
Close #1
End Sub
(Getestet, läuft.)
Na?!? Mit Put #1 eher zufällig
*gg* ja, rein zufällig. Ich hab’s gesehen und korrigiert.
Wenn Du Zeilenumbrüche möchtest, musst Du noch ‚VbCrLf‘
einfügen.
Sieht schon mal gut aus, bis auf eine Kleinigkeit: Notepad
zeigt einzelne Zeilen, der Editor von Windows hängt die
Strings hintereinander. Muss ich mir da Sorgen machen?
Es kommt darauf an, was Du mit den Daten vor hast.
Wenn Du Zeilenumbrüche möchtest, musst Du eben noch VbCrLf einfügen, dann ist das mit dem Editor leichter zu lesen, die Datei wird eben länger, weil das zwei Byte sind. Wenn Du die Daten auch wieder mit VB liest, ist das egal, mit Get() werden sie richtig gelesen.
Du musst beim Redim nur die Länge richtig berechnen, was kein Problem ist, wenn Du nicht überrascht bis, daß in einem String ein Zeichen zwei Byte lang ist. Wenn bei ‚0128‘ immer nur Zahlen stehen, kannst Du die ja als Long abspeichern, dann sind das nur noch vier Byte, statt acht … Das weißt Du ja aber alles selbst.
ich hatte geschrieben, daß bei einem String ein Zeichen immer zwei Byte lang ist. Im Speicher stimmt das auch. Beim Schreiben in die Datei wird pro Zeichen aber nur ein Byte geschrieben, die ‚test.txt‘ ist also 5 Bytes lang. Nicht daß ich Dich noch auf eine falsche Fährte locke.
PS: Hast das mal mit Exe in Dll Umwandeln probiert und war
meine Anleitung zu verstehen?
nein, habe ich immer noch nicht, das habe ich für das WE vor.
Das will ich gründlich machen und dafür hatte ich noch nicht genug Zeit am Stück. Mal fünf Minuten für w-w-w ist eine Sache, so ein Beispiel von Dir verstehen ist eine andere, da muss ich richtig fit sein und viel Zeit haben … Wochenende eben.
nein, die kenne ich nicht einmal, bin über Access an das VB gekommen.
Wenn Du Zeilenumbrüche möchtest, musst Du eben noch VbCrLf
einfügen
hab ich, deshalb staune ich ja über das Ergebnis: Notepad++ zeigt Zeilen, der Microsoft Editor einen String mit einem nicht darstellbaren Zeichen anstelle des CrLf.
Du musst beim Redim nur die Länge richtig berechnen
nein, die kenne ich nicht einmal, bin über Access an das VB
gekommen.
??? Du verwendest VBA? Gut zu wissen, das hätte zu Missverständnissen gefürt, wenn ich weiter von VB6 ausgegangen wäre. Noch spielt das aber keine Rolle, so weit sind die Sprachen identisch.
Wenn Du Zeilenumbrüche möchtest, musst Du eben noch VbCrLf
einfügen
hab ich, deshalb staune ich ja über das Ergebnis: Notepad++
zeigt Zeilen, der Microsoft Editor einen String mit einem
nicht darstellbaren Zeichen anstelle des CrLf.
Das liegt dann am Editor. Hast Du bei ‚Format -> Zeilenumbruch‘ das Häkchen an?
Du musst beim Redim nur die Länge richtig berechnen
Was ein Redim ist, kriege ich auch noch raus
Ich habe mal eins in das Beispiel eingebaut.
Option Explicit
Private Type Vorsatz
Satzlänge As String \* 4
Satzart As String \* 1
End Type
Dim A() As Vorsatz
Public Sub Write\_A()
Dim ff As Integer
Dim i As Integer
ReDim A(2 To 32)
For i = LBound(A) To UBound(A)
A(i).Satzlänge = Right("0000" + CStr(i), 4)
If i Mod 2 Then
A(i).Satzart = "A"
Else
A(i).Satzart = "B"
End If
Next
ff = FreeFile
Open "c:\test.txt" For Binary As #ff
Put #ff, , A()
Close #ff
End Sub