Warum ist diese Datei nicht tatsächlich auf der Festplatte?
Frage
Hallo Jungs als Hausaufgaben muß ich ein Programm schreiben, das aus einer Datei zu lesen, die die Folowing enthalten:
toto, M, 50
Fifi, F, 60
soso, F, 70
lolo, M, 60
Fifi, F, 60
und dann finden die folgenden: Welche Marke ist am meisten wiederholt und wie oft ist es wiederholt
avgerage alle Schüler
avgerage aller männlichen
avgerage alle weiblichen
Wie viele sind unter avgerage Zeichen
, wie viele mehr als avgerage Marke
und Reverse
, wie viele Schüler die Namen mit T beginnen und mit T in einer Datei anzeigen
(alle Ergebnisse sollten in einer Out-Datei abgelegt werden)
Ich habe alles ohne Fehler gemacht, aber es ist nicht auf die Datei schreiben kann jemand mir sagen, warum und bitte ich möchte nicht irgendwelche neuen Methoden wie (LINQ und andere Voraus Sachen) verwenden,
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);
}
}
}
Danke im Voraus
Lösung
Ich habe es bisher nicht testen. Aber Sie sollten SW.close()
nach fertigem Schreiben stopft nennen.
Andere Tipps
Die anderen Antworten sprechen über Aufruf explizit schließen -. Ich würde vorschlagen, dass anstatt das zu tun, können Sie die Verwendung der Stream wickeln (und Stream und Ströme) in einer using
Anweisung, z
using (StreamWriter SW = new StreamWriter(FS))
{
for (int i = 0; i < Output.Length; i++)
{
SW.WriteLine(Output[i]);
}
}
Dies ruft Dispose
automatisch, was die entsprechende Ressource schließt. nur am Ende des Verfahrens ist anfällig für Ausnahmen manuell Close
Aufrufs -. Sie würden normalerweise in einem finally
Block setzen wollen, aber das ist, was die using
Anweisung automatisch funktioniert
Im Writefile Verfahren nach SW.WriteLine (Output [i]) ;, ausführen SW.Close ();
Ich glaube, dass der Puffer nicht leer ist, bis Sie auf Schließen () aufrufen;