Perché questo file non sta scrivendo sul disco?
Domanda
Ciao ragazzi come compiti a casa, devo scrivere un programma che legge da un file che contiene il folowing:
toto, M, 50
fifi, F, 60
soso, F, 70
lolo, M, 60
fifi, F, 60
e quindi trova quanto segue: Quale segno viene più ripetuto e quante volte viene ripetuto
media tutti gli studenti
avgerage all male
media tutta femminile
quanti sono al di sotto del segno della media
quanti più di un marchio di media
e viceversa
quanti nomi di studenti iniziano con T e finiscono con T in un file
(tutti i risultati devono essere inseriti in un file out)
Ho fatto tutto senza errori, ma non scrivendo sul file qualcuno può dirmi perché e per favore non voglio usare alcun nuovo metodo come (LINQ e altre cose avanzate)
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);
}
}
}
Grazie in anticipo
Soluzione
Non l'ho provato. Ma dovresti chiamare SW.close ()
dopo aver finito di scrivere cose.
Altri suggerimenti
Le altre risposte parlano di chiamare esplicitamente Chiudi - Suggerirei invece di farlo, azzerando l'uso di StreamWriter (e StreamReader e stream) in un'istruzione usando
, ad es.
using (StreamWriter SW = new StreamWriter(FS))
{
for (int i = 0; i < Output.Length; i++)
{
SW.WriteLine(Output[i]);
}
}
Questo chiamerà Dispose
automaticamente, il che chiuderà la risorsa appropriata. Chiamare manualmente Close
proprio alla fine del metodo è vulnerabile alle eccezioni - normalmente si vorrebbe metterlo in un blocco finalmente
, ma questo è ciò che utilizza
viene eseguita automaticamente.
Nel metodo WriteFile, dopo SW.WriteLine (Output [i]) ;, esegui SW.Close ();
Credo che il buffer non venga svuotato fino a quando non si chiama Close ();