【问题标题】:C# Check EOF in text file to fix arrayC# 检查文本文件中的 EOF 以修复数组
【发布时间】:2014-02-19 03:27:59
【问题描述】:

我有一个代码来读取文本文件并将数据保存到双数组中以绘制图形:

string filename = openFileDialog1.FileName;
var lineCount = 0;
using (var reader = File.OpenText(@filename))
{
     string line;
     while ((line = reader.ReadLine()) != null)
     {
          var data = line.Split(',');
          GlobalDataClass.dDataArray[lineCount, 0] = double.Parse(data[0]);
          GlobalDataClass.dDataArray[lineCount, 1] = double.Parse(data[1]);

          lineCount++;
     }
     ShowGraphData(lineCount);
}

我创建了一个公共类,将数组初始化为 [2000,2]:

static class GlobalDataClass
{
    public static double[,] dDataArray = new double[2000, 2];   
    public static long iTotalReadingPoint;

}    

我的文本文件会是这样的:

0,29
1,31  
2,32  
3,32
4,30  

但是我希望我的程序检测 EOF,以便文本文件可以包含随机行,并且仍然能够绘制不限于 2000 行的图形。有可能吗?请指教。TQ

【问题讨论】:

  • 你不能为此目的使用 ArrayList 或 Generic List 吗? msdn.microsoft.com/en-us/library/…msdn.microsoft.com/en-us/library/6sh2ey19.aspx
  • @AbhinavRanjan: ArrayList 是一个非常古老的概念,它存储对象时不是类型安全的,而且只有在运行时才能知道确切的类型信息,所以应该避免使用ArrayList
  • @SudhakarTillapudi 只需执行 List 就可以了,因为它是类型安全的
  • @DanDrews:是的,通用列表是类型安全的,因为在声明它时应该提供类型信息:List<string> list=new List<string>();

标签: c# arrays iostream eof


【解决方案1】:

如果您想使用相同的类,请尝试给定的代码。这不是最优化的内存使用方式,但它仍然可以工作。

        string filename = openFileDialog1.FileName;
        var lineCount = 0;
        while ((line = reader.ReadLine()) != null)
        {
            if (GlobalDataClass.dDataArray.GetLength(0) == lineCount)
            {                
                double[,] newTemp = GlobalDataClass.dDataArray;
                int increaseLenght = newTemp.Length + 1000;
                GlobalDataClass.dDataArray = new double[increaseLenght, 2];
                Array.Copy(newTemp, GlobalDataClass.dDataArray, newTemp.LongLength);
            }

            var data = line.Split(',');
            GlobalDataClass.dDataArray[lineCount, 0] = double.Parse(data[0]);
            GlobalDataClass.dDataArray[lineCount, 1] = double.Parse(data[1]);
            lineCount++;
        }

【讨论】:

  • 当我尝试加载少于 2000 行的文件时,此代码返回相同的错误。但是我认为再做一些修改会使这件事起作用..hmmm
  • 之前没有机会测试它,因为我确信它应该可以工作......错过了我们有二维数组......修改后的代码让它工作:)
【解决方案2】:

StreamReader 类有一个名为 EndOfStream 的布尔属性,它本质上是 FileStream 对象的 EoF,还有 Peek() 方法,它通常是 EoF 之前的标准读取方式。

var reader = File.OpenText( ... );

while( reader.Peek() != -1 ) //Peek() returns -1 on EoF or if the stream is not seekable.
{
    var line = reader.ReadLine();
    ...
}

但是,如果您不想被限制为 2,000 行,那么从文件中读取并不是真正的问题。您可能会考虑使用某种风味的通用容器。例如:

using System.Collections.Generic;

string line = "12,34";
var dDataList = new List<KeyValuePair<double, double>>();
string[] parts = line.Split( ',' );
dDataList.Add( new KeyValuePair<double, double>( Double.Parse( parts[0] ), Double.Parse( parts[1] ) ) );

...

foreach( var pair in dDataList )
    Console.WriteLine( "{0} => {1}", pair.Key, pair.Value ); // 12 => 34

在合理范围内,您可以根据需要添加任意多的双精度数对,而无需摆弄数组大小/复制或任何令人讨厌的事情。通常认为在处理未知数量的数据时使用像List&lt;T&gt; 这样的容器是一种很好的做法,并且在您确切知道要拥有多少数据或绝对最大数据量时使用数组可以拥有。

【讨论】:

  • 除了使用数组List方法还有其他可能的方法吗?
  • @Ren 你有什么理由试图避免使用列表?这是解决您问题的正确方法。
  • 因为公共类已经声明为double[,],并且有很多文件引用了这个公共类。而且我只能修改功能。不使用List就无法做到吗?
【解决方案3】:

我认为你的问题有点错误;您遇到的问题是您声明了一个 2000 单位固定长度的数组,但您实际上希望它是动态长度。正如 Abhinav 所说,列表可能对您有用:

首先,您可以考虑为您的坐标创建一个类/结构:

public class Coordinate
{
    public double x;
    public double y;    
}  

然后,创建一个坐标列表(最初长度为 0)...

static class GlobalDataClass
{
    public static List<Coordinate> dDataArray = new List<Coordinate>();
    public static long iTotalReadingPoint;
}    

然后在您找到新行时将坐标对象添加到您的列表中..

string filename = openFileDialog1.FileName;
var lineCount = 0;
using (var reader = File.OpenText(@filename))
{
     string line;
     while ((line = reader.ReadLine()) != null)
     {
          var data = line.Split(',');
          Coordinate coord = new Coordinate();
          coord.x = double.Parse(data[0]);
          coord.y = double.Parse(data[1]);
          GlobalDataClass.dDataArray.Add(coord);
          lineCount++;
     }
     ShowGraphData(lineCount);
}

【讨论】:

    猜你喜欢
    • 2014-01-31
    • 2018-02-25
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 2021-05-03
    • 1970-01-01
    • 2017-02-04
    相关资源
    最近更新 更多