简单文件I / O - 读取新行

时间:2009-11-09 19:14:45

标签: c# file-io

我有一个文件存储一类学生的考试成绩。我正在尝试编写一个程序,该程序可以成功打开文件,读取考试分数,找到平均分数,最高分数和最低分数,并打印出来。平均分数应在小数点后打印2位数。

这是我到目前为止所做的:

static void Main()
{
    string myData = "";
    int temp = 0;
    int max = 0;
    int min = 0;
    double average = 0;
    StreamReader fileReader = new StreamReader("data.txt");

    do
    {
        myData = fileReader.ReadLine();

        if (myData != null)
        {
            max = int.Parse(myData);
            temp = int.Parse(myData);

            if (temp > max)
                temp = max;
        }

    } while (myData != null);

    fileReader.Close();
    Console.ReadLine();
}//End Main()

我不知道如何继续。如何读取新行并将其分配给temp?我认为我做得不对。

9 个答案:

答案 0 :(得分:7)

这是让你老师伤心的一种方式:P

static void Main(string[] args)
{
    var file = new StreamReader("scores.txt");
    var split = file.ReadToEnd().Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);            

    IEnumerable<int> ints = split.Select(x => int.Parse(x));

    Console.WriteLine("Total Scores:" + ints.Count());
    Console.WriteLine("Max:" + ints.Max());
    Console.WriteLine("Min:" + ints.Min());
    Console.WriteLine("Average:" + ints.Average().ToString("0.00"));
    Console.ReadLine();
}

虽然这在技术上是正确的,但这对于理解算法(无论它们可能是什么)都是适得其反的,我建议你看看其他答案。但这证明了.NET框架的多功能性。

&lt; 3 LINQ

答案 1 :(得分:4)

我发现的第一个错误是max始终与temp完全相同,因为您为它们分配了相同的值,因此if永远不会成立:

max = int.Parse(myData);
temp = int.Parse(myData);

if (temp > max)

答案 2 :(得分:2)

不错。这是一些伪代码:

  1. File.ReadAllLines 获取字符串数组(调用此行)
  2. 行中的Foreach行
    1. 解析double(?每行保证为int?)
    2. 如果max&lt;解析,max =解析
    3. if min&gt;解析,min =解析
    4. sum + =已解析
  3. 打印出min,max,(sum / lines.count).ToString(“000.00”)
  4. 假设文件如下:

    25
    12个
    33.5
    100个
    75个
    ...

答案 3 :(得分:1)

对于初学者,你需要摆脱“max = int.Parse(myData)”这一行。否则,您将使用当前值继续覆盖max。

答案 4 :(得分:1)

由于这是家庭作业,我只会给你一些线索。

现在,每次循环都会设置“max”。尝试只设置temp,看看会发生什么。您可能希望将默认值(在创建时)默认为非常小的数字而不是0。

此外,你需要为“min”做类似的事情,但默认为非常大的数字。

int max = int.MinValue;
int min = int.MaxValue;

为了获得平均值,您需要有一笔金额和一个计数,并跟踪它们。然后,最后,使用double计算平均值,然后打印。要得到2个小数位,你可以使用平均值。ToString(“N”) - “N”格式的格式很好,默认为2位小数。

答案 5 :(得分:1)

你如何分离出这些流程?执行读取并使用文件内容填充整数列表。然后执行最小/最大和平均处理。

隔离问题有助于您专注于它们。我喜欢称这种降噪。作为一个承包商,我开始处理大量杂乱的代码,其中一个难以理解的原因是同时发生的事情太多了。如果你简化了什么,那么代码几乎会自行编写。这也称为关注点分离。这是一个非常重要的编程原则。

在您分离问题并使代码工作之后,您可以尝试将它们全部放在一起以便更有效(如果您使用文件读取进行内联,那么您将只在内存中保留一行一次)。

答案 6 :(得分:1)

我认为这是你作业的一般要点。你应该谨慎复制这段代码。

double count = 0.0;
double min = double.MaxValue;
double max = double.MinValue;
double total = 0.0;
using(StreamReader sr = new StreamReader(@"c:\data.txt"))
{
    while (!sr.EndOfStream)
    {
        String line = sr.ReadLine();
        double value = double.Parse(line.Trim());
        if (value < min) min = value;
        if (value > max) max = value;
        total += value;
        count++;
    }
}

Console.WriteLine("Min: {0}", min);
Console.WriteLine("Max: {0}", max);
Console.WriteLine("Avg: {0}", (total / count).ToString("0.00"));
Console.ReadLine();

答案 7 :(得分:0)

static void Main(string[] args)
{
    const string filename = @"data.txt";
    bool first = true;
    int min=0, max=0, total=0;

    var lines = File.ReadAllLines(filename);

    foreach (var line in lines)
    {
        var score = int.Parse(line.Trim());
        if (first)
        {
            min = max = total = score;
            first = false;
            continue;
        }
        if (score < min)
            min = score;
        if (score > max)
            max = score;
        total += score;
    }

    if (first)
    {
        Console.WriteLine("no input");
        return;
    }

    var average = (double)total/lines.Length;
    Console.WriteLine(string.Format("Min: {0}, Max: {1}, Average: {2:F2}", min, max, average));
}

答案 8 :(得分:0)

嘿谢谢所有帮助过并提出建议的人,这是我的最终代码实现(不使用数组)

using System;
using System.IO;

class Program
{
static void Main()
{
    string line = "";
    int value = 0;
    int max = 0;
    int min = 100;
    int total = 0;
    double count = 0.0;
    double average = 0;

    StreamReader fileReader = new StreamReader(@"data.txt");

    do
    {
        line = fileReader.ReadLine();

        if (line != null)
        {
            value = int.Parse(line);

            if (value > max)
                max = value;

            if (value < min)
                min = value;

            total += value;
            count++;
        } 
    } while (line != null);

    average = total / count;

    Console.WriteLine("Max: {0}", max);
    Console.WriteLine("Min: {0}", min);
    Console.WriteLine("Avg: {0:f2}", average); 

    Console.ReadLine();
}//End Main()
}//End class Program