[FileReader][Scanner] Odczytanie liczby wierszy i kolumn z pliku tekstowego

[FileReader][Scanner] Odczytanie liczby wierszy i kolumn z pliku tekstowego
klaptoczb
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8
0

Witam,
Mam kolejny problem, tym razem z odczytywaniem danych z plików tekstowych.
Mam dwa pliki w formacie:
Plik1:
1 2
1 2 3
Plik 2:
1
1 2
1 2 3 4
Chcę odczytać z łączną liczbę wierszy oraz największą liczbę kolumn. Poniżej mój kod. Obliczanie liczby wierszy działa jednak mam problem z liczbą kolumn- wywala mi wyjątek FileNotFoundException.

Będę wdzięczny za pomoc w rozwiązaniu problemu.
Fragment kodu:

Kopiuj
Scanner scan1 = new Scanner(new FileReader(plik1));
            Scanner scan2 = new Scanner(new FileReader(plik2));

            //Sprawdza ile wierszy znajduje się w pierwszym pliku
            int wiersze = 0, kolumny = 0;
            while (scan1.hasNextLine()) {
                wiersze++;
                int licznikKolumn = 0;
                while(scan1.hasNextInt()){
                    licznikKolumn++;
                    scan1.nextInt();
                }
                if(licznikKolumn > kolumny) kolumny = licznikKolumn;
                scan1.nextLine();
            }
            //Sprawdza ile wierszy jest w obu plikach
            while (scan2.hasNextLine()) {
                wiersze++;
                scan2.nextLine();
            }

            System.out.println(wiersze+" "+kolumny);
klaptoczb
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8
0

Udało mi się rozwiązać problem. Prosił bym jednak o wyjaśnienie dlaczego nie działa powyższy kod. Poniżej umieszczam moje rozwiązanie.

Kopiuj
Scanner scan1 = new Scanner(new FileReader(plik1));
            Scanner scan2 = new Scanner(new FileReader(plik2));
            StringTokenizer token;

            //Sprawdza ile wierszy znajduje się w pierwszym pliku
            int wiersze = 0, kolumny = 0;
            while (scan1.hasNextLine()) {
                wiersze++;
                int licznikKolumn = 0;
                token = new StringTokenizer(scan1.nextLine()," ");
                while(token.hasMoreElements()){
                    licznikKolumn++;
                    token.nextElement();
                }
                if(licznikKolumn > kolumny) kolumny = licznikKolumn;
            }
            //Sprawdza ile wierszy jest w obu plikach
            while (scan2.hasNextLine()) {
                wiersze++;
                int licznikKolumn = 0;
                token = new StringTokenizer(scan2.nextLine()," ");
                while(token.hasMoreElements()){
                    licznikKolumn++;
                    token.nextElement();
                }
                if(licznikKolumn > kolumny) kolumny = licznikKolumn;

            }

            System.out.println(wiersze+" "+kolumny);
bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

Ja też nie wierzę w FileNotFoundException.

klaptoczb
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8
0

Przepraszam za problem, ale faktycznie pomyliłem wyjątek.
Chodziło o NoSuchElementException: No Line Found.
W takim razie pytanie dlaczego nie znajduje kolejnej linii?

Z rozpędu wpisałem zły opis. Sorry za kłopot.

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
1

Wyjątek poleci gdy w ostatnim wierszu są tylko liczby, a nie ma Entera na końcu.
Wtedy pętla

Kopiuj
                while(scan1.hasNextInt()){
                    licznikKolumn++;
                    scan1.nextInt();
                }

wykorzysta całość pliku i instrukcja

Kopiuj
scan1.nextLine();

rzuci wyjątek

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.