2015-04-16 9 views
9
दायर करने के लिए

मैं स्कूल के लिए एक कार्यक्रम लिख रहा हूँ नहीं लिख तो मैं नहीं है एकमुश्त किसी को मेरे लिए यह तय करने के लिए चाहते हैं, लेकिन अगर किसी को बाहर बिंदु सकता है, जहां वे त्रुटि देखते हैं, जो वास्तव में मददगार होगा ! : डीपोल आवेदन: StreamWriter

कार्यक्रम को टेक्स्ट बॉक्स में संख्याओं की एक श्रृंखला में ले जाना चाहिए, उपयोगकर्ता प्रत्येक पूर्णांक प्रविष्टि के बाद एंटर दबाकर, जब वे एंटर दबाते हैं, तो संख्या फ़ाइल को लिखती है, ताकि प्रत्येक नंबर अलग हो एक अल्पविराम से। जब उपयोगकर्ता पूर्ण बटन हिट करता है, तो बटन और टेक्स्टबॉक्स अक्षम हो जाता है, फिर एक नया बटन और एक सूची बॉक्स सक्षम हो जाता है। उपयोगकर्ता सूची बॉक्स में टेक्स्ट बॉक्स में दर्ज की गई संख्याओं की आवृत्ति को देखने के लिए परिणाम बटन का चयन कर सकते हैं।

मुझे लगता है कि इसमें से अधिकांश सिवाय इसके कि यह वास्तव में फ़ाइल में नहीं लिखा है ठीक से काम कर रहा है। यह केवल मेरा पहला साल है इसलिए मैं इस पर बिल्कुल नया हूं, लेकिन मेरे पास कौन सी जानकारी है, यह सब सही दिखता है।

किसी का कहना है सकता है जहां मैं एक त्रुटि की तलाश में किया जाना चाहिए, फिर से, मैं वास्तव में इसकी सराहना होगी! यहां मेरा कोड है:

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

धारा –

+2

पर लिखने के बाद 'लेखक.फ्लश()' जोड़ने का प्रयास करें, इसके अलावा 'लेखक.क्लोज़()' क्योंकि आप पहले से मौजूद फ़ाइल को रोकने के लिए I/O स्ट्रीम को बंद करने के लिए 'उपयोग' ब्लॉक का उपयोग नहीं कर रहे हैं अगली कॉल पर 'का उपयोग करें। – Franck

+1

आप ऑटोफ्लश = सत्य भी सेट कर सकते हैं। –

उत्तर

3

स्ट्रीमवाइटर (और स्ट्रीम रीडर) buffered हैं। आईओ ऑपरेशंस आम तौर पर स्मृति में काम करने से बहुत धीमे होते हैं, इसलिए फ़ाइलों को अक्सर पढ़ने और लिखने में लिखा जाता है।

आप केवल एक StreamWriter का उपयोग कर एक छोटी राशि लिखते हैं तो आप व्यवहार आप यहाँ देख सकते हैं मिलेगा।

आपके द्वारा लिखी गई जानकारी को स्ट्रीमवाइटर्स बफर में लिखा गया है, यह तब तक डिस्क पर दिखाई नहीं देगा जब तक कि आप Flush बफर या स्ट्रीम बंद न करें।

+0

फ्लश ने फ़ाइल को संख्या लिखने में काम किया, मुझे इनपुट को स्ट्रिंग में भी परिवर्तित करना पड़ा क्योंकि यह संख्याओं के बजाय चरित्र मान दिखा रहा था। अब नीचे की सरणी सीमा से बाहर जा रही है, हालांकि –

+1

@MelissaGrouchy Array 0 आधारित हैं और आप सूचकांक 1 आधारित हैं। इसका मतलब है कि परिणाम [1] सरणी पर दूसरे तत्व तक पहुंचता है और परिणाम [10] 11 वें तत्व तक पहुंचता है, जो अस्तित्व में नहीं है। –

+0

ओह, मैं देखता हूं कि आपका क्या मतलब है! मैं इसके साथ गड़बड़ करने की कोशिश करूंगा और देख सकता हूं कि यह मुझे कहाँ ले जाता है। धन्यवाद! –

1

मैं आपको स्ट्रीमराइटर के लिए "उपयोग" का उपयोग करने की सलाह देता हूं। यदि आप एकाधिक फाइलें लिखते हैं तो अंत में उन्हें बंद करना उचित है।

का उपयोग करना। उदाहरणों में उपयोग कथन फाइलें खोलें और तैयार करें। बयान के अंत में वे संसाधनों को बंद और निपटान करते हैं। यदि आपका प्रोग्राम बहुत सारे लिखता है, तो यदि आप उपयोग करते हैं तो यह सिस्टम संसाधनों का सही ढंग से प्रबंधन करेगा।

यहाँ आप एक बुनियादी ट्यूटोरियल पाते हैं। http://www.dotnetperls.com/streamwriter

0

ठीक है, तो क्या मैं यहाँ तय काम करने के लिए इसे पाने के लिए किया गया था:

के रूप में की सलाह दी है, मैं फ्लश जोड़ा(); फ़ाइल लिखने के बाद।

मैं पाश के लिए एक करने के लिए अपने foreach पाश बदल 0 एक्स चर प्रारंभ करने में है, क्योंकि यह कम से 1.

बंद शुरू हो गया था मैं भी इतना है कि forloop अंदर बयान

record = reader.ReadLine(); 

जोड़ा यह पिछले एक की जांच के बाद फ़ाइल में अगली संख्या पढ़ रहा था।

मुझे यकीन है कि कुछ और चीजें हैं जिन्हें मैं अधिक कुशल बनाने के लिए जोड़ या बदल सकता हूं, लेकिन मैं इन सभी के लिए बिल्कुल नया हूं, और यही कारण है कि मेरे पाठ्यक्रम के लिए मुझे यह करना आवश्यक है। यदि आप अभी भी उन लोगों में मदद करने के लिए उन परिवर्तनों में से कुछ का उल्लेख करना चाहते हैं जो इसे बाद में देख सकते हैं, तो नि: शुल्क महसूस करें :)

आपकी पोस्ट के लिए धन्यवाद! मैं मदद की सराहना करता हूं! चीयर्स!

संबंधित मुद्दे