我有一个代码,允许用户选择文件并将数据分配到数组中。
private void Load_data_Click(object sender, EventArgs e)
{
Stream myStream = null;
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.InitialDirectory = "C:\\DataArray";
openFileDialog1.Filter = "txt files (*.txt)|*.txt";
openFileDialog1.FilterIndex = 2;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
try
{
if ((myStream = openFileDialog1.OpenFile()) != null)
{
using (myStream)
{
string filename = openFileDialog1.FileName;
var lineCount = 0;
using (var reader = File.OpenText(@filename))
{
while (reader.ReadLine() != null)
{
lineCount++;
}
for(var count = 0; count < lineCount; ++count)
{
var data = reader.ReadLine().Split(',');
GlobalDataClass.dDataArray[count, 0] = double.Parse(data[0]);
GlobalDataClass.dDataArray[count, 1] = double.Parse(data[1]);
}
ShowGraphData(lineCount);
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
}
}
}
一旦分配,我调用函数showgraphdata来绘制zedgraph。
public void ShowGraphData(long lTotalData)
{
double[] dx = new double[lTotalData];
double[] dy = new double[lTotalData];
for (long li = 0; li < lTotalData; li++)
{
dx[li] = GlobalDataClass.dDataArray[li, 0];
dy[li] = GlobalDataClass.dDataArray[li, 1];
}
zedGraphControlStickiness.GraphPane.CurveList.Clear();
GraphPane StickinessPane = zedGraphControlStickiness.GraphPane;
// PointPairList holds the data for plotting, X and Y arrays
PointPairList spl1 = new PointPairList(dx, dy);
// Add cruves to myPane object
LineItem ProductionCurve = StickinessPane.AddCurve("Insertion Force", spl1, Color.Blue, SymbolType.None);
ProductionCurve.Line.Width = 2.0F;
zedGraphControlStickiness.AxisChange();
zedGraphControlStickiness.Invalidate();
zedGraphControlStickiness.Refresh();
GlobalDataClass.iTotalReadingPoint = lTotalData;
}
但当我执行此代码时,我收到此错误:“对象引用未设置为对象的实例”
有人可以告诉我我的错吗?tQ
答案 0 :(得分:2)
问题是你正在阅读,直到你到达终点:
while (reader.ReadLine() != null)
{
lineCount++;
}
然后你正在阅读更多内容,它将始终抛出一个空引用异常(因为每次调用readline都将返回null。
for(var count = 0; count < lineCount; ++count)
{
var data = reader.ReadLine().Split(',');
GlobalDataClass.dDataArray[count, 0] = double.Parse(data[0]);
GlobalDataClass.dDataArray[count, 1] = double.Parse(data[1]);
}
将您的代码段组合在一起读取一次以解决问题:
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++;
}
答案 1 :(得分:1)
问题:您尝试两次调用ReadLine()
方法。
当你正在阅读直到文件末尾时,你的流在null
循环结束时变为while()
。
while (reader.ReadLine() != null) //<-- reading 1st time
{
lineCount++;
} //stream becomes null here
for(var count = 0; count < lineCount; ++count)
{
var data = reader.ReadLine().Split(','); //<-- reading 2nd time
GlobalDataClass.dDataArray[count, 0] = double.Parse(data[0]);
GlobalDataClass.dDataArray[count, 1] = double.Parse(data[1]);
}
解决方案:您可以使用File.ReadLines()方法读取文件中的所有行。
试试这个:
string filename = openFileDialog1.FileName;
var lineCount = 0;
using (var reader in File.ReadLines(@filename))
{
var data=reader.Split(',');
lineCount ++;
GlobalDataClass.dDataArray[count, 0] = double.Parse(data[0]);
GlobalDataClass.dDataArray[count, 1] = double.Parse(data[1]);
}
ShowGraphData(lineCount);
答案 2 :(得分:0)
当您迭代(reader.ReadLine()!= null)时,您正在将位置更改为EOF。 请尝试那样的smth
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
try
{
var count = 0;
using (var reader = File.OpenText(@openFileDialog1.FileName))
{
var str = reader.ReadLine();
while (str != null)
{
var data = str.Split(',');
GlobalDataClass.dDataArray[count, 0] = double.Parse(data[0]);
GlobalDataClass.dDataArray[count, 1] = double.Parse(data[1]);
str = reader.ReadLine();
count++;
}
}
ShowGraphData(count - 1);
}
catch (Exception ex)
{
MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
}
}