StreamReader und Streamwriter // Codeausgabe

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    StreamReader und Streamwriter // Codeausgabe

    Hey Leute,

    Ich habe gerade angefangen VB zu lernen und stehe bei einer Aufgabe zu Streamwriter auf dem Schlauch.

    Folgender Code ist gegeben:

    Public Sub Write2()
    Dim feld() As String = {"a", "b", "c"}
    Dim writer As IO.StreamWriter
    writer = New IO.StreamWriter("buchstaben.txt", False)

    For i As Integer = 3 To 1 Step -1
    For j As Integer = 1 To i
    For k As Integer = 1 To 3
    writer.Write(feld(k - 1))
    Next k

    Next j
    writer.WriteLine()
    Next i

    writer.Close()

    End Sub


    Was bekommt man als Ausgabe????



    Ich habe nun ein neues Windows Form Projekt gebastelt mit selbigen Code und einem Button, sodass bei Buttonklick das File erstellt werden sollte!? Jedoch wird keines hinterlegt?


    Streamwriter erstellt ja ein neues txt File, hier "Buchstaben.txt" mit dem angegeben Inhalt. Das False dahinter sagt uns, dass er eine völlig neue Datei erstellen soll, ist das richtig?

    Wir haben einen Array von a,b,c und drei Schleifen die durchzählen.

    Was erwarte ich als Ausge? i geht von 3,2, | j geht von 1 nach oben | k von 1, 2, 3

    da wir den Befehlt haben, er soll feld(k-1) schreiben, so hätten wir bei k=1 --> feld(0) = a |||| k=2 --> feld(1) = b k=3 feld(2) = c

    Betrachtet man nun noch die Schleife mit i:

    abc abc abc als Ausgabe?

    und bei J geht der Count nach oben, sodass doch eigentlich einen unendliche Liste abc, abc, abc, abc, abc ,.... erstellt werden würde?




    Bitte um Denkanstässe und Hilfe. Auch ob ich den Sinn richtig verstanden habe?


    Und warum erstellt mir Express nicht diese Datei wenn ich Sie so in mein Projekt einbaue? (habe IO.Streamwriter verwendet, da er mir dies vorschreibt)

    Vielen Dank


    EDIT:

    Bin ich dumm die Schleife geht ja bis i, also haben wir eine Schleife in der Schleife.


    Die Ausgabe wäre also:

    abc abc abc

    abc abc

    abc

    Richtig?

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

    TheSparrow schrieb:

    Bitte um Denkanstässe und Hilfe.
    Willkommen im Forum.
    1. Bitte keine unnützen Leerzeilen.
    2. Bitte benutze den Code-Tag, Code markieeren und Button drücken:
    3. Setze einen Haltepunkt in die Prozedur und überprüfe zeilenweise, ob Dein Code richtig arbeitet. Gugst Du hier.
    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!
    Lass mich raten. Der Code ist von einem Lehrer vorgegeben und Du und der Rest der Klasse muss sich jetzt ausdenken, was er macht.

    Wann immer Du nicht weißt, was eine Methode vom .Net-Framework macht, kannst Du folgende Dinge machen:

    Intellisense:
    Gibt Dir eine kurze Zusammenfassung von den Methodenparametern:

    In Deinem Fall dürfte das schon reichen, um die Frage zu klären.

    ObjectBrowser:
    Den kannst Du öffnen, indem Du mit der rechten Maustaste auf den Namen klickst und dann "Gehe zu Definition" auswählst:

    Wie man am "F12" daneben erkennen kann, kann man den ObjectBrowser auch öffnen, wenn der Cursor auf dem Namen ist und man F12 drückt.
    Der ObjectBrowser zeigt bei Konstruktoren zuerst nur die Klasse an, deshalb muss man noch den passenden Konstruktor auswählen. In Deinem Fall ist das dieser:

    Da steht eine Menge an Infos drin.
    ErfinderDesRades hat einige Details zum ObjectBrowser erläutert: mycsharp.de/wbb2/thread.php?threadid=64815

    MSDN:
    Google nach "msdn System.IO.StreamWriter class" oder einfach nur nach "msdn StreamWriter class" bzw. "klasse", wenn Du die deutsche Dokumentation möchtest.
    google.at/search?num=100&safe=…..4.32.2622.0.1xOM7ygQqbc
    Damit kommst Du hier hin:
    msdn.microsoft.com/en-us/libra…writer%28v=vs.110%29.aspx
    Dann musst Du wieder den richtigen Konstruktor raussuchen:
    msdn.microsoft.com/en-us/library/36b035cb%28v=vs.110%29.aspx
    Beachte, dass ganz oben ".NET Framework 4.6 and 4.5" steht. Wenn Du das nicht verwendest, solltest du möglicherweise die richtige Version auswählen.

    Abgesehen von dem, was RodFromGermany geschrieben hat, möchte ich noch ein paar Dinge klären:
    Dim writer As IO.StreamWriter ist eine Deklaration
    writer = Irgendwas ist eine Zuweisung
    Wenn es keinen guten Grund dagegen gibt, und besonders wenn die beiden Zeilen eh direkt untereinander stehen, sollte man die Kurzform verwenden: Dim writer As IO.StreamWriter = Irgendwas
    Und weil Irgendwas ein Aufruf an den Konstruktor des gleichen Typs ist (New IO.StreamWriter(...)) kann man die Kurzform verwenden: Dim writer As New IO.StreamWriter(...)
    Option Infer lass ich jetzt mal weg. Das würde nur verwirren.

    Der StreamWriter implementiert IDisposable. Typischerweise findet man das dort, wo unverwaltete Ressourcen verwendet werden: vb-paradise.de/programmieren/h…te-ressourcen/#post826381
    Alles (bis auf ganz wenige Ausnahmen), was IDisposable implementiert, muss man auch selbst wieder durch einen Aufruf an die Dispose-Methode verwerfen.
    Der StreamWriter öffnet ein Handle auf z.B. eine Datei, die auf der Festplatte liegt. Wenn man den StreamWriter nicht wieder schließt (bei Dir durch den Aufruf an die Close-Methode), dann bleibt das Handle offen, und obwohl man bereits alles nötige in die Datei geschrieben hat, kann man sie nicht in einem anderen Programm öffnen oder z.B. löschen. Windows meldet dann, dass die Datei von einem anderen Programm verwendet wird. Dazu kommt, dass Arbeitsspeicher, der von dem StreamWriter verwendet wird, nicht automatisch vom GarbageCollector freigegeben werden kann. Das kann auf die Dauer den RAM vollmüllen (ein typisches Problem beim Arbeiten mit System.Drawing.Bitmap).
    Damit garantiert ist, dass Dispose aufgerufen wird, verwendet man Using:

    VB.NET-Quellcode

    1. Using Writer As New System.IO.StreamWriter(...)
    2. 'Was in den Writer hineinschreiben
    3. End Using
    Dadurch wird der StreamWriter beim Erreichen von End Using automatisch geschlossen. Ich weiß nicht, ob Dir Exceptions bekannt sind, aber ich kann so viel sagen: Der StreamWriter wird auch geschlossen, wenn vor dem Erreichen von End Using eine Exception auftritt.

    Das Angeben vom Variablennamen nach Next ist nicht nötig. Es ist eine Stilfrage, ob man es hinschreibt oder weglässt. Das heißt, Du musst das selbst entscheiden. Aber ich möchte Dich nur darauf aufmerksam machen, dass es auch anders geht.

    Der Name von feld ist nicht nur außerordentlich nichtssagend, sondern auch aus technischer Sicht falsch.

    VB.NET-Quellcode

    1. Class Foo
    2. Dim Bar As Integer 'Das ist ein Feld
    3. Public Sub Baz()
    4. Dim Blarg As Integer 'Das nicht
    5. End Sub
    6. End Class
    Das in der Klasse ist ein Feld. Um genau zu sein ein privates Instanz-Feld mit dem Namen "Bar" und vom Typ Integer. Man spricht manchmal auch von "globalen Variablen", aber ich mag diese Bezeichnung nicht sehr gerne.
    Dagegen ist das in der Baz-Methode eine "lokale Variable". Im Englischen spricht man von "locals", also von "lokalen".
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils