이 파일이 실제로 디스크에 쓰지 않는 이유는 무엇입니까?

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

  •  03-07-2019
  •  | 
  •  

문제

안녕하세요 숙제로서 나는 폴링을 포함하는 파일에서 읽은 프로그램을 작성해야합니다.

Toto, M, 50

FIFI, F, 60

소소, F, 70

Lolo, M, 60

FIFI, F, 60


그런 다음 다음을 찾으십시오. 어떤 마크가 가장 많이 반복되고 몇 번 반복됩니까?

모든 학생들

Avgerage All Male

Avgerage 모든 여성

Avgerage 마크 아래는 몇 명입니까?

Avgerage Mark 이상의 것

그리고 반전

얼마나 많은 학생들의 이름이 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에 전화하는 것에 대한 이야기입니다. 그렇게하는 대신 스트림 라이터 (및 스트림 리더 및 스트림)의 사용을 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