Co zrobić by przy wykonaniu petli nie nadpisywało.

0

Witam mam utworzona metodę służąca do zapisywania nazwisk z listy do pliku. Jednak przy każdym wykonaniu pętli nazwisko kolejnej osoby jest nadpisywane.

void dodaj()
            {
                Console.WriteLine("Podaj ile nazwisk chcesz wpisac do listy");


                List<string> listastringow = new List<string>();
                string n = Console.ReadLine();
                int ile = Convert.ToInt32(n);
                
                for (int i = 0; i < ile; i++)
                {
                    Console.WriteLine("Podaj " + (i + 1) + " nazwisko");
                    string imie = Console.ReadLine();
                    listastringow.Add(imie)
                    //File.WriteAllText(@"g:\nazwiska.txt", imie);
                    
                }
           

            }


Niby jakieś rozwiązanie mi się nasuwa, tylko jestem nowicjuszem i nie za bardzo wiem jak to zrobić.
Otóż myślę, że dało by się to zrobić za pomocą zapisywania listy do tablicy a z tego już łatwo iteracyjne.

Jednak może da się to zrobić łatwiej?

1

Nie siedzę w C# ale na pierwszy rzut oka metoda File.WriteAllText nadpisuje / tworzy nowy plik za każdym użyciem, potwierdza to zresztą dokumentacja od M$: https://docs.microsoft.com/pl-pl/dotnet/api/system.io.file.writealltext?view=netframework-4.8

Zamiast tego otwórz plik w trybie Append - najlepiej przed pętlą, by nie otwierać go 100 razy - i dopisuj do zwróconego FileStream:
https://docs.microsoft.com/pl-pl/dotnet/api/system.io.file.open?view=netframework-4.8
https://docs.microsoft.com/pl-pl/dotnet/api/system.io.filemode?view=netframework-4.8

Ewentualnie, jeśli wolisz zostać przy File.WriteAllText, możesz najpierw zbudować sobie listę tych imion, z tego zbudować pożądany tekst np. jakimś StringBuilderem z nowymi liniami czy innymi przerywnikami, i wszystko zapisać do pliku za jednym zamachem - tylko wtedy nadal będzie nadpisywać plik przy kolejnych uruchomieniach.

0
superdurszlak napisał(a):

Nie siedzę w C# ale na pierwszy rzut oka metoda File.WriteAllText nadpisuje / tworzy nowy plik za każdym użyciem, potwierdza to zresztą dokumentacja od M$: https://docs.microsoft.com/pl-pl/dotnet/api/system.io.file.writealltext?view=netframework-4.8

Zamiast tego otwórz plik w trybie Append - najlepiej przed pętlą, by nie otwierać go 100 razy - i dopisuj do zwróconego FileStream:
https://docs.microsoft.com/pl-pl/dotnet/api/system.io.file.open?view=netframework-4.8
https://docs.microsoft.com/pl-pl/dotnet/api/system.io.filemode?view=netframework-4.8

Ewentualnie, jeśli wolisz zostać przy File.WriteAllText, możesz najpierw zbudować sobie listę tych imion, z tego zbudować pożądany tekst np. jakimś StringBuilderem z nowymi liniami czy innymi przerywnikami, i wszystko zapisać do pliku za jednym zamachem - tylko wtedy nadal będzie nadpisywać plik przy kolejnych uruchomieniach.

Dzięki zaraz się z tym pobawie

0

Czyli po prostu po każdym wykonaniu pętli mam zwracać FileStream? Dobrze rozumiem?

Nope. Potrzebujesz zrobić jedną z dwóch rzeczy:

  • otworzyć plik przed pętlą w trybie albo nadpisywania, albo dopisywania (append) - dostaniesz jeden obiekt FileStream do zapisu - i w każdym kroku pętli dorzucać do niego kolejne dane, a po wyjściu z pętli zamknąć plik, stream czy jak to tam robią w tych dotnetach
  • zbudować w pętli komplet danych do zapisu (czy to jako listę, czy jako gotowy tekst), z tego zbudować tekst do zapisu jeśli potrzebujesz jeszcze jakoś to obrobić, i po zakończeniu pętli wrzucić całość za jednym razem do streama i zamknąć plik.
0

Tam wyżej już @superdurszlak Ci podpowiedział jak to rozwiązać to nadpisywanie, natomiast mała wskazówka:

string n = Console.ReadLine();
int ile = Convert.ToInt32(n);

zamień na

int ile = Convert.ToInt32(Console.ReadLine());
0

Zamiast tego

string n = Console.ReadLine();
int ile = Convert.ToInt32(n);

Warto jest sprawdzić czy ktoś wpisał coś co da się zamienić na int.
Poza tym obsługę pliku lubię robić tak:

if (int.TryParse(Console.ReadLine(), out int ile))
{
    // Twój kod z obsługą pliku
    using (StreamWriter fs = new StreamWriter("nazwiska.txt", true))
    {
                    
        for (int i = 0; i < ile; i++)
        {
            fs.WriteLine($"liczba {i}");
        }
    }
}
else
{
    // podano coś co nie jest liczbą
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1