Odczyt i analiza pliku z tekstu

Odpowiedz Nowy wątek
2019-01-03 17:55
0

Mam za zadanie napisać program, który kopiuje plik tekstowy i wyświetla liczbę jego znaków, wyrazów, wierszy, etc.
Mam kilka konkretnych problemów:

  1. BFR nie czyta 2. wiersza, np. gdy mam plik:

    Ala ma kota.
    Kot lubi Alę.
    To kot Ali.

Daje wynik:

Ala ma kota.
To kot Ali.
Liczba znaków: 23
Liczba znaków czarnych: 19
Liczba wyrazów: 6
Liczba wierszy: 2
Najdłuższy wiersz ma: 12 znaków

Podejrzewam, że to sprawka pętli do-while, ale nie mogę dojść do wniosku jak to poprawić...

  1. Mam problem z tym, że pierwotnie dałem dwie tablice:

    int []dlugoscwiersza = new int [10];
    int [] dlugoscwyrazow = new int [100];

Wiedząc jaki stworzyłem plik. Ale przecież plik może być dłuższy... Zamiast 10 i 100 powinno tam być liczbawierszy. Ale liczbę wierszy obliczam niżej. Jak to rozwiązać?

Mój kod:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

public class AnalizaTekstu {

    static double[][]tablica;

    public static double[][] TworzTab() throws IOException {
          @SuppressWarnings("resource")
        Scanner odczyt = new Scanner(System.in); 

        System.out.println("Podaj nazwę pliku:");
          String plik = odczyt.nextLine();

          FileReader fr = null;
            try {
                fr = new FileReader(plik);
            }
            catch (FileNotFoundException e) {
                System.out.println("Nie ma pliku");
            }

            BufferedReader bfr = new BufferedReader(fr);
            String linia = "";
            int liczbawyrazow = 0;
            int liczbawierszy = 0;
            int liczbaznakow = 0;
            int liczbaznakowczarnych = 0;

            //TODO jak pozbyć się tablicy, bo nie znam przecież długości pliku?
            int []dlugoscwiersza =  new int [10];
            int [] dlugoscwyrazow = new int [100];
            int i = 0;
            do  {

                   linia = bfr.readLine();
                  System.out.println(linia);
                   String[] wiersz = linia.split(" ");
                   String[] znaki = linia.split("");

                   //TODO nie czyta 2 wiersza
                  liczbawyrazow += wiersz.length;
                  liczbaznakow += znaki.length;
                  liczbawierszy ++;
                  dlugoscwiersza[i] = liczbaznakow;
                  dlugoscwyrazow[i] = liczbawyrazow;
                  i++;  
                } while (bfr.readLine() != null);

              liczbaznakowczarnych += liczbaznakow - (liczbawyrazow - liczbawierszy);
              System.out.println("Liczba znaków: " + liczbaznakow);
              System.out.println("Liczba znaków czarnych: " + liczbaznakowczarnych);
              System.out.println("Liczba wyrazów: " + liczbawyrazow);
              System.out.println("Liczba wierszy: " + liczbawierszy);

              int maxw = 0;
              for (int j = 0; j<dlugoscwiersza.length; j++) {
                  maxw = dlugoscwiersza[0];
                  if (dlugoscwiersza[j] > maxw) maxw = dlugoscwiersza[j];
              }
              System.out.println("Najdłuższy wiersz ma: " + maxw + " znaków");

              return tablica;
    }

    public static void main(String[] args) throws IOException{
          TworzTab();
      }

}
edytowany 1x, ostatnio: Roger Simpson, 2019-01-03 17:56

Pozostało 580 znaków

2019-01-03 18:45
0
  1. Nie czyta co drugiego wiesza ponieważ w while odczytujesz linie i ją ignorujesz.
    while (bfr.readLine() != null);

  2. Możesz skorzystać ze struktur rozszerzalnych jak ArrayList.

Ach, faktycznie... Tylko jak naprawić to pierwsze, bo jak zamienię kolejnością Sysout z bfr.readLine, to się potem wysypie...? Bo chyba musi najpierw odczytać daną linię a potem ją wyświetlić, już tak myśląc o kolejnych liniach - Roger Simpson 2019-01-03 18:47
@Roger Simpson: Chyba najłatwiej w while użyć metody Scanner hasNextLine() - krsp 2019-01-03 18:52

Pozostało 580 znaków

2019-01-04 22:29
0

zamień

 while (bfr.readLine() != null);

na

 while ((linia = bfr.readLine()) != null);

i skasuj istniejące:

linia = bfr.readLine();

Jak robisz readLine() to odczytujesz linijkę i przeskakujesz do następnej. Musisz ją zapisać jeśli nie chcesz jej "utracić"

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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