Как я могу отобразить имя студента и его среднюю оценку на консоли из текстового файла? - PullRequest
0 голосов
/ 10 июля 2019

Я новичок в C # кодировании, я изучаю .NET FullStack, и у меня есть вопрос о чтении / записи с файлами. У меня есть текстовый файл, который состоит из 3 строк, и каждая строка имеет следующий формат: Имя, Фамилия, День рождения, Месяц рождения, Год рождения, Флаг, класс 1, [больше классов], Флаг, расстояние в километрах от университета до отделения студентов.

Данные выглядят так:

---------------------------------------------------------------
| Yossi,Ben David,21,6,1990,FF,80,70,75,80,FF,100             |
---------------------------------------------------------------
| Dany,Avigdor,18,4,1995,FF,70,65,50,FF,30                    |
---------------------------------------------------------------
| Yael,ShemTov,4,9,1997,FF,85,75,90,80,85,FF,100              |
---------------------------------------------------------------

Мне нужно вывести на консоль имя и среднюю оценку учеников, но я получаю исключение, я не знаю почему.

Спасибо за ответы.

Вот мой код:

static void Main(string[] args)
{
         try
            {
                string path = @"C:\Users\coral\Desktop\c#\.net course\StudentInfo.txt";
                if (File.Exists(path))
                {

                    using (StreamReader st = File.OpenText(path))
                    {
                        string k;
                        List<int> grade = new List<int>();
                        double avg;

                        while ((k = st.ReadLine()) != null)
                        {
                            string[] words = k.Split(',');
                            foreach (var word in words)
                            {
                                while (word.StartsWith("FF") && word.EndsWith("FF"))
                                //if (word.StartsWith("FF") && word.EndsWith("FF"))
                                {
                                    grade.Add(int.Parse(word));
                                    //intList= int.Parse(num[word]);
                                }

                            }

                        }
                        int[] terms = grade.ToArray();
                        avg = terms.Average();
                        Console.WriteLine(avg);
                        Console.ReadKey();
                    }

                }

            }
            catch (Exception e)
            {
                Console.WriteLine("Error:" + e.ToString());
                Console.ReadKey();
            }
}

Сообщение об ошибке:

Error:System.FormatException: System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) in System.Int32.Parse(String s) in FileExercise.Program.Main(String[] args) in C:\Users\coral\source\repos\FileExercise\FileExercise\Program.cs: 111 line

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Проблема в том, что оценки также делятся на ,. Таким образом, вы должны анализировать только оценки после первого FF и до второго FF

//while ((k = st.ReadLine()) != null)
bool started = false;
foreach(var word in words){
    if(started && word == "FF")
    {
        break;
    }
    if(started)
    {
        grade.Add(int.Parse(word));
    }
    if(word == "FF")
    {
        started = true;
    }
}
0 голосов
/ 10 июля 2019

Ваша проблема здесь:

while (word.StartsWith("FF") && word.EndsWith("FF"))
                            {
                                grade.Add(int.Parse(word));
                            }

Первая строка гарантирует, что word начинается и заканчивается FF, но затем вы вызываете int.Parse, что приведет к ошибке, если текстне число.

Вы можете попробовать что-то вроде:

int temp;
if (int.TryParse(word, out temp)) grade.Add(temp);

Это проверит, можно ли проанализировать word.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...