Zapamiętywanie pozycji w pliku txt przy użyciu StreamReadera

0

Witam, nie wiem, czy do końca dobrze zdefiniowałam temat. Mam do napisania program, który będzie wykonywał sortowanie poli-fazowe (zewnętrzne). W sortowaniu biorą udział trzy pliki tekstowe. W pierwszym znajduje się skończona ilość liczb, każda w nowym wierszu. Program najpierw dzieli te liczby do dwóch pozostałych plików według liczb Fibonacciego (np. w wejściowym było 8, więc dzieli to na 5 liczb do drugiego pliku i 3 liczby do trzeciego). Następnie sprawdza, który plik jest pusty (czyli pierwszy w tym przypadku). Wczytuje po jednej z liczb z plików do odczytu, sortuje je i zapisuje posortowane w jednym wierszu w pliku wyjściowym (pierwszym w tym przypadku) ze spacją pomiędzy nimi. Trwa to aż do wyczerpania liczb w którymś z plików. Następnie zmienia się status pliku, który się skończył na plik do zapisu, a tego, który poprzednio był do zapisu na do odczytu. Operacje takie trwają aż do całkowitego posortowania wszystkich elementów.

przykład
plik1
9
4
8
3
7
5
1
2

plik2
9
4
8
3
7

plik3
5
1
2

plik1
5 9
1 4
2 8

plik3
3 5 9
1 4 7

itd.

Niestety mam duży problem z zapamiętywaniem pozycji w pliku do odczytu - program uznaje ten plik za zamknięty, bo StreamReader jest otwarty lokalnie (chyba). Otwarcie globalne nie wchodzi w grę, bo wtedy nie będzie można zapisywać do tego pliku. Proszę o pomoc, nie mam już pomysłów co robić. Z góry dziękuję za wszelkie wskazówki. Zdaję sobie sprawę, że kod nie jest zoptymalizowany, za co przepraszam.

// Plik w wersji VS 2010

1

Nie mogę Ci pomóc, bo nie stać mnie na WinRARa. :(

2

Proszę, zip.

PS Jestem dziewczynką ;)

0

Ja tu widzę piękny wyjątek: "Cannot read from a closed TextReader." w linii 389, czyli: string d5 = czytnik1.ReadLine();
Po prostu, chcesz odczytać linię używając czytnik1, ale nie możesz tego zrobić, bo wcześniej zamknęłaś ten strumień przy użyciu metod: Close' i Dispose''. Po prostu nie zamykaj go wcześniej, to raczej nie będzie tego problemu. Zamykaj np. wszystkie strumienie dopiero po zakończeniu wszystkich operacji.

Sprawa druga - masz metodę Main długą na prawie 500 linijek kodu, jest to jedyna Twoja metoda w programie, do tego widzę w niej powielające się pewne fragmenty kodu. Nie da się tego czytać ani analizować w żaden sposób. Zastanów się nad swoim programem, pomyśl, jakie operacje w nim wykonujesz i umieść je w oddzielnych funkcjach. Trzeba nad tym popracować, ale będzie Ci wygodniej. Takimi funkcjami mogą być np. obliczanie ciągu Fibonacciego albo wczytywanie danych z określonych plików (zamiast tych if...else), czy też konwertowanie danych z pliku na liczby.

0

Ale jeżeli zamknę wszystkie strumienie dopiero po zakończeniu wszystkich operacji to do plików nie zostaną wczytane dane, z których potem dalej cały czas korzystam. Muszę też zamknąć odczyt z pliku żeby móc do niego zapisywać (wywala wtedy błąd, że plik jest używany przez inny proces). Dobrze myślę?

1
tetris napisał(a)

Ale jeżeli zamknę wszystkie strumienie dopiero po zakończeniu wszystkich operacji to do plików nie zostaną wczytane dane, z których potem dalej cały czas korzystam.

Jeśli chcesz się upewnić, że dane wysłane metodą Write czy tam WriteLine zostały zapisane na dysk, to wystarczy użyć metody Flush, a nie Close.

Muszę też zamknąć odczyt z pliku żeby móc do niego zapisywać (wywala wtedy błąd, że plik jest używany przez inny proces). Dobrze myślę?

Myślę, że jeśli strumienie tworzysz ustawiając flagę FileAccess.ReadWrite, to powinnaś móc jednocześnie zapisywać i odczytywać do takiego pliku. O ile oczywiście, masz w programie jeden strumień dla każdego pliku. A Ty chyba masz ich wiele, bo widzę, że ciągle gdzieś tworzysz jakieś strumienie. :/

Twój program nie powinien mieć raczej więcej niż 100 linijek.

BTW, ciekawe, czy osoba, która dała punkt autorce za wrzucenie pliku zip jest jedną z tych, które zminusowały mojego posta krytykującego wrzucanie rarów. Jeśli tak, to jest niezłym hipokrytą. ;P

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