Jedes(!) Zeichen aus einer Datei auslesen

Guten Morgen,
ich habe nun seit mehreren Tagen schon ein ärgerliches Problem.
Ich muss in einem Projekt verschlüsselte Daten speichern und habe dafür die Crypto-API benutzt.

In diesem Tutorial hab ich mir das ganze angeschaut:
http://www.activevb.de/tutorials/tut_cryptoapi/crypt…

Wichtig für mein Problem ist der Abschnitt „Ergänzung - SALT“
http://www.activevb.de/tutorials/tut_cryptoapi/crypt…

Ich speichere also diesen Salt-Wert zwischen und lade ihn später wieder.
Das funktioniert auch tadellos. Es gibt aber leider auch Ausnahmen.
Und zwar, wenn der zufällig erstellte SALT-Wert irgendwelche Zeichen enthält, die nicht vernünftigt aus der Datei ausgelesen werden können.

Natürlich kann es an der Art liegen, wie ich den Wert speichere.
Ich hoffe, mir kann hier wer helfen.

Speichern des Wertes:
Open (App.Path + „\salt.dat“) For Append As 1
Print #1, strsalt
Close #intdateinr

Auslesen des Wertes:
Open (App.Path + „\salt.dat“) For Input As 1
Line Input #1, strsalt
Close #intdateinr

Muss ich den Wert anders Speichern oder Einlesen??

Danke im Vorraus
MfG

Hallo,

input ist für den Zweck ungeeignet, weil es Steuerzeichen berücksichtigt, verarbeitet aber nicht mit liest.
Für binäre Daten ist Get besser.

Dim ff As Integer
Dim Daten As String
Dim Fl As Long
Dim Na As String
Na = "C:\Test.dat"
ff = FreeFile
Fl = FileLen(Na)
Daten = Space(Fl)
Open Na For Binary As #ff
 Get #ff, , Daten
Close #ff
Open Na For Binary As #ff
 Put #ff, , Daten
Close #ff

Gruß, Rainer

Schonmal dankeschön.

Nun tut sich ein Problem auf, welches ich bis jetzt noch nicht lösen konnte.
Ich speichere die Daten mit einem eigenen Type.

Type Account
email as string
name as string
end type

Speichern würde ich in etwa so:

put #1,position, new_account

Wie bekomm ich das mit der Position nun richtig hin?
Beim Speichern sowie Auslese habe ich einen Integerwert,
welchen Wert ich habe.
Ich setze den Integer einen hoch und will unter der Position speichern.
Beim Auslesen habe ich die entsprechende Position.

Wie setze ich das um?
Wenn ich einfach den Integerwert reinsetze, klappts natürlich nicht,
was mich auch nicht wundert.
Aber wie es richtig geht, weiß ich nicht.

Hallo,

da hast Du mich auf dem falschen Fuß erwischt, mit wahlfreiem Zugriff habe ich noch gar nichts geschrieben.

Ich habe aber etwas zusammenbekommen, das funktioniert, eventuell hilft Dir das ja.

Option Explicit

Private Type Account
 email As String \* 10
 name As String \* 10
End Type

Private Sub Command1\_Click()
 'Daten erzeugen und schreiben
 Dim AC(9) As Account
 Dim Na As String
 Dim ff As Integer
 Dim i As Integer
 ff = FreeFile
 Na = "C:\Test.txt"
 For i = 0 To 9
 AC(i).email = "Adresse" + CStr(i)
 AC(i).name = "Name" + CStr(i)
 Next
 Open Na For Binary As #ff
 Put #ff, , AC
 Close #ff
End Sub

Private Sub Command2\_Click()
 'Daten komplett lesen
 Dim AC(9) As Account
 Dim Na As String
 Dim ff As Integer
 Dim i As Integer
 ff = FreeFile
 Na = "C:\Test.txt"
 Open Na For Binary As #ff
 Get #ff, , AC
 Close #ff
 For i = LBound(AC) To UBound(AC)
 List1.AddItem AC(i).email + " " + AC(i).name
 Next
End Sub

Private Sub Command3\_Click()
 'Einen Satz lesen
 Dim AC As Account
 Dim Na As String
 Dim ff As Integer
 Dim i As Integer
 ff = FreeFile
 Na = "C:\Test.txt"
 Open Na For Random As #ff Len = Len(AC)
 Get #ff, 5, AC
 Close #ff
 List1.AddItem AC.email + " " + AC.name
End Sub

Gruß, Rainer

Noch eine Verständnisfrage hinterher,
wenn ich im Type, die Stringlänge festlege mit
string * 10
oder ähnlichem
Und ich dann den String wieder auslese…
muss ich dann irgendwelche Leerzeichen abtrennen
oder bekomme ich nur den Anfangsstring zurück
auch wenn der meinetwegen nur 3 Zeichen lang war?
Dann könnte ichs mir sparen die Länge zu speichern.

Hallo,

