StreamReader还是其他方法?做我想做的事

时间:2011-03-18 21:11:42

标签: c#

我正在使用一个程序从文件中读取数据并将其实时绘制到图形中。我的流来自微控制器输出,我正在构建一个界面来显示数据。我在日常工作中使用流阅读器,但我遇到了问题。

我想要做的是获取一行,绘制它,然后获取方法中的下一行。你可以指导我做什么来做这件事。我是C#的新手,我认为流阅读器是最好的方法。我只需要一种能够在他们来时读取新点的方法。

感谢。

private void timer1_Tick( object sender, EventArgs e )
{
    if ( curve == null ) return;

    IPointListEdit list = curve.Points as IPointListEdit;

    if (list == null) return;

    double time = (Environment.TickCount - tickStart) / 1000.0;
    try
    {
        //PROBLEM (NEED TO READ ONE LINE THIS TIME AND THE NEXT LINE IN THE NEXT CALL
        StreamReader sr = new StreamReader("TestFile.txt");
        String line;     
        line = sr.ReadLine();
        double value = double.Parse(line);
        list.Add(time, value);
    }
    catch (Exception err)
    {
        MessageBox.Show(err.Message);
    }

    //graphing code
}

1 个答案:

答案 0 :(得分:2)

您将需要缓存您的阅读器并稍微重构您的代码。

基本上,如果您想在每个刻度线上读取一行,您需要将读取器从您的方法中移出并使其成为一个字段。现在当滴答声发生时,它将获取之前使用的相同读者实例。这意味着它与您上次读取的文件位于同一位置。您需要做的就是调用ReadLine()来获取下一行。

您当前设置的方式是,每打开一个打开文件,只读取第一行。只是一个FYI,当ReadLine返回null时,您已到达文件的末尾。

下面的代码只是一个如何设置它的模型,希望能给你一些关于它如何工作的想法。

    StreamReader _reader;

    public void Init()
    {
        _reader = new StreamReader("FileName.txt");
        _timer.Start();
    }

    public void timer_Tick(object sender, EventArgs e)
    {
        if (curve == null)
            return;

        IPointListEdit list = curve.Points as IPointListEdit;

        if (list == null)
            return;

        double time = (Environment.TickCount - tickStart) / 1000.0;
        try
        {
            string line = _reader.ReadLine();
            if (line == null)
            {
                _timer.Stop();
                return;
            }
            double value = double.Parse(line);
            list.Add(time, value);
        }
        catch (Exception err)
        {
            //Do Something
        }

    }