2015-04-16 17 views
9

Tôi đang viết một chương trình cho trường nên tôi không hoàn toàn muốn ai đó sửa nó cho tôi, nhưng nếu ai đó có thể chỉ ra nơi họ thấy lỗi, điều đó thực sự hữu ích ! : DỨng dụng thăm dò ý kiến: StreamWriter không ghi vào tập tin

Chương trình được coi là một chuỗi số trong hộp văn bản, với người dùng nhấn enter sau mỗi mục nhập số nguyên, khi họ nhấn enter, số ghi vào tệp, sao cho mỗi số được tách riêng bằng dấu phẩy. Khi người dùng nhấn nút Xong, nút và hộp văn bản bị vô hiệu hóa, khi đó một nút mới và một hộp danh sách sẽ được bật. Người dùng có thể chọn nút kết quả để xem trong hộp danh sách tần số của các số được nhập vào hộp văn bản.

Tôi cảm thấy rằng hầu hết nó hoạt động đúng cách ngoại trừ việc nó không thực sự ghi vào tệp. Đây chỉ là năm đầu tiên của tôi vì vậy tôi khá mới ở đây, nhưng từ những thông tin tôi có tất cả có vẻ đúng.

Nếu ai đó có thể chỉ ra nơi tôi nên tìm kiếm một lỗi, một lần nữa, tôi thực sự đánh giá cao nó! Đây là mã của tôi:

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

cố gắng thêm 'writer.Flush()' sau khi ghi vào luồng –

+2

Ngoài ra 'writer.Close()' vì bạn không sử dụng khối 'using' để đóng luồng I/O để ngăn chặn' Tệp đã có trong use' vào cuộc gọi tiếp theo. – Franck

+1

Bạn cũng có thể đặt AutoFlush = true. –

Trả lời

3

StreamWriter (và StreamReader) được đệm. Các hoạt động IO thường chậm hơn nhiều so với làm việc trong bộ nhớ vì vậy các tệp tin thường được đọc và được viết theo các khối.

Nếu bạn chỉ viết một số tiền nhỏ bằng cách sử dụng StreamWriter, bạn sẽ nhận được hành vi mà bạn có thể xem tại đây.

Thông tin bạn đã viết đã được ghi vào bộ đệm StreamWriters, nó sẽ không xuất hiện trên đĩa cho đến khi bạn hoặc Flush bộ đệm hoặc đóng luồng.

+0

Lệnh tuôn ra làm việc ghi số vào tệp, tôi cũng phải chuyển đổi đầu vào thành chuỗi bởi vì nó hiển thị các giá trị ký tự thay vì các số. Bây giờ mảng ở phía dưới sẽ nằm ngoài phạm vi, mặc dù –

+1

@MelissaGrouchy Array's là 0 dựa và bạn là chỉ mục dựa trên 1. Điều này có nghĩa là kết quả [1] truy cập phần tử thứ hai trên mảng và kết quả [10] truy cập phần tử thứ 11, không tồn tại. –

+0

Ồ, tôi hiểu ý bạn là gì! Tôi sẽ cố gắng xung quanh với điều đó và nhìn thấy nó ở đâu. Cảm ơn! –

1

Tôi khuyên bạn nên sử dụng "sử dụng" cho người viết luồng. nếu bạn viết nhiều tập tin, nó là thích hợp để đóng chúng ở cuối.

Sử dụng. Các câu lệnh sử dụng trong các ví dụ mở và chuẩn bị các tệp. Vào cuối của các báo cáo họ đóng và xử lý các nguồn lực. Nếu chương trình của bạn thực hiện nhiều thao tác ghi, chương trình sẽ quản lý tài nguyên hệ thống một cách chính xác nếu bạn sử dụng.

tại đây bạn tìm thấy hướng dẫn cơ bản. http://www.dotnetperls.com/streamwriter

0

Được rồi, vì vậy những gì tôi đã cố định ở đây để làm cho nó hoạt động được:

Như khuyên, tôi đã thêm Flush(); sau khi viết tập tin.

tôi đã thay đổi vòng lặp foreach của tôi đến một vòng lặp for để khởi tạo biến x 0, bởi vì nó đã bắt đầu giảm tại 1.

Tôi cũng đã thêm các tuyên bố

record = reader.ReadLine(); 

bên trong forloop để nó đã được đọc số tiếp theo trong tập tin sau khi kiểm tra trước đó.

Tôi chắc chắn có một số thứ khác tôi có thể thêm hoặc thay đổi để làm cho hiệu quả hơn, nhưng tôi khá mới mẻ đối với tất cả điều này, và đây là những gì khóa học của tôi yêu cầu tôi làm. Nếu bạn vẫn muốn đề cập đến một số thay đổi đó để giúp những người khác có thể xem xét điều này sau này, hãy thoải mái :)

Cảm ơn bài đăng của bạn! Tôi đánh giá cao sự giúp đỡ! Chúc mừng!

Các vấn đề liên quan