لماذا هذا الملف ليس في الواقع الكتابة إلى القرص ؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

مرحبا شباب كما في الواجب علي كتابة برنامج قراءة من ملف الذي يحتوي على التالي:

توتو ، م ، 50

فيفي, F, 60

سوسو, F, 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() بعد الانتهاء من كتابة المواد.

نصائح أخرى

إجابات أخرى نتحدث عن الاتصال الوثيق صراحة - أود أن أقترح أنه بدلا من ذلك ، يمكنك التفاف استخدام StreamWriter (و StreamReader والجداول) في 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(إخراج[i]); وتنفيذ SW.Close();
أعتقد العازلة لا تفرغ حتى تتصل Close();

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top