Почему этот файл на самом деле не записывается на диск?

StackOverflow https://stackoverflow.com/questions/400861

  •  03-07-2019
  •  | 
  •  

Вопрос

Привет, ребята, в качестве домашнего задания я должен написать программу, которая считывает данные из файла, содержащего следующее:

тотошка, М, 50

фифи, F, 60

сосо, Ф, 70

лоло, М, 60

фифи, F, 60


а затем найдите следующее:Какой знак чаще всего повторяется и сколько раз он повторяется

среднее значение для всех студентов

средний возраст всех мужчин

среднее значение для всех женщин

сколько из них ниже средней отметки

на сколько больше средней отметки

и наоборот

сколько имен студентов в файле начинаются на T и заканчиваются на T

(все результаты должны быть помещены в выходной файл)


Я сделал все это без ошибок, но это не записывается в файл, кто-нибудь может сказать мне, почему и, пожалуйста, я не хочу использовать какие-либо новые методы, такие как (LINQ и другие продвинутые материалы)

    using System;
using System.Collections.Generic;

using System.Text;
using System.IO;

namespace Exam_Ex
{
    class Program
    {
        public static int[] ReadFile(string FileName, out string[] Name, out char[] Gender)
        {
            Name = new string[1];
            int[] Mark = new int[1];
            Gender = new char[1];
            if (File.Exists(FileName))
            {
                FileStream Input = new FileStream(FileName, FileMode.Open, FileAccess.Read);
                StreamReader SR = new StreamReader(Input);
                string[] Current;
                int Counter = 0;
                string Str = SR.ReadLine();
                while (Str != null)
                {
                    Current = Str.Split(',');
                    Name[Counter] = Current[0];
                    Mark[Counter] = int.Parse(Current[2]);
                    Gender[Counter] = char.Parse(Current[1].ToUpper());
                    Counter++;
                    Array.Resize(ref Name, Counter + 1);
                    Array.Resize(ref Mark, Counter + 1);
                    Array.Resize(ref Gender, Counter + 1);
                    Str = SR.ReadLine();
                }
            }
            return Mark;
        }

        public static int MostFreq(int[] M, out int Frequency)
        {
            int Counter = 0;
            int Frequent = 0;
            Frequency = 0;
            for (int i = 0; i < M.Length; i++)
            {
                Counter = 0;
                for (int j = 0; j < M.Length; j++)
                    if (M[i] == M[j])
                        Counter++;
                if (Counter > Frequency)
                {
                    Frequency = Counter;
                    Frequent = M[i];
                }
            }
            return Frequent;
        }

        public static int Avg(int[] M)
        {
            int total = 0;
            for (int i = 0; i < M.Length; i++)
                total += M[i];
            return total / M.Length;
        }

        public static int AvgCond(char[] G, int[] M, char S)
        {
            int total = 0;
            int counter = 0;
            for (int i = 0; i < G.Length; i++)
                if (G[i] == S)
                {
                    total += M[i];
                    counter++;
                }
            return total / counter;
        }

        public static int BelowAvg(int[] M, out int AboveAvg)
        {
            int Bcounter = 0;
            AboveAvg = 0;
            for (int i = 0; i < M.Length; i++)
            {
                if (M[i] < Avg(M))
                    Bcounter++;
                else
                    AboveAvg++;
            }
            return Bcounter;
        }

        public static int CheckNames(string[] Name, char C)
        {
            C = char.Parse(C.ToString().ToLower());
            int counter = 0;
            string Str;
            for (int i = 0; i < Name.Length - 1; i++)
            {
                Str = Name[i].ToLower();
                if (Str[0] == C || Str[Str.Length - 1] == C)
                    counter++;
            }
            return counter;
        }

        public static void WriteFile(string FileName, string[] Output)
        {
            FileStream FS = new FileStream(FileName, FileMode.OpenOrCreate, FileAccess.Write);
            StreamWriter SW = new StreamWriter(FS);
            for (int i = 0; i < Output.Length; i++)
                SW.WriteLine(Output[i]);
        }

        static void Main(string[] args)
        {
            int[] Mark;
            char[] Gender;
            string[] Name;
            string[] Output = new string[8];
            int Frequent, Frequency, AvgAll, MaleAvg, FemaleAvg, BelowAverage, AboveAverage, NamesCheck;
            Mark = ReadFile("c:\\IUST1.txt", out Name, out Gender);
            Frequent = MostFreq(Mark, out Frequency);
            AvgAll = Avg(Mark);
            MaleAvg = AvgCond(Gender, Mark, 'M');
            FemaleAvg = AvgCond(Gender, Mark, 'F');
            BelowAverage = BelowAvg(Mark, out AboveAverage);
            NamesCheck = CheckNames(Name, 'T');
            Output[0] = "Frequent Mark = " + Frequent.ToString();
            Output[1] = "Frequency = " + Frequency.ToString();
            Output[2] = "Average Of All = " + AvgAll.ToString();
            Output[3] = "Average Of Males = " + MaleAvg.ToString();
            Output[4] = "Average Of Females = " + FemaleAvg.ToString();
            Output[5] = "Below Average = " + BelowAverage.ToString();
            Output[6] = "Above Average = " + AboveAverage.ToString();
            Output[7] = "Names With \"T\" = " + NamesCheck.ToString();
            WriteFile("d:\\output.txt", Output);
        }
    }
}

Заранее благодарю

Это было полезно?

Решение

Я еще не проверял это.Но ты должен позвонить SW.close() после того, как закончил писать материалы.

Другие советы

В других ответах говорится о явном вызове Close - я бы предположил, что вместо этого вы оборачиваете использование StreamWriter (и StreamReader, и streams) в using утверждение, например

using (StreamWriter SW = new StreamWriter(FS))
{
    for (int i = 0; i < Output.Length; i++)
    {
        SW.WriteLine(Output[i]);
    }
}

Это вызовет Dispose автоматически, что приведет к закрытию соответствующего ресурса.Вызов вручную Close только в конце метод уязвим для исключений - обычно вы хотели бы поместить его в finally блокировать, но это то, что using оператор выполняется автоматически.

В методе WriteFile, после SW.WriteLine(Output[i]);, выполните SW.Close();
Я полагаю, что буфер не будет опустошен до тех пор, пока вы не вызовете Close();

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top