Question

Salut les gars, je dois écrire un programme qui lit dans un fichier contenant les informations suivantes:

toto, M, 50

fifi, f, 60

soso, F, 70

lolo, M, 60

fifi, f, 60

puis trouvez ce qui suit: Quelle marque est la plus répétée et combien de fois est-elle répétée

avger tous les étudiants

avger tous les hommes

avger toutes les femmes

combien sont en dessous de la marque moyenne

combien de plus que la marque moyenne

et inverser

combien de noms d'étudiants commencent par T et se terminent par T dans un fichier

(tous les résultats doivent être placés dans un fichier de sortie)

J'ai tout fait sans erreur, mais ce n'est pas écrit dans le fichier, quelqu'un peut-il me dire pourquoi et s'il vous plaît je ne veux pas utiliser de nouvelles méthodes comme (LINQ et autres trucs à l'avance)

    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);
        }
    }
}

Merci d'avance

Était-ce utile?

La solution

Je ne l'ai pas testé. Mais vous devriez appeler SW.close () une fois l’écriture terminée.

Autres conseils

Les autres réponses parlent de l'appel explicite de Close - je suggérerais qu'au lieu de le faire, vous encapsulez l'utilisation de StreamWriter (et StreamReader et des flux) dans une instruction utilisant , par exemple

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

Ceci appellera Dispose automatiquement, ce qui fermera la ressource appropriée. Appeler manuellement Close juste à la fin de la méthode est vulnérable aux exceptions - vous voudriez normalement le placer dans un bloc finally , mais c'est ce que utilise instruction fait automatiquement.

Dans la méthode WriteFile, après SW.WriteLine (Output [i]) ;, exécutez SW.Close ();
Je crois que le tampon n'est pas vidé jusqu'à ce que vous appeliez Close ();

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top