我试图从.txt读取文件,该文件是几个数字。但是当我运行该程序时,我得到的输入字符串格式不正确。我使用解析将所有内容传递给整数。我错过了什么?
private void button1_Click(object sender, EventArgs e)
{
try
{
const int Size = 10;
int[] numbers = new int[Size];
int index = 0;
StreamReader inputFile;
inputFile = File.OpenText("Sales.txt");
while(index < numbers.Length && !inputFile.EndOfStream)
{
numbers[index] = int.Parse(inputFile.ReadLine());
index++;
}
inputFile.Close();
foreach( int value in numbers)
{
listBox1.Items.Add(value);
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
答案 0 :(得分:1)
这是由于您的输入文件由double
组成,而不是int
s。如果您不想丢失小数点后的数字,则必须将任何非整数存储为double
或float
。请尝试以下代码。
private void button1_Click(object sender, EventArgs e)
{
try
{
const int Size = 10;
double[] numbers = new double[Size];
int index = 0;
StreamReader inputFile;
inputFile = File.OpenText("Sales.txt");
while(index < numbers.Length && !inputFile.EndOfStream)
{
numbers[index] = double.Parse(inputFile.ReadLine());
index++;
}
inputFile.Close();
foreach(double value in numbers)
{
listBox1.Items.Add(value);
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
但是,问题可能还在于您的数据不是由行分隔,而是由空格分隔。根据你的评论,情况可能就是这样。要解决此问题,您可以使用以下代码。
private void button1_Click(object sender, EventArgs e)
{
try
{
foreach (double value in File.ReadAllText("Sales.txt").Split(' ').Select((x) => (double.Parse(x))))
{
listBox1.Items.Add(value);
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
此解决方案的作用是ReadAllText
来自文件,它自动处理文件的流,打开和关闭。我将其传递给Split
函数,该函数将单个String
拆分为找到参数的子字符串。因此,如果您123.613 7342.152
为String
,则会返回String[]
和123.613
7342.152
。但是,这些值仍为String
秒。我们仍然需要将它们解析为数字。我们可以通过使用LINQ Select
运算符并将其传递给lambda来执行此操作,该lambda将对值调用double.Parse(...)
并将其作为IEnumerable<double>
返回。