Metoda 'readline()' i plik txt

0

Może mi ktoś wytłumaczyć w czym jest problem, mianowicie mam plik txt. wczytuje go i pobieram linie po lini, tak to robie

            System.IO.StreamReader sr = new System.IO.StreamReader("tt.txt");
            String a;

                while ((a = sr.ReadLine()) != null)
                {
                    String[] b = a.Split(';');
                    singleton.add(b[1], b[2], b[3]);
                }
            sr.Close();
gdy dane są takiego typu:
1;a;b;c
2;a;b;c
...

to wszystko jest OK, działa bez zarzutu.
Ale gdy są jakieś specyficzne dane, np.

1;Design Pattern;Wzorzec OBSERWATOR definiuje pomiędzy obiektami relację jeden do wielu w taki sposób, że kiedy wybrany obiekt zmienia swój stan, to wszystkie jego obiekty zależne zostają o tym powiadomione i automatycznie zaktualizowane.;The OBSERVER PATTERN defines a one-to-many dependency between objects so that when one object changes state, all of its dependents are notified and updated automatically.
2;Design Pattern;Wzorzec ITERATOR zapewnia metodę dostępu sekwencyjnego do elementów obiektu zagregowanego bez ujawniania jego reprezentacji wewnętrznej.;The ITERATOR PATTERN provides a way to access the elements of an aggregate object sequentially without exposing its underlying representation.
3;Design Pattern;Wzorzec SINGLETON zapewnia, że dana klasa będzie miała tylko I wyłącznie jedną instancję obiektu I zapewnia globalny punkt dostępu do tej instancji.;The SINGLETON PATTERN ensures a class has only one instance, and provides a global point of access to it.
4;Design Pattern;Wzorzec STRATEGIA definiuje rodzinę algorytmów, pakuje je jako osobne klasy I powoduje, że są one w pełni wymienne. Zastosowanie tego wzorca pozwala na to, aby zmiany w implementacji algorytmów przetwarzania były całkowicie niezależne od strony klienta, który z nich korzysta.;The STRATEGY pat tern defines a family of algorithms, encapsulates each one, and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.

To program głupieje, mianowicie po wczytaniu punktu '2' dalsze linie dla niego są puste! I rzuca wtedy wyjątkiem.
ort! zmieniać ułożenie tych punktów, i zawsze z tym '2' punktem jest problem.
Jest tam może jakaś zła kombinacja tekstu czy o co może chodzić?

a jeszcze pytanie, jak złapać wyjątek tutaj, znaczy jaką jest rzucany wyjątek i jak już go złapie to co z nim zrobić ?

0

Nie wiem o co Ci chodzi. Kod masz prawidlowy, zakladajac ze chcesz pomijac kolumne z numerem porzadkowym. Twoj post mnie tak zdziwil, ze az u siebie sprawdzilem na tym tekscie 1..4 ktory podales. Wsyzstko dziala poprawnie:

            System.IO.StreamReader sr = new System.IO.StreamReader("input1.txt");

            List<string[]> tmp = new List<string[]>();

            String a;
            while ((a = sr.ReadLine()) != null)
            {
                String[] b = a.Split(';');
                tmp.Add(b);
            }
            
            sr.Close();

po tej sekwencji, lista TMP zawierala cztery tablice, ktore dokladnie odpowiadaly polamanym liniom z pliku.

Strzelam, ze 100% z obserwowanych błędów masz w metodzie singleton::add(string,string,string)
a do łapania wyjątkow, tradycyjnie stosuje się blok:

try
{
       kod rzucajacy
}catch(Exception ex) // lub bardziej konkretny typ 
{
      kod naprawiajacy, raportujacy blad, etc
}
finally
{
      ew. porzadki, np. if(sr!=null)sr.Close() tutaj powinno byc
}
0

hm, no dziwne właśnie, bo samemu mi sie nie chce wierzyć.
A błąd na pewno jest w readline, która zwraca pustego Stringa, po przeczytaniu drugiego punktu.
Prubowałem już go przedstawiać na inne pozycje i to samo sie działo.
Aż coś mnie trafia, bo nie wiem czemu to tak sie zachowuje.

Ale dzięki za odpowiedz, i przetesowanie tego.
Można uznać, że post jest zamknięty, choć nie wyjaśnione dalej jest nie wyjaśnione.

0

jezeli Cie to ciekawi, mozesz jeszcze sprobowac:

  1. wklej dokladna tresc pierwszych 10-20 linii pliku, z uwzglednieniem znakow specjalnych, krzakow w unicode, \r/\n/\r\n na koncu linii etc. moze split zle cos lamal, stad wyjatek.. ale nic nie tlumaczy ucinania pliku
  2. zamiesc dokladny i caly kod czytajacy z pliku, wraz z opisem gdzie stawiasz breakpointy i/lub w jaki sposob sprawdzasz ze readline faktycznie zwraca pustystring. moze masz gdzies jaka wtope logiczna, skrzyzowane nazwy zmiennych, moze przypadkiem rownolegle cos Ci sie gdzies zmienia.. pod najwiekszym pytaniem stoi singleton.add wciaz.. ale skoro jestes pewien ze jest on w porzadku, to:
  3. wymien swoj kod czytajacy na to co ja zamiescilem, niech przeczyta wszetko do listy, a potem po przeczytaniu do listy pusc petle foreach po tej liscie, niech przerzuci jej elementy do singleton.add. tam gdzie sie program wywali wowczas, tam jest blad. sprawdzisz w ten sposob zarowno czy plik sie caly przeczytal, jak i czy .add przyjmuje dane poprawnie

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