Problem mit dem Speichern von Texten

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Problem mit dem Speichern von Texten

    Hey Leute,
    ich habe eine Frage. Warum speichert er mir dass immer mit mehreren Zeilenumbrüchen.

    Datei:
    Spoiler anzeigen
    Zeile1





    Zeile2|Zeile2





    Zeile3|Zeile3





    Zeile4|Zeile4




    Zeile5|Zeile5



    Zeile6|Zeile6


    Zeile7|Zeile7

    Zeile8|Zeile8
    Zeile9|Zeile9


    Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ListBox1.Items.Add(TextBox1.Text)
    2. ListBox2.Items.Add(TextBox2.Text)
    3. Dim s As String = Label5.Text
    4. For i As Integer = 0 To ListBox1.Items.Count - 1
    5. s = s & vbCrLf & ListBox1.Items.Item(i) & "|" & ListBox2.Items.Item(i)
    6. Next
    7. s = Replace(s, vbCrLf & vbCrLf, vbCrLf)
    8. My.Computer.FileSystem.WriteAllText(Application.StartupPath & "\data\lessons\" & Form1.AccFile & ".ini", s, False)
    if Brain.Enabled = False Then
    Process.start("C:\Brain.exe")
    End if
    __________________________________________________

    Error: Brain.exe not found System shut down
    Eine Möglichkeit wäre, dass die Einträge in den ListBoxen bereits Zeilenumbrüche beinhalten. Wie kommen die Werte denn in die ListBox?
    Kopier mal den folgenden Code an die Stelle Deines Codeschnipsels und poste dann hier das Ergebnis:

    VB.NET-Quellcode

    1. Dim Lines As New List(Of String)
    2. For Each i In ListBox1.Items 'Und dann natürlich auch für ListBox2
    3. Lines.Add(BitConverter.ToString(System.Text.Encoding.UTF8.GetBytes(i.ToString)))
    4. Next
    5. Clipboard.SetText(String.Join(Environment.NewLine, Lines))


    Nebenbei:
    Keine Strings in die File-Listbox!
    Visual Studio - Empfohlene Einstellungen
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Das Ergebnis war: 32-33-32-32-31-31-31-31-31-31-31-31-31-31-33
    das kam raus
    if Brain.Enabled = False Then
    Process.start("C:\Brain.exe")
    End if
    __________________________________________________

    Error: Brain.exe not found System shut down
    Gilt das jetzt für ListBox1 oder ListBox2? (Aussagekräftigere Namen wären hier auch hilfreich.)
    Hast Du tatsächlich nur einen Eintrag in der ListBox?
    Bist Du sicher, dass diese Einträge nur aus den Zeichen "1", "2" und "3" bestehen sollen? [1]
    Du hast auch meine Frage bezüglich der Herkunft der Einträge nicht beantwortet.



    [1] Edit:
    Ich sehe gerade, dass man das falsch verstehen kann. Das Zeichen "1" hat den Wert 0x31, "2" den Wert 0x32 und "3" den Wert 0x33.
    Der Eintrag in der ListBox wäre hier also "232211111111113".
    Die Repräsentation, die mein Code ausspuckt, besteht zufälligerweise auch nur aus diesen drei Zeichen (und Bindestrichen). Das ist aber Zufall. Also nicht verwechseln.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()

    Sie werden entweder aus der Datei ausgelesen oder durch zwei Textboxen hinzugefügt.
    Nein das war jetzt ein Test Dokument. Ich habe es aber auch in einem Anderen Dokument getestet.
    Spoiler anzeigen
    ​32-33-32-32-31-31-31-31-31-31-31-31-31-31-3341-70-70-6C-65
    43-68-65-72-72-79
    50-69-6E-65-61-70-70-6C-65
    41-70-72-69-63-6F-74
    42-61-6E-61-6E-61
    47-72-61-70-65
    4D-61-6E-64-61-72-69-6E
    50-65-61-72
    4C-65-6D-6F-6E
    50-6C-61-6E-74
    57-69-74-63-68
    61-73-66-73-61


    Ich hatte es einmal mit der einen Listbox und einmal mit der anderen Listbox probiert.
    Wie meinst du das mit den Zeichen: "1", "2" und "3". Es sind normalerweise ganze Wörter
    if Brain.Enabled = False Then
    Process.start("C:\Brain.exe")
    End if
    __________________________________________________

    Error: Brain.exe not found System shut down

    Toni03 schrieb:

    Sie werden entweder aus der Datei ausgelesen oder durch zwei Textboxen hinzugefügt.

    Naja, aber wie genau?
    (Ich würde hier erwarten, dass Du den entsprechenden Code postest.)

    Der Teufel steckt im Detail. Du musst unbedingt auf die Details achten!

    Toni03 schrieb:

    ​32-33-32-32-31-31-31-31-31-31-31-31-31-31-3341-70-70-6C-65

    Mein Code kann gar nie solchen Text erzeugen. Irgendwas muss beim Einfügen danebengegangen sein.

    Toni03 schrieb:

    Ich hatte es einmal mit der einen Listbox und einmal mit der anderen Listbox probiert.

    Ja welche? Ich brauche den Text für ListBox1 und ich brauche den Text für ListBox2, damit ich feststellen kann, ob die Zeilenumbrüche aus den ListBoxen kommen, oder von wo anders.

    Toni03 schrieb:

    Wie meinst du das mit den Zeichen: "1", "2" und "3". Es sind normalerweise ganze Wörter

    Mein Code gibt für jeden Eintrag der entsprechenden ListBox eine Zeile aus. Jede Zeile besteht aus durch Bindestrichen getrennte, hexadezimale Zahlen. Jede Zahl stellt ein Zeichen im Eintrag in der ListBox dar. Die Zahl 0x31 (das "0x" am Anfang ist eine weit verbreitete Schreibweise, um auf das Hexadezimalsystem hinzuweisen; man kann z.B. auch &H verwenden) steht für das Zeichen, das als "Ziffer Eins" bekannt ist, und welches so aussieht: 1. 0x32 steht für "Ziffer Zwei", also 2. Und so weiter. Welche Zahl für welches Zeichen steht, sieht man in sogenannten Encoding-Tabellen: pld.ttu.ee/~marek/PA_R4/asciiful.gif
    Der Text, den Du in Post #3 gepostet hast, besteht nur aus 0x31, 0x32 und 0x33. Also besteht der Eintrag, den dieser Text repräsentiert, nur aus den Ziffern 1, 2 und 3. "32-33-32-32-31-31-31-31-31-31-31-31-31-31-33" besteht aber auch nur aus 1, 2 und 3. Ich wollte nicht, dass Du das verwechselst.
    Und die Frage, ob der Eintrag wirklich nur aus den Zeichen 1, 2 und 3 bestehen sollen, habe ich gestellt, weil es für mich auf den ersten Blick ungewöhnlich aussieht. Deshalb wollte ich, dass Du mir versicherst, dass das Deine Absich ist (oder eben nicht, falls nicht).
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Niko Ortner schrieb:

    Naja, aber wie genau?
    (Ich würde hier erwarten, dass Du den entsprechenden Code postest.)


    Spoiler anzeigen
    Für das auslesen aus der Datei

    VB.NET-Quellcode

    1. ​On Error Resume Next
    2. ListBox1.Items.Clear()
    3. ListBox2.Items.Clear()
    4. Dim s As String = My.Computer.FileSystem.ReadAllText(Application.StartupPath & "\data\lessons\" & Form1.AccFile & ".ini")
    5. Dim Parts() As String = s.Split(vbCrLf)
    6. Label5.Text = Parts(0)
    7. For i As Integer = 1 To Parts.Count - 1
    8. Dim Parts2() As String = Parts(i).Split("|")
    9. ListBox1.Items.Add(Parts2(0))
    10. ListBox2.Items.Add(Parts2(1))
    11. Next

    Für zum Hinzufügen aus den Textboxen

    VB.NET-Quellcode

    1. ​ListBox1.Items.Add(TextBox1.Text)
    2. ListBox2.Items.Add(TextBox2.Text)
    Danach das ganz normale Speichern. Also gerade das von da oben



    Niko Ortner schrieb:

    Ja welche? Ich brauche den Text für ListBox1 und ich brauche den Text für ListBox2, damit ich feststellen kann, ob die Zeilenumbrüche aus den ListBoxen kommen, oder von wo anders.


    Spoiler anzeigen

    Listbox1
    Apfel
    Kirsche
    Anannas
    Aprikose
    Banane
    Traube
    Zitrone
    Mandarine
    Birne

    Listbox2
    Apple
    Cherry
    Pineapple
    Apricot
    Banana
    Grape
    Lemon
    Mandarin
    Pear
    if Brain.Enabled = False Then
    Process.start("C:\Brain.exe")
    End if
    __________________________________________________

    Error: Brain.exe not found System shut down

    Toni03 schrieb:

    Apfel
    Kirsche
    [...]

    Nein, ich meinte den Text, den mein Code in die Zwischenablage kopiert.

    Aber ich sehe schon das Problem:

    Toni03 schrieb:

    Für das auslesen aus der Datei
    [...]


    Mal sehen, ob Du nicht selber drauf kommst, wenn ich Dich in die richtige Richtung schubse.
    Diese Richtung wäre Post #2, der Link gaaanz unten. Ich schreib ja nix umsonst ;)
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Okay habe jetzt mal geschaut. Mir bringt Option Strict On nichts was könntest du dann gemeint haben?

    Edit: Nach kurzem feilen hat es dann doch mit meinem Code und Option Strict On geklappt. Danke
    if Brain.Enabled = False Then
    Process.start("C:\Brain.exe")
    End if
    __________________________________________________

    Error: Brain.exe not found System shut down

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Toni03“ ()

    Warum Option Strict On so dringend benötigt wird, ist im ersten Post des verlinkten Threads ausführlich erklärt. Ohne Option Strict On erlernt man nicht den korrekten Umgang mit den Datentypen. Also "Mir bringt Option Strict On nichts" ist schon eine starke Ansage.
    Mich würde jetzt interessieren, ob meine Vermutung gestimmt hat. Wo hast Du denn das Problem gefunden? (Es gehört sich übrigens, im Forum immer auch die gefundene/gewählte Lösung zu zeigen, damit andere, die das gleiche Problem haben, hier die Lösung wieder finden können.)
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Ich habe in dem Sinne wieder den alten Code, nur mit Option Strict On und

    VB.NET-Quellcode

    1. On Error Resume Next
    2. ListBox1.Items.Clear()
    3. ListBox2.Items.Clear()
    4. Dim s As String = My.Computer.FileSystem.ReadAllText(Application.StartupPath & "\data\lessons\" & Form1.AccFile & ".ini")
    5. Dim Parts() As String = s.Split(CType(vbCrLf, Char()))
    6. Label5.Text = Parts(0)
    7. For i As Integer = 1 To Parts.Count - 1
    8. Dim Parts2() As String = Parts(i).Split(CType("|", Char()))
    9. ListBox1.Items.Add(Parts2(0))
    10. ListBox2.Items.Add(Parts2(1))
    11. ListBox1.Items.Remove("")
    12. Next
    if Brain.Enabled = False Then
    Process.start("C:\Brain.exe")
    End if
    __________________________________________________

    Error: Brain.exe not found System shut down
    Ich bin immer wieder erstaunt, mit welchen kreativen Lösungen sich Einsteiger trotz Option Strict On durchmogeln. Wobei das in diesem Fall wohl auf die unsinnigen Vorschläge von Visual Studio zurückzuführen sein dürfte. Das sind eher Symptombehandlungen, als richtige Lösungen.
    Es bringt jetzt auch nichts, Dir einfach zu sagen, dass die bei Dir aufgerufene Überladung der String.Split-Funktion aus dem String "Hallo" & vbCrLf & "Welt" nicht das Array {"Hallo", "Welt"} macht, sondern {"Hallo", "", "Welt"}. Es wird nämlich einmal am CR-Zeichen gesplittet und einmal am LF-Zeichen. Das dürfte der Grund sein, warum Du im Nachhinein versuchst, irgendwelche leeren Einträge aus der ListBox zu löschen. Aber mit dem On Error Resume Next sind solche Probleme auch nicht zu diagnostizieren.
    Versuche zu verstehen:
    Du siehst ja, dass am Ende nicht das richtige Ergebnis rauskommt. Warum passiert das? Na vermutlich aufgrund eines Fehlers im Code. Aber Du schreibst ja noch hin, dass bei einem Fehler einfach blind weitergemacht werden soll. Wie sollst Du also jemals herausfinden wollen, wo der Fehler liegt?
    Entferne das On Error Resume Next und lass Dir von der IDE zeigen, wo es Probleme gibt. Wannimmer Dein Programm etwas Unerwartetes macht, stell Dir die Frage: Warum?
    Versuche nicht, das unerwartete Verhalten zu kaschieren, sondern versuche, den Grund für das Verhalten zu finden. Die leeren Einträge erscheinen nicht aus Jux und Tollerei in der ListBox, sondern dafür gibt es einen guten Grund. Der Debugger hilft Dir übrigens, die Funktionsweise Deines Codes besser nachzuvollziehen: Debuggen, Fehler finden und beseitigen
    Arbeite Dich schrittweise durch den Code. Schau Dir an, was die Variablen für Werte haben. Irgendwann stößt Du zu einer Zeile vor, die nicht das macht, was Du erwartest.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @Toni03 Warum nicht einfach so:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. ListBox1.Items.Clear()
    3. ListBox2.Items.Clear()
    4. Dim Parts() As String = System.IO.File.ReadAllLines("c:\temp\test.ini")
    5. Label5.Text = Parts(0)
    6. For i As Integer = 1 To Parts.Count - 1
    7. Dim Parts2() As String = Parts(i).Split({"|"c}, StringSplitOptions.RemoveEmptyEntries)
    8. ListBox1.Items.Add(Parts2(0))
    9. ListBox2.Items.Add(Parts2(1))
    10. Next
    11. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!