2015-04-16 7 views
9

Ich schreibe ein Programm für die Schule, so dass ich nicht will, dass jemand es für mich zu beheben, aber wenn jemand könnte zeigen, wo sie den Fehler sehen, das wäre wirklich hilfreich ! : DUmfrage-Anwendung: StreamWriter nicht in Datei schreiben

Das Programm soll eine Reihe von Zahlen in einem Textfeld aufnehmen, mit dem Benutzer nach jedem Integer-Eintrag Enter drücken, wenn sie Enter drücken, schreibt die Zahl in eine Datei, so dass jede Nummer getrennt ist durch ein Komma. Wenn der Benutzer auf die Schaltfläche Fertig klickt, werden die Schaltfläche und das Textfeld deaktiviert, und eine neue Schaltfläche und ein Listenfeld werden aktiviert. Der Benutzer kann die Schaltfläche "Ergebnisse" auswählen, um im Listenfeld die Häufigkeit der Zahlen zu sehen, die in das Textfeld eingegeben wurden.

Ich fühle, dass das meiste davon richtig funktioniert, außer dass es nicht wirklich in die Datei schreibt. Dies ist nur mein erstes Jahr, also bin ich ziemlich neu dabei, aber nach welchen Informationen ich alles richtig sehe.

Wenn jemand darauf hinweisen könnte, wo ich nach einem Fehler suchen sollte, würde ich es sehr schätzen! Hier ist mein Code:

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

    namespace StudentPoll1 
    { 
    public partial class Form1 : Form 
    { 
     const string FILENAME = "numbers.txt"; 
     FileStream file = new FileStream(FILENAME, 
      FileMode.Create, FileAccess.ReadWrite);   

     public Form1() 
     {    
      InitializeComponent(); 
      btnResult.Enabled = false; 
     } 

     private void tbInput_KeyDown(object sender, KeyEventArgs e) 
     { 
      const char DELIM = ','; 
      int input; 
      const int MIN = 1; 
      const int MAX = 10; 

      int.TryParse(tbInput.Text, out input); 
      if (e.KeyCode == Keys.Enter) 
      { 
       try 
       { 
        if (input < MIN || input > MAX) 
        { 
         MessageBox.Show("Please enter an integer between 1 and 10"); 
        } 
        else 
        { 
         StreamWriter writer = new StreamWriter(file); 
         writer.WriteLine(input + DELIM + " "); 
        } 
       } 
       catch (IOException) 
       { 
        MessageBox.Show("Error with input"); 
       } 
       finally 
       { 
        tbInput.Clear(); 
       } 
      } 
     } 

     private void btnDone_Click(object sender, EventArgs e) 
     { 
      file.Close(); 
      btnDone.Enabled = false; 
      btnResult.Enabled = true; 
      lbOutput.SelectionMode = SelectionMode.None; 
     } 

     private void btnResult_Click(object sender, EventArgs e) 
     {    
      int[] ratings = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
      int[] results = new int[10]; 
      int entry; 
      const char DELIM = ','; 
      FileStream fs = new FileStream(FILENAME, 
       FileMode.Open, FileAccess.Read); 
      StreamReader reader = new StreamReader(fs); 
      string record; 
      string[] fields; 
      record = reader.ReadLine(); 
      while (record != null) 
      { 
       fields = record.Split(DELIM); 
       entry = Convert.ToInt32(fields[0]); 
       foreach (int x in ratings) 
       { 
        if (entry == ratings[x]) 
        { 
         ++results[x]; 
        } 
       } 
      } 
      for (int num = 0; num < ratings.Length; ++num) 
      { 
       lbOutput.Items.Add(ratings[num] + " " + results[num]); 
      } 
      fs.Close(); 
      reader.Close(); 
     } 
    } 
} 
+4

versuchen, 'writer.Flush()' nach dem Schreiben in den Stream –

+2

Auch 'writer.Close()' da Sie nicht mit dem 'using' Block zu schließen den I/O-Stream zu verhindern' Datei bereits in Verwenden Sie 'beim nächsten Anruf. – Franck

+1

Sie können auch AutoFlush = true festlegen. –

Antwort

3

StreamWriter (und StreamReader) sind gepuffert. IO-Operationen sind typischerweise viel langsamer als die Arbeit im Speicher, so dass Dateien oft in Blöcken gelesen und geschrieben werden.

Wenn Sie nur eine kleine Menge mit einem StreamWriter schreiben, erhalten Sie das Verhalten, das Sie hier sehen können.

Die von Ihnen geschriebenen Informationen wurden in den StreamWriters-Puffer geschrieben. Sie werden erst auf dem Datenträger angezeigt, wenn Sie den Puffer entweder Flush oder den Stream schließen.

+0

Der Flush funktionierte beim Schreiben der Nummer in die Datei, ich musste auch die Eingabe in eine Zeichenkette umwandeln, weil sie die Zeichenwerte anstelle der Zahlen zeigte. Jetzt ist das Array am unteren Rand außerhalb des Bereichs, obwohl –

+1

@MelissaGrouchy Array's sind 0 basiert und du bist Index ist 1 basiert. Dies bedeutet, dass Ergebnisse [1] auf das zweite Element im Array zugreifen und Ergebnisse [10] auf das 11. Element zugreifen, das nicht existiert. –

+0

Oh ich sehe was du meinst! Ich werde versuchen, mich damit herumzuschlagen und zu sehen, wo es mich hinbringt. Vielen Dank! –

1

Ich empfehle Ihnen, "Verwendung" für Streamwriter zu verwenden. Wenn Sie mehrere Dateien schreiben, ist es richtig, sie am Ende zu schließen.

Verwendung. Die using-Anweisungen in den Beispielen öffnen und bereiten die Dateien vor. Am Ende der Aussagen schließen sie und entsorgen die Ressourcen. Wenn Ihr Programm viele Schreibvorgänge ausführt, werden Systemressourcen ordnungsgemäß verwaltet, wenn Sie verwenden.

Hier finden Sie ein grundlegendes Tutorial. http://www.dotnetperls.com/streamwriter

0

Okay, also, was ich hier regelte es zur Arbeit kommen wurde:

Wie geraten, habe ich Flush(); nach dem Schreiben der Datei.

änderte ich meine foreach-Schleife zu einer for-Schleife die x-Variable auf 0 initialisiert werden, da es bei 1.

Anfahren wurde auch ich die Aussage

record = reader.ReadLine(); 

innerhalb des forloop hinzugefügt, so dass Es wurde die nächste Nummer in der Datei nach dem Überprüfen der vorherigen gelesen.

Ich bin sicher, dass es noch andere Dinge gibt, die ich hinzufügen oder ändern könnte, um effizienter zu werden, aber ich bin ziemlich neu in all dem, und das ist es, was mein Kurs von mir verlangt. Wenn Sie noch einige dieser Änderungen erwähnen möchten, um anderen Leuten zu helfen, die sich das später ansehen könnten, fühlen Sie sich frei :)

Vielen Dank für Ihre Beiträge! Ich schätze die Hilfe! Prost!