轮询应用程序:StreamWriter不写入文件

时间:2015-04-16 11:52:08

标签: c# streamwriter

我正在为学校写一个程序,所以我并不希望有人为我修复它,但如果有人能指出他们看到错误的地方,那将非常有帮助! :d

程序应该在文本框中输入一系列数字,用户在每个整数条目后按Enter键,当他们按回车键时,数字写入文件,这样每个数字用逗号分隔。 当用户点击完成按钮时,按钮和文本框将被禁用,然后启用新按钮和列表框。用户可以选择结果按钮,在列表框中查看在文本框中输入的数字的频率。

我觉得它的大部分工作正常,只是它实际上没有写入文件。这只是我的第一年,所以我对此很新,但从我所掌握的信息看起来都是正确的。

如果有人能指出我应该在哪里寻找错误,那么,我真的很感激!这是我的代码:

 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();
        }
    }
}

3 个答案:

答案 0 :(得分:3)

StreamWriter(和StreamReader)被缓冲。 IO操作通常比在内存中工作慢得多,因此文件通常以块的形式读取和写入。

如果你只使用StreamWriter写一小部分,你会得到你在这里可以看到的行为。

您编写的信息已写入StreamWriters缓冲区,在您Flush缓冲区或关闭流之前,它不会出现在磁盘上。

答案 1 :(得分:1)

我建议您使用&#34;使用&#34;对于节选者。 如果你写了多个文件,那么最后关闭它们是合适的。

  

使用。示例中的using语句打开并准备文件。在陈述结束时,他们关闭并处置资源。如果您的程序执行大量写操作,则在使用时将正确管理系统资源。

在这里您可以找到基本教程。 http://www.dotnetperls.com/streamwriter

答案 2 :(得分:0)

好的,我在这里修理的是:

根据建议,我添加了Flush();写完文件后。

我将foreach循环更改为for循环以将x变量初始化为0,因为它从1开始。

我还添加了声明

record = reader.ReadLine(); 

在forloop中,以便在检查前一个数字后读取文件中的下一个数字。

我确定还有其他一些我可以添加或更改以提高效率的东西,但我对所有这些都相当新,这就是我的课程要求我做的事情。 如果您仍想提及其中一些更改以帮助其他可能会在以后查看此内容的人,请随意:)

感谢您的帖子!我很感激帮助! 干杯!