Verbundvariable als String?

Liebe ExpertInnen,

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?

Gruß Ralf

Hallo Ralf,

ich habe eine Verbundvariable

Verbundvariable sagt mir nichts. ‚Private Type‘?

angelegt und möchte die
Datenstruktur in eine sequentielle Datei schreiben.

Daß ich ‚sequentielle Datei‘ noch mal lese … :smile:
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.

Gruß, Rainer

Moin, Rainer,

Verbundvariable sagt mir nichts. ‚Private Type‘?

„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 :frowning:

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.

Gruß Ralf

Hi Ralf,

Die Endung wäre mir wurscht, DVS kenne ich nicht :frowning:

muss man auch nicht, ist alt.

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:

Put #1, , A()

Oder beim Lesen

Get #1, , A()

Gruß, Rainer

1 Like

Hi Rainer,

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 :smile:

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?

Gruß Ralf

Hallo Ralf,

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 :smile:

*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. :smile: 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.

Gruß, Rainer

Korrektur
Hallo Ralf,

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. :smile:

Gruß, Rainer

Hallo Ralf, Rainer,

ich werfe auch mal ein Statement ein.

Was spricht gegen open… for Random as …

http://www.activevb.de/tutorials/tut_rdmfiles/rdmfil…

MfG Alex

Hi Alex,

ich werfe auch mal ein Statement ein.

Was spricht gegen open… for Random as …

http://www.activevb.de/tutorials/tut_rdmfiles/rdmfil…

nichts. :smile: Mir ist nur Binary zuerst eingefallen.

Gruß, Rainer

Hi Alex,

Hallo Rainer,

ich werfe auch mal ein Statement ein.

Was spricht gegen open… for Random as …

http://www.activevb.de/tutorials/tut_rdmfiles/rdmfil…

nichts. :smile: Mir ist nur Binary zuerst eingefallen.

Wobei aber Random in dem Falle die bessere Wahl ist, weil du so einfacher gezielt Datensätze auslesen kannst :smile: Also ohne gross nachzudenken :wink:

PS: Hast das mal mit Exe in Dll Umwandeln probiert und war meine Anleitung zu verstehen?

Gruß, Rainer

MfG Alex

Hi Alex,

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. :smile:

Gruß, Rainer

Hi Rainer,

Du hast Die beiden MSDN-CDs installiert?

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

Was ein Redim ist, kriege ich auch noch raus :smile:

Gruß Ralf

Hallo Ralf,

Du hast Die beiden MSDN-CDs installiert?

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 :smile:

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

Gruß, Rainer