Odczyt i analiza pliku z tekstu

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ć...
2. 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();
	  }
	
}

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.

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ć"

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