从文件中读取,输入字符串不正确C#

时间:2016-04-04 23:02:24

标签: c#

我试图从.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);
        }
    }
}

}

1 个答案:

答案 0 :(得分:1)

这是由于您的输入文件由double组成,而不是int s。如果您不想丢失小数点后的数字,则必须将任何非整数存储为doublefloat。请尝试以下代码。

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.152String,则会返回String[]123.613 7342.152。但是,这些值仍为String秒。我们仍然需要将它们解析为数字。我们可以通过使用LINQ Select运算符并将其传递给lambda来执行此操作,该lambda将对值调用double.Parse(...)并将其作为IEnumerable<double>返回。