读取带有数字的文件的程序

本文关键字:文件 程序 数字 读取 | 更新日期: 2024-10-23 02:01:53

我正在编写一个程序,读取带有车型和油耗的文件。

在文件中,我有像A|12.45这样的车,其中A代表型号,数字代表每100公里的油耗。每辆车都有自己的路线。

文件如下:

A|8.11

B|14.38

C | 13.05

在这里,我们可以看到B的消耗最高,但当我在控制台中运行该程序时,它显示为1438L,中间没有点在中间。我该怎么解决这个问题?

我有一个代码,看起来像这样:

    static void Main(string[] args)
    {
        StreamReader readF = File.OpenText(@"D:'CarList.txt");
        string line = readF.ReadLine();
        double highest = 0;
        double lowest = 300;
        string nameHighest= "";
        string nameLowest= "";
        while (line != null)
        {
            string[] temp = line.Split('|');

            if (Convert.ToDouble(temp[1]) > highest)
            {
                highest= Convert.ToDouble(temp[1]);
                nameHighest = temp[0];
            }

            if (Convert.ToDouble(temp[1]) < lowest)
            {
                lowest = Convert.ToDouble(temp[1]);
                nameLowest = temp[0];
            }
            line = readF.ReadLine();
        }
        readF.Close();

        Console.WriteLine("Highest consumption: " + nameHighest + ". It consumes " + highest + " L per 100Km.");
        Console.WriteLine("Lowest consumption " + nameLowest + ". It consumes " + lowest + " L per 100Km");
        Console.ReadKey();
    }

谢谢!

读取带有数字的文件的程序

我强烈怀疑这是因为您机器上的默认区域性是使用,而不是.作为小数分隔符的区域性。您可以使用double.Parse并指定CultureInfo.InvariantCulture来使用不变区域性对其进行解析,确实使用.作为分隔符。

实际上,我会分几个步骤重写您的代码。

步骤1:使用double.Parse,每行只使用一次-同样,每行提取一次temp[0]

步骤2:使用double.NegativeInfinity作为初始"最高",使用double.PositiveInfinity作为初始"最低",这样任何有限条目都将注册。

第三步:在末尾使用一个格式字符串。使用C#6,我们可以使用字符串插值,但至少我们可以使它比以前更简单。

步骤4:使用File.ReadLines而不是"手动"读取

在这一点上,我们有:

using System;
using System.Globalization;
using System.IO;
class Test
{
    static void Main(string[] args)
    {
        double highest = double.NegativeInfinity;
        double lowest = double.PositiveInfinity;
        string nameHighest= "";
        string nameLowest= "";
        foreach (var line in File.ReadLines("test.txt"))
        {
            string[] temp = line.Split('|');
            string name = temp[0];
            double consumption = double.Parse(
                temp[1],
                CultureInfo.InvariantCulture);
            if (consumption > highest)
            {
                highest = consumption;
                nameHighest = name;
            }
            if (consumption < lowest)
            {
                lowest = consumption;
                nameLowest = name;
            }
        }
        Console.WriteLine(
            "Highest consumption: {0}. It conumes {1}L per 100km",
            nameHighest, highest);
        Console.WriteLine(
            "Lowest consumption: {0}. It conumes {1}L per 100km",
            nameLowest, lowest);
    }
}

步骤5:使用LINQ将数据的读取和解析与使用数据区分开来——尽管我将所有内容都存储在一个列表中,这样我们就可以在一分钟内完成两次。。。

using System;
using System.Globalization;
using System.IO;
using System.Linq;
class Test
{
    static void Main(string[] args)
    {
        var cars = File.ReadLines("test.txt")
            .Select(line => line.Split('|'))
            .Select(bits => new { Name = bits[0], Consumption = double.Parse(bits[1]) })
            .ToList();
        if (cars.Count == 0)
        {
            Console.WriteLine("No cars!");
            return;
        }
        var highest = cars[0];
        var lowest = cars[0];
        foreach (var car in cars.Skip(1))
        {
            if (car.Consumption > highest.Consumption)
            {
                highest = car;
            }
            if (car.Consumption < lowest.Consumption)
            {
                lowest = car;
            }
        }
        Console.WriteLine(
            "Highest consumption: {0}. It consumes {1}L per 100km",
            highest.Name, highest.Consumption);
        Console.WriteLine(
            "Lowest consumption: {0}. It consumes {1}L per 100km",
            lowest.Name, lowest.Consumption);
    }
}

步骤6:使用MoreLINQ的MinByMaxBy使其变得非常简单:

using MoreLinq;
using System;
using System.Globalization;
using System.IO;
using System.Linq;
class Test
{
    static void Main(string[] args)
    {
        var cars = File.ReadLines("test.txt")
            .Select(line => line.Split('|'))
            .Select(bits => new { Name = bits[0], Consumption = double.Parse(bits[1]) })
            .ToList();
        if (cars.Count == 0)
        {
            Console.WriteLine("No cars!");
            return;
        }
        var highest = cars.MaxBy(c => c.Consumption);
        var lowest = cars.MinBy(c => c.Consumption);
        Console.WriteLine(
            "Highest consumption: {0}. It consumes {1}L per 100km",
            highest.Name, highest.Consumption);
        Console.WriteLine(
            "Lowest consumption: {0}. It consumes {1}L per 100km",
            lowest.Name, lowest.Consumption);
    }
}