Sumowanie liczb ze strumienia (StreamReader)

0

Witam. Potrzebuję napisać program korzystający ze strumieni. Mianowicie mam taki kodzik:

using System;
using System.IO;
using System.Text;
class Test
{
    public static void Main()
    {
        string path1 = @".\in.txt";
        //string path = @".\out.txt";
   
            using (StreamReader sr = new StreamReader(path1)) 
            {
                string line;
                while ((line = sr.ReadLine()) != null) 
                {
                    int liczba = System.Convert.ToInt32(line);
                    Console.WriteLine(liczba);
                }
            }

        Console.ReadKey();
    }
}

Wczytuję z pliku wejściowego dane, są to same liczby jedna pod drugą. Potrzebuję teraz je odpowiednio zsumować. Przykładowo, plik wejściowy ma takie liczby:

2
4
13
23

A plik wyjściowy powinien wyglądać tak:

2
6
19
42

Działa to jak silnia tyle, że jako suma, czyli pierwsza linijka to liczba pierwsza, druga linijka to liczba pierwsza + liczba druga itd. Jestem początkujący w programowaniu i nie wiem jak posługiwać się strumieniami. Potrzebuję tylko pomocy w stworzeniu tej sumy bo taki bajer jak zapisanie tego do pliku wyjściowego czy też wytworzenie argumentów do wywołania programu to zrobię. Ale nie mam pomysłu na sumę :/

0

Zadeklaruj sobie przed pętlą jakąś zmienną pomocniczą, w pętli po odczytaniu liczby dodaj ją do tej zmiennej, a następnie zapisz do pliku wyjściowego.
To chyba nie jest skomplikowane ;)

0

Faktycznie bardzo proste, aż głupio, że na to nie wpadłem ale cóż, tak bywa ;) Na dole cały programik, mały i nic nie robiący ale jest :P

using System;
using System.IO;
using System.Text;

class Test
{
    public static void Main()
    {
        string path_in = @".\in.txt";                    //ścieżka do pliku wczytywanego
        string path_out = @".\out.txt";                //ścieżka do pliku zapisywanego

        //string wczytuje = File.ReadAllText(path_in, Encoding.UTF8);     

            using (StreamReader sr = new StreamReader(path_in)) 
            {
                string line;
                int suma = 0;
                while ((line = sr.ReadLine()) != null) 
                {
                    int liczba = System.Convert.ToInt32(line);    //konwersja stringa na int
                    suma =suma + liczba;
                    string appendText = suma + Environment.NewLine;   //informacja dla programu co ma być dopisane
                    File.AppendAllText(path_out, appendText, Encoding.UTF8); //dodawanie nowych linijek do path_out
                }
            }
            Console.WriteLine("Program wykonał zamierzone operacje, wciśnij dowolny klawisz aby zakończyć.");
            Console.ReadKey();
    }
}
0

string appendText = suma + Environment.NewLine; //informacja dla programu co ma być dopisane
File.AppendAllText(path_out, appendText, Encoding.UTF8); //dodawanie nowych linijek do path_out
trochę głupio, utwórz również strumień wyjściowy i dopisuj po linii:

using (StreamReader sr = new StreamReader(path_in)) 
{
   using (StreamWriter wr = new StreamWriter(path_out))
   {
      //...
      wr.WriteLine(suma);
      //...
   }
}
0

Wielkie dzięki za poradę, program teraz wygląda bardziej przejrzyście. A tylko jeszcze jedno pytanie? Dlaczego głupio? Ma to większy wpływ na funkcjonowanie programu? Powiedzmy zasobożerność? Czy może tylko kwestia czytelności kodu?

0

Metoda File.AppendAllText za każdym razem otwiera plik, zapisuje nową linię oraz zamyka plik. Po co powtarzać operacje otwarcia i zamknięcia, jeśli możemy raz otworzyć i raz zamknąć? Celem każdego programisty powinno być zoptymalizowanie kodu wynikowego, a nie wykorzystanie pierwszej lepszej funkcji, którą się znalazło. Dla małej liczby linii w pliku źródłowym nie zobaczysz różnicy. Ale co się stanie jeśli plik zawiera ponad kilka tysięcy wpisów ?

0

Największy sens (w sensie wydajnościowym i operacji dyskowych) miałoby wczytanie całego pliku na raz do tablicy (File.ReadAllLines), przetworzenie jej i utworzenie tablicy z nowymi wartościami oraz zapis na raz do pliku (File.WriteAllLines).

0
somekind napisał(a)

Największy sens (w sensie wydajnościowym i operacji dyskowych) miałoby wczytanie całego pliku na raz do tablicy (File.ReadAllLines), przetworzenie jej i utworzenie tablicy z nowymi wartościami oraz zapis na raz do pliku (File.WriteAllLines).

Też tak uważam. Ale to przy założeniu, że plik nie będzie bardzo duży, bo wtedy zajęcie pamięci staje się większym problemem.

0

To wtedy można czytać pakietami, np. po parę MB. Ponoć najlepiej, aby taki pakiet miał rozmiar klastra na dysku albo jego wielokrotność.

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