Laden...

Datei bleibt beim Speichern leer

Erstellt von Crone vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.052 Views
Thema geschlossen
C
Crone Themenstarter:in
168 Beiträge seit 2010
vor 13 Jahren
Datei bleibt beim Speichern leer

Hallo,

Ich komme bei einen Notizbuch nicht weiter es eigentlich kompett fertig nur wenn ich das Programm neustarte sind alle Notizen weg.

Nun hab ich mir gedacht okay erstellen wir eine Textdatei und speichern die darin und lesen sie beim start wieder aus.

Leider funktioniert das irgend wie nicht die Textdatei ist bzw. bleibt nämlich leer.
Als Test hab ich schließlich die textdatei mal von Hand beschrieben, dass laden hat leider auch nicht so ganz funktioniert.

Es wurden texte nur geladen wenn ich eine neue Notiz hinzugefügt hab jedoch wurde die neue notiz nun nicht mehr eingetragen, zudem wurde nur eine zeile gelesen bzw. wenn ich noch eine neue notiz erstellt habe wurde die 2 zeile gelesen.

Ich stelle euch mal alles zur verfügung was ich bis jetzt habe ich hoffe irgend wer findet den fehler 😉

GUI KLASSE:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace persoenlichesNotizbuch_V0
{
    public partial class NotizbuchForm : Form
    {
        private Notizbuch notiz;
        private int zahl = -1;
        private int zahlencounter = 0;
        private bool pruefe = false;
        public NotizbuchForm()
        {
            InitializeComponent();
            notiz = new Notizbuch();
        }

        private void speichernButton_Click(object sender, EventArgs e)
        {
            if (pruefe == false)
            {

                if (notizTextBox.Text != "")
                {
                    zahl++;
                    zahlencounter = zahl + 1;
                    notiz.SpeichereNotiz(zahlencounter.ToString() + ". " + notizTextBox.Text);
                    notizTextBox.Clear();
                }
                else
                {
                    MessageBox.Show("Das Eingabefeld darf nicht leer sein!", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                if (notizTextBox.Text != null)
                {
                    notiz.bearbeiten(notizTextBox.Text, notizListBox.SelectedIndex);
                    notizTextBox.Clear();
                }
                else
                {
                    MessageBox.Show("Das Eingabefeld darf nicht leer sein!", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                
                //Speichern in Datei wenn neue Notiz hinzugefügt worden ist

                string dateiname = "Notizen.txt";
                FileStream datenstrom = new FileStream(dateiname, FileMode.Create, FileAccess.Write);
                StreamWriter schreiber = new StreamWriter(datenstrom);           
                for (int i = 0; i <= zahl; i++)
                {
                    schreiber.WriteLine(notiz.ZeigeNotiz(i));
                }
                schreiber.Close();
                datenstrom.Close();
    

                pruefe = false;
            }
            
        }

 

        private void NotizbuchForm_Load(object sender, EventArgs e)
        {

            // Gespeicherte Notizen Laden
            string dateiname = "Notizen.txt";

            FileStream datenstrom = new FileStream(dateiname, FileMode.OpenOrCreate, FileAccess.Read);
            StreamReader leser = new StreamReader(datenstrom);
            while (leser.Peek() != -1)
            {
                notiz.SpeichereNotiz(leser.ReadLine());
            }
            leser.Close();
            datenstrom.Close();
            
        }

    }
}


...
...
Weiter Klasse:
...
...


using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace persoenlichesNotizbuch_V0
{
    /**
     * Die Klasse Notizbuch verwaltet beliebig lange Notizlisten.
     * Die Notizen sind nummeriert, um referenziert werden zu können.
     * In dieser Version starten die Notiznummern bei 0.
     * Autor:   Marcel Croonenbroeck
     * Version: 03.01.2011
     */
    public class Notizbuch
    {
        // Speicher für eine beliebige Anzahl an Notizen
        private ArrayList notizen;

        // Führt die Initialisierungen durch, die für ein Notizbuch notwendig sind
        public Notizbuch()
        {
            notizen = new ArrayList();
        }

        // Speichert eine neue Notiz in diesem Notizbuch
        public void SpeichereNotiz(string notiz)
        {
            notizen.Add(notiz);
        }

   
        // Zeigt die Notiz mit der Notiznummer <index> an
        public string ZeigeNotiz(int index)
        {
            if ((index >= 0) && (index < AnzahlNotizen()))
            {
                return (string)notizen[index];
            }
            else
            {
                return "";
            }
        }

    
    }
}

Real programmers don't comment their code - it was hard to write, it should be hard to understand.

1.552 Beiträge seit 2010
vor 13 Jahren

Hallo Crone,

bitte poste das nächste mal nur den relevanten Code.

using (StreamWriter sw = new StreamWriter("CDriveDirs.txt"))  
{  
    foreach (DirectoryInfo dir in cDirs)  
    {  
        sw.WriteLine(dir.Name);  
    }  
}  

sollte reichen dann brauchst du auch keinen Close(). Wenn du an deinem Beispiel bleibst kannst du vor dem .Close() ein .Flush() probieren.

Lies dir u.a. folgenden Link durch: What is the difference between StreamWriter.Flush() and StreamWriter.Close()?

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

C
Crone Themenstarter:in
168 Beiträge seit 2010
vor 13 Jahren

Wenn ich das richtig verstanden habe müsste es dann so aus sehen.

 
using (StreamWriter sw = new StreamWriter("Notiz.txt"))
                {
                    for (int i = 0; i <= zahl; i++)
                    {
                        foreach (DirectoryInfo dir in )
                        {
                            sw.WriteLine(notiz.ZeigeNotiz(i));
                        }
                    }
                    sw.Flush();
                }

Jedoch komme ich bei dieser zeile nicht weiter

 

                        foreach (DirectoryInfo dir in //was kommt hier hin? )


Real programmers don't comment their code - it was hard to write, it should be hard to understand.

1.552 Beiträge seit 2010
vor 13 Jahren

vorerst:
bitte bitte bitte verwende nicht ArrayList. Dies ist nicht mehr erwünscht.
Edit: Verwende dazu die Generische Collection List<String>

nein, du hast doch deine Collection notizen. Evt kannst du die öffentlich zugänglich machen, dann kannst du über


public class Notizbuch
{
    public List<String> Notizen{get;set;}
}
Notizbuch nb = new Notizbuch();
nb.Notizen.Add("NewNotiz");

hinzufügen und über folgenden Codeausschnitt schreiben:

using (StreamWriter sw = new StreamWriter("Notiz.txt"))
{
    foreach (Datentype n in notiz.notizen)
    {
        sw.WriteLine(n);
    }
}

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

1.665 Beiträge seit 2006
vor 13 Jahren

Ich werfe mal

File.WriteAllText();
File.ReadAllText();

ein. Soweit ich das sehe, kannst du das damit Ersetzen und sparst dir die IO Logik mit dem StreamWriter mit dem Close und Flush.

D
38 Beiträge seit 2009
vor 13 Jahren

Hallo Crone,

hier kommen meine Bemerkungen:

  1. Wenn eine Ausnahme auftritt, dann wird dein Programm hart beendet. Thema: ExceptionHandling

if (notizTextBox.Text != null)

Er kommt nie in den else-Zweig, da die Eigenschaft immer ungleich null ist. Prüfe bitte auf string.IsNullOrEmpty().

  1. Die Logik ist nicht von der Form getrennt. Sehr schlechtes Design, bzw. überhaupt keins. 🙂

  2. Was passiert, wenn notizListBox.SelectedIndex gleich - 1 ist? X(

  3. Was passiert mit deinem Programm, wenn im OnLoad() sagen wir 1 Mio Notizen geladen werden? X(

-dispose-

Thema geschlossen