c# 一个 public Streamreader
c# One public Streamreader
我对 C# 了解不多。我正在尝试创建一个可以计算 运行 比赛结果的程序。我创建了两种方法:DoStuff(),我用它设置了一个 Datagridview table 列并显示了一个文本文件 splitted.And Method-Sorter(),我用它对跑步者进行分组并显示它们在列表框中。
我的问题。
每次当我尝试调试程序时,我都会收到以下错误:
'Cannot read from a closed TextReader.'
如您所见,我将 StreamReader 设置为 public。但是这两种方法无法访问它。
是否有可能以这样的方式使用一个 StreamReader?!
或者我必须在 Form-Load 中编写我的代码,然后这是访问它的唯一方法?
我的代码
public partial class Form1 : Form
{
public StreamReader sr = new StreamReader(@"C:\Users\Oscar\Desktop\result.txt");
public string line;
public List<string> V = new List<string>();
public List<string> V12 = new List<string>();
public List<string> V14 = new List<string>();
public List<string> V18 = new List<string>();
public List<string> V50 = new List<string>();
public List<string> VB = new List<string>();
public List<string> VC = new List<string>();
public List<string> S = new List<string>();
public List<string> S12 = new List<string>();
public List<string> S14 = new List<string>();
public List<string> S18 = new List<string>();
public List<string> S40 = new List<string>();
public Form1()
{
InitializeComponent();
}
public void ReadFile()
{
}
private void Form1_Load(object sender, EventArgs e)
{
SORTER();
Dostuff();
}
public void Dostuff()
{
if (!System.IO.File.Exists(@"C:\Users\Oscar\Desktop\result.txt"))
return;
dataGridView1.ColumnCount = 3;
dataGridView1.Columns[0].HeaderCell.Value = "Number";
dataGridView1.Columns[1].HeaderCell.Value = "name";
dataGridView1.Columns[2].HeaderCell.Value = "time";
using (sr)
while (sr.Peek() > -1 )
{
dataGridView1.Rows.Add(sr.ReadLine().Split(';'));
}
}
public void SORTER()
{
using (sr)
while ((line = sr.ReadLine()) != null)
{
if (line.Contains(";V;")) { V.Add(line); }
else if (line.Contains(";V12;")) { V12.Add(line); }
else if (line.Contains(";V14;")) { V14.Add(line); }
else if (line.Contains(";V18;")) { V18.Add(line); }
else if (line.Contains(";V50;")) { V50.Add(line); }
else if (line.Contains(";S12;")) { S12.Add(line); }
else if (line.Contains(";S14;")) { S14.Add(line); }
else if (line.Contains(";S18;")) { S18.Add(line); }
else if (line.Contains(";S40;")) { S40.Add(line); }
if (line.Contains(";S;")) { S.Add(line); }
}
listBox1.DataSource = V12;
listBox2.DataSource = V50;
listBox3.DataSource = V;
listBox4.DataSource = S;
listBox5.DataSource = S18;
listBox6.DataSource = S40;
}
}
您的 StreamReader 位于 SORTER() 方法的 using 块中。这意味着在该块结束后,将释放 StreamReader。当您尝试在 DoStuff() 方法中重用同一个 StreamReader 时,您将收到您描述的错误,因为 StreamReader 不再处于可读取状态。
您可以在每个方法中将它们创建为局部变量,而不是为您的 StreamReader 使用全局变量。
不要在您的表单定义中执行此操作:
public StreamReader sr = new StreamReader(@"C:\Users\Oscar\Desktop\result.txt");
当您的表单创建并保持打开状态时,它会打开您的文件一次。如果您遇到 IO 错误,这样做可能会阻止或崩溃您的应用程序,并且通常会导致“文件正在使用”错误。您应该仅在实际需要使用文件时才打开文件,然后立即将其关闭。无论你在哪里:
using (sr)
你应该这样做:
using (var sr = new StreamReader(@"C:\Users\Oscar\Desktop\result.txt"))
实际上,你应该这样做:
using (var sr = new StreamReader(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "result.txt")))
我对 C# 了解不多。我正在尝试创建一个可以计算 运行 比赛结果的程序。我创建了两种方法:DoStuff(),我用它设置了一个 Datagridview table 列并显示了一个文本文件 splitted.And Method-Sorter(),我用它对跑步者进行分组并显示它们在列表框中。
我的问题。 每次当我尝试调试程序时,我都会收到以下错误:
'Cannot read from a closed TextReader.'
如您所见,我将 StreamReader 设置为 public。但是这两种方法无法访问它。 是否有可能以这样的方式使用一个 StreamReader?! 或者我必须在 Form-Load 中编写我的代码,然后这是访问它的唯一方法? 我的代码
public partial class Form1 : Form
{
public StreamReader sr = new StreamReader(@"C:\Users\Oscar\Desktop\result.txt");
public string line;
public List<string> V = new List<string>();
public List<string> V12 = new List<string>();
public List<string> V14 = new List<string>();
public List<string> V18 = new List<string>();
public List<string> V50 = new List<string>();
public List<string> VB = new List<string>();
public List<string> VC = new List<string>();
public List<string> S = new List<string>();
public List<string> S12 = new List<string>();
public List<string> S14 = new List<string>();
public List<string> S18 = new List<string>();
public List<string> S40 = new List<string>();
public Form1()
{
InitializeComponent();
}
public void ReadFile()
{
}
private void Form1_Load(object sender, EventArgs e)
{
SORTER();
Dostuff();
}
public void Dostuff()
{
if (!System.IO.File.Exists(@"C:\Users\Oscar\Desktop\result.txt"))
return;
dataGridView1.ColumnCount = 3;
dataGridView1.Columns[0].HeaderCell.Value = "Number";
dataGridView1.Columns[1].HeaderCell.Value = "name";
dataGridView1.Columns[2].HeaderCell.Value = "time";
using (sr)
while (sr.Peek() > -1 )
{
dataGridView1.Rows.Add(sr.ReadLine().Split(';'));
}
}
public void SORTER()
{
using (sr)
while ((line = sr.ReadLine()) != null)
{
if (line.Contains(";V;")) { V.Add(line); }
else if (line.Contains(";V12;")) { V12.Add(line); }
else if (line.Contains(";V14;")) { V14.Add(line); }
else if (line.Contains(";V18;")) { V18.Add(line); }
else if (line.Contains(";V50;")) { V50.Add(line); }
else if (line.Contains(";S12;")) { S12.Add(line); }
else if (line.Contains(";S14;")) { S14.Add(line); }
else if (line.Contains(";S18;")) { S18.Add(line); }
else if (line.Contains(";S40;")) { S40.Add(line); }
if (line.Contains(";S;")) { S.Add(line); }
}
listBox1.DataSource = V12;
listBox2.DataSource = V50;
listBox3.DataSource = V;
listBox4.DataSource = S;
listBox5.DataSource = S18;
listBox6.DataSource = S40;
}
}
您的 StreamReader 位于 SORTER() 方法的 using 块中。这意味着在该块结束后,将释放 StreamReader。当您尝试在 DoStuff() 方法中重用同一个 StreamReader 时,您将收到您描述的错误,因为 StreamReader 不再处于可读取状态。
您可以在每个方法中将它们创建为局部变量,而不是为您的 StreamReader 使用全局变量。
不要在您的表单定义中执行此操作:
public StreamReader sr = new StreamReader(@"C:\Users\Oscar\Desktop\result.txt");
当您的表单创建并保持打开状态时,它会打开您的文件一次。如果您遇到 IO 错误,这样做可能会阻止或崩溃您的应用程序,并且通常会导致“文件正在使用”错误。您应该仅在实际需要使用文件时才打开文件,然后立即将其关闭。无论你在哪里:
using (sr)
你应该这样做:
using (var sr = new StreamReader(@"C:\Users\Oscar\Desktop\result.txt"))
实际上,你应该这样做:
using (var sr = new StreamReader(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "result.txt")))