2015-04-16 20 views
9

Sto scrivendo un programma per la scuola, quindi non voglio assolutamente che qualcuno lo aggiusti per me, ma se qualcuno potrebbe indicare dove vedono l'errore, sarebbe davvero utile ! : DApplicazione sondaggio: StreamWriter non scrive nel file

Il programma dovrebbe contenere una serie di numeri in una casella di testo, con l'utente che preme invio dopo ogni voce intera, quando premono invio, il numero scrive in un file, in modo che ogni numero sia separato da una virgola. Quando l'utente preme il pulsante Fine, il pulsante e la casella di testo diventano disabilitati, quindi un nuovo pulsante e una casella di riepilogo diventano abilitati. L'utente può selezionare il pulsante risultati per visualizzare nella casella di riepilogo la frequenza dei numeri inseriti nella casella di testo.

Ritengo che la maggior parte funzioni correttamente, tranne che in realtà non scrive sul file. Questo è solo il mio primo anno quindi sono abbastanza nuovo in questo, ma da quali informazioni ho tutto sembra giusto.

Se qualcuno potrebbe indicare dove dovrei cercare un errore, di nuovo, lo apprezzerei davvero! Ecco il mio codice:

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

prova ad aggiungere 'writer.Flush()' dopo aver scritto allo stream –

+2

anche 'writer.Close()' dato che non stai usando il blocco 'using' per chiudere il flusso I/O per evitare' File già in usare' alla prossima chiamata. – Franck

+1

È inoltre possibile impostare AutoFlush = true. –

risposta

3

StreamWriter (e StreamReader) sono memorizzati nel buffer. Le operazioni di I/O sono in genere molto più lente del lavoro in memoria, quindi i file vengono spesso letti e scritti in blocchi.

Se si scrive solo una piccola quantità utilizzando uno StreamWriter, si otterrà il comportamento che è possibile vedere qui.

Le informazioni scritte sono state scritte nel buffer StreamWriters, non verranno visualizzate sul disco fino a quando non si è Flush il buffer o si chiude lo stream.

+0

Lo svuotamento ha funzionato scrivendo il numero sul file, ho anche dovuto convertire l'input in una stringa perché mostrava i valori dei caratteri invece dei numeri. Ora l'array in fondo sta andando fuori portata, sebbene gli array –

+1

@MelissaGrouchy siano a 0 e l'indice sia basato su 1. Ciò significa che i risultati [1] accedono al secondo elemento dell'array e i risultati [10] accedono all'undicesimo elemento, che non esiste. –

+0

Oh capisco cosa intendi! Proverò a fare scherzi e vedere dove mi arriva. Grazie! –

1

Vi consiglio di utilizzare "using" per streamwriter. se scrivi più file è opportuno chiuderli alla fine.

Utilizzo. Le istruzioni using negli esempi si aprono e preparano i file. Alla fine delle dichiarazioni chiudono e dispongono delle risorse. Se il tuo programma fa molte scritture, gestirà correttamente le risorse di sistema se usi l'uso.

qui trovi un tutorial di base. http://www.dotnetperls.com/streamwriter

0

Okay, quindi quello che ho fissato qui per farlo funzionare è stato:

come consigliato, ho aggiunto Flush(); dopo aver scritto il file.

ho cambiato il mio ciclo foreach per un ciclo for per inizializzare la variabile x per 0, perché stava iniziando fuori a 1.

Ho anche aggiunto la dichiarazione

record = reader.ReadLine(); 

all'interno del forloop in modo che stava leggendo il prossimo numero nel file dopo aver controllato quello precedente.

Sono sicuro che ci sono altre cose che potrei aggiungere o modificare per renderlo più efficiente, ma sono abbastanza nuovo a tutto questo, ed è quello che il mio corso mi richiede di fare. Se vuoi ancora citare alcune di queste modifiche per aiutare altre persone che potrebbero guardare in seguito, sentiti libero :)

Grazie per i tuoi post! Apprezzo l'aiuto! Cheers!

Problemi correlati