Noch eine Verständnisfrage hinterher,
wenn ich im Type, die Stringlänge festlege mit
string * 10
oder ähnlichem
Und ich dann den String wieder auslese…
muss ich dann irgendwelche Leerzeichen abtrennen

ja: Neu = RTrim(Alt)

oder bekomme ich nur den Anfangsstring zurück
auch wenn der meinetwegen nur 3 Zeichen lang war?

Nur wenn Du Trim oder RTRim verwendest.

Dann könnte ichs mir sparen die Länge zu speichern.

Die Längenangabe? Dann läuft das Programm wieder nicht mehr. :smile:
Für den wahlfreien Zugriff müssen die Datensätze gleich lang sein.

Gruß, Rainer

Funktioniert nun alles wunderbar.
Ich speichere die Länge als Integer auch in dem Type.
Könnte das später zu Problemen führen?
Ich bin davon ausgegangen, das Integer immer
den gleichen Speicherbedarf haben

Hallo,

Funktioniert nun alles wunderbar.

das freut mich. Danke für die Frage, nun weiß ich auch wie es geht, wenn ich das mal brauche. :smile: Das hat gut gepasst, ich habe alles auf Anhieb gefunden und jetzt habe ich es auch verstanden.

Ich speichere die Länge als Integer auch in dem Type.
Könnte das später zu Problemen führen?

Das habe ich jetzt nicht versucht, das geht? Das ist zumindest überflüssig, weil …

Ich bin davon ausgegangen, das Integer immer
den gleichen Speicherbedarf haben

… Du das genau richtig siehst. Ein Integer ist immer zwei Bytes lang. Nur für Strings sollst Du die Länge angeben, alles andere hat feste Längen.

Gruß, Rainer

Ich mache das mit dem Integer, weil ich mir unsicher war.
Denn, dieser Salt-Wert wird ja mit zufälligen Zeichen gefüllt
und ich hatte die Befürchtung, das Trim mir da eventuell auch
mal das ein oder andere Zeichen rausnehmen kann.
Ich bin mir ja nicht sicher, mit welchem Zeichensatz der Saltwert erstellt wird.

Hallo,

Ich mache das mit dem Integer, weil ich mir unsicher war.

nicht nötig, Integer hat immer zwei Bytes.

Denn, dieser Salt-Wert wird ja mit zufälligen Zeichen gefüllt
und ich hatte die Befürchtung, das Trim mir da eventuell auch
mal das ein oder andere Zeichen rausnehmen kann.

Da musst Du Dir keine Sorgen machen, Trim entfernt nur Leerzeichen, sonst nichts.

Ich bin mir ja nicht sicher, mit welchem Zeichensatz der
Saltwert erstellt wird.

Das spiel keine Rolle, VB liest ja den ASCII und kümmert sich nicht um den Zeichensatz. Trim() macht einfach nur Replace(String, " ", „“).

Gruß, Rainer

Ich meine ja nur, dass ja eventuell im Salt-Wert absichtlich
Leerzeichen drinstehen könnten, die dann gelöscht würden.

Hi,

Ich meine ja nur, dass ja eventuell im Salt-Wert absichtlich
Leerzeichen drinstehen könnten, die dann gelöscht würden.

die Leerzeichen die drin stehen werden von Trim() nicht gelöscht, nur die davor und dahinter. Mit LTrim() nur die davor und mit RTrim() nur die dahinter. Die Leerzecien im String kann man mit Trim nicht entfernen, das würde dann nur mit Replace gehen.

Gruß, Rainer

Was ist nun, wenn der zufällig erstellte String am Anfang oder am Ende
ein Leerzeichen enthält? =)

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

Was ist nun, wenn der zufällig erstellte String am Anfang oder
am Ende
ein Leerzeichen enthält? =)

dann erzeugt Trim tatsächlich einen Fehler. Wenn das vorkommen kann, musst Du mit festen Längen arbeiten.

Gruß, Rainer

Was ist nun, wenn der zufällig erstellte String am Anfang oder
am Ende
ein Leerzeichen enthält? =)

dann erzeugt Trim tatsächlich einen Fehler. Wenn das vorkommen
kann, musst Du mit festen Längen arbeiten.

Hallo Rainer,
unterscheiden sich da VB und VBa f. Excel?
In Excel kommt da kein Fehler:

Sub tt()
MsgBox Trim("A b ") ’ ergibt „A b“
End Sub

Gruß
Reinhard

Gruß, Rainer

Hallo Reinhard,

unterscheiden sich da VB und VBa f. Excel?
In Excel kommt da kein Fehler:

Sub tt()
MsgBox Trim("A b ") ’ ergibt „A b“
End Sub

nein, die unterscheiden sich nicht. Mit Fehler war auch keine Fehlermeldung gemeint, sondern die Frage war so gestellt, daß das Leerzeichen hinter ‚A b‘ mit zum Code gehört. Daß es entfernt wird ist in dem Fall der ‚Fehler‘.

Gruß, Rainer

Alles klar, dir ein schönes WE, o.w.T.