C#检查文本文件中的EOF以修复数组
我有一个代码来读取文本文件并将数据保存到双数组中以绘制图形:C#检查文本文件中的EOF以修复数组,c#,arrays,iostream,eof,C#,Arrays,Iostream,Eof,我有一个代码来读取文本文件并将数据保存到双数组中以绘制图形: string filename = openFileDialog1.FileName; var lineCount = 0; using (var reader = File.OpenText(@filename)) { string line; while ((line = reader.ReadLine()) != null) { var data = line.Split(','
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行的图形。可能吗?请给出建议。
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();
...
}
但是,如果不希望限制为2000行,那么从文件中读取并不是真正的问题。你可以考虑使用某种味道的普通容器。例如:
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
使用System.Collections.Generic;
字符串行=“12,34”;
var dDataList=新列表();
string[]parts=line.Split(',');
Add(新的KeyValuePair(Double.Parse(部分[0]),Double.Parse(部分[1]));
...
foreach(dDataList中的变量对)
Console.WriteLine(“{0}=>{1}”,pair.Key,pair.Value);//12 => 34
将允许您在合理的范围内添加任意数量的双精度阵列,而无需调整阵列大小/复制或处理任何令人讨厌的事务。在处理未知数量的数据时,通常认为最好使用
List
这样的容器,在确切知道将拥有多少数据或可以拥有的绝对最大数据量时使用数组;问题是,您正在声明一个固定长度为2000个单位的数组,但实际上您希望它是动态长度的。正如阿比纳夫所说,一份清单可能对你有用:
首先,您可以考虑为坐标创建类/结构:
public class Coordinate
{
public double x;
public double y;
}
然后,创建一个坐标列表(初始长度为0)
如果您想使用相同的类,请尝试给定的代码。这并不是最佳的内存使用方式,但仍然应该有效
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++;
}
您不能为此使用ArrayList或Generic List吗@AbhinavRanjan:
ArrayList
是一个非常古老的概念,它存储对象时不是类型安全的,确切的类型信息只有在运行时才知道,所以,应该避免使用ArrayList
@sudhakartilapudi Just-do-List,这样就可以了,因为它是类型safe@DanDrews:Yes泛型列表是类型安全的,因为在声明它时应该提供类型信息,例如:List List List=new List()代码>除了使用数组列表方法之外,还有其他可能的方法吗?@Ren您试图避免使用列表的原因是什么?这是您问题的正确解决方案。因为公共类已声明为double[,],并且有许多文件引用此公共类。我只能修改函数。如果不使用List,是否不可能执行此操作?当我尝试加载少于2000行的文件时,此代码返回相同的错误。不过我认为再做一点修改就能让这个东西工作了..嗯,我之前没有机会测试它,因为我相信它会工作的。。。遗漏了我们有二维数组。。已修改代码以使其正常工作:)
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);
}
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++;
}