c# StreamWriter skriver inte allt till fil (Solved)

Permalänk

c# StreamWriter skriver inte allt till fil (Solved)

Hej! Har en uppgift: Skriv ett litet program som en Console Application eller en Windows Forms Application som
läser in uppgifter för ett antal säljare i en säljkår. Om du skriver en Console Application, så
kan du låta användaren mata in hur många säljare han vill registrera.
Indata till programmet är de uppgifter om säljare som matas in. När man läst in alla säljare ska resultatet sorteras innan det skrivs ut. Sorteringen sker på antal sålda artiklar.

Jag ska även skriva resultatet till en fil. Jag har valt att använda mig av StreamWriter. Jag har börjat på detta. Problemet är att det är bara en säljare som skrivs ut till filen. Dvs. matar jag in flera säljare så är det bara den sista säljaren som skrivs till filen. Hur löser man detta?

EDIT (Solved):
Har nu löst så att den skriver in alla säljare jag har matat in och skriver inte bara över. Ändrat till append: true.

using StreamWriter sw = new StreamWriter("Saljkar.txt", true);

Kod nedan:

using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; // Variablerna för klassen "saljare" public class Saljare { public string namn; public string personnummer; public string distrikt; public int antalartiklar; public Saljare(string namn, string personnummer, string distrikt, int antalartiklar) { this.namn = namn; this.personnummer = personnummer; this.distrikt = distrikt; this.antalartiklar = antalartiklar; } } public class Program { // Detta printas i slutet av programmet när den visar hur många säljare som ligger på de olika nivåerna. static void PrintSalesSorted(int level, IEnumerable<Saljare> salespersons) { if (!salespersons.Any()) { return; } Console.WriteLine("-----------------------------"); Console.WriteLine($"Antal Säljare på nivå {level}: {salespersons.Count()}"); Console.WriteLine(""); // Detta printas också i slutet när man lagt in alla säljarna. Det sorteras och skrivs i console baserat på antalet sälj. foreach (var p in salespersons.OrderBy(n => n.antalartiklar)) { Console.WriteLine("Namn: " + p.namn); Console.WriteLine("Personnummer: " + p.personnummer); Console.WriteLine("Distrikt: " + p.distrikt); Console.WriteLine("Antal sälj: " + p.antalartiklar); Console.WriteLine("Sälj nivå: " + level); Console.WriteLine("-----------------------------"); } // Reslutat skrivs till fil "Saljkar.txt". using StreamWriter sw = new StreamWriter(@Saljkar.txt); sw.WriteLine("-----------------------------"); sw.WriteLine($"Antal Säljare på nivå {level}: {salespersons.Count()}"); sw.WriteLine(""); foreach (var p in salespersons.OrderBy(n => n.antalartiklar)) { sw.WriteLine("Namn: " + p.namn); sw.WriteLine("Personnummer: " + p.personnummer); sw.WriteLine("Distrikt: " + p.distrikt); sw.WriteLine("Antal sälj: " + p.antalartiklar); sw.WriteLine("Sälj nivå: " + level); sw.WriteLine("-----------------------------"); } sw.Flush(); sw.Close(); } // Början av koden som visas i console. static void Main(string[] args) { Console.WriteLine("Klass för säljare och resultat: "); Console.WriteLine("-------------------------------------"); Console.Write("Ange antal säljare som ska registreras: "); int num = int.Parse(Console.ReadLine() ?? "0"); List<Saljare> salesmen = new List<Saljare>(); // En for loop som loopas antalet gånger som man valt att registrera säljare. Här skriver man in infon om säljarna lägger in. for (int i = 0; i < num; i++) { Console.WriteLine(); Console.Write("Ange information för säljare " + (i + 1)); Console.WriteLine(); Console.WriteLine(); Console.Write("Ange Namn: "); var name = Console.ReadLine() ?? ""; Console.Write("Ange Personnummer: "); var pnr = Console.ReadLine() ?? ""; Console.Write("Ange Distrikt: "); var district = Console.ReadLine() ?? ""; Console.Write("Ange antal Artiklar: "); var antalArtiklar = int.Parse(Console.ReadLine() ?? "0"); Console.WriteLine(); var saljare = new Saljare(name, pnr, district, antalArtiklar); salesmen.Add(saljare); } // De olika nivåerna för säljarna baserat på antalet artiklar. Här sorteras det också efter antalet sälj. var level1 = salesmen.Where(n => n.antalartiklar < 50); PrintSalesSorted(1, level1); var level2 = salesmen.Where(n => n.antalartiklar >= 50 && n.antalartiklar < 100); PrintSalesSorted(2, level2); var level3 = salesmen.Where(n => n.antalartiklar >= 100 && n.antalartiklar < 200); PrintSalesSorted(3, level3); var level4 = salesmen.Where(n => n.antalartiklar > 200); PrintSalesSorted(4, level4); Console.ReadLine(); } }

Solved
Permalänk
Medlem

Det vanliga beteendet för StreamWriter är att skriva över filen om den existerar, så eftersom du alltid skriver till samma fil så kommer endast det sista anropet till PrintSalesSorted att hamna i filen till slut. Så gissningsvis matar du bara in en säljare som sålt mer än 200 artiklar.

Om du istället vill lägga till mer text i en fil så kan du använda StreamWriter(String, Boolean)-konstruktorn istället.

Permalänk
Medlem

När jag byter ut @Saljkar.txt (vet inte hur du fick det att bygga?) till "Saljkar.txt" så fungerar det på det sätt jag antar att det är tänkt att göra.

Visa signatur

The power of GNU compiles you!
"Often statistics are used as a drunken man uses lampposts -- for support rather than illumination."

Permalänk
Skrivet av perost:

Det vanliga beteendet för StreamWriter är att skriva över filen om den existerar, så eftersom du alltid skriver till samma fil så kommer endast det sista anropet till PrintSalesSorted att hamna i filen till slut. Så gissningsvis matar du bara in en säljare som sålt mer än 200 artiklar.

Om du istället vill lägga till mer text i en fil så kan du använda StreamWriter(String, Boolean)-konstruktorn istället.

Har lyckats lösa det nu. Ändrade till append: true