wczytywanie danych z pliku do tablicy

0

Hej,

Napisałem poniższy kod:

import java.io.*;

public class ReadFile{

public static void main(String[]args)throws IOException, NumberFormatException{

	FileReader fr= new FileReader ("cosTam.txt");
	BufferedReader br= new BufferedReader(fr);
	String line=null;
	while((line=br.readLine())!=null){
		String[] s=line.split("\t");
		int [] s2=new int[s.length];
		for(int i=0;i<s.length;i++){
			s2[i]=Integer.parseInt(s[i]);
			System.out.println(s2[i]);
		}
	}
	br.close();
}

}

Niestety sczytuje tylko pierwszą linię a potem nie radzi już sobie z nową linią i wyrzuca:
Exception in thread "main" java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:504)
at java.lang.Integer.parseInt(Integer.java:527)
at ReadFile.main(ReadFile.java:14)

Ogólnie program ma sczytywać dane z pliku(macierz dwuwymiarowa). Na początku dane sczytuje do tablicy string dzięki metodzie split, następnie stringi parsowane są do intów. Potem mam sprawdzić czy macierz jest magiczna(tj czy sumy elementów poszczególnych wierszy, kolumn, przekątnych jest równa). Myślę, że ze sprawdzeniem czy jest magiczna dam radę tylko mam trudności ze stworzeniem tablicy int. Pomożecie :)?

0
 FileReader fileReader = new FileReader("cosTam.txt");
        BufferedReader bufferedReader = new BufferedReader(fileReader);

        String textLine = bufferedReader.readLine();
        do {
            System.out.println(textLine);

            textLine = bufferedReader.readLine();
        } while (textLine != null);

        bufferedReader.close();

więcej : http://naukajavy.pl/kurs-jezyka-java/113-odczyt-tekstu-z-pliku

0

Dzięki, ale Twój kod właściwie jest powieleniem tego co już mam :) Teraz prośba o pomoc w postawieniu kolejnego kroku :)

0

Kod czytający jest poprawny, pewnie dane w pliku są niepoprawne - liczby muszą być oddzielone tabulacją. Tablicę liczb możesz zrobić tak ("po drodze" użyłem kolekcji żeby nie było konieczności dwukrotnego czytania pliku, pierwszy raz po to poznać rozmiar):

        List<int[]> lista = new ArrayList<int[]>();
        String line=null;
        while((line=br.readLine())!=null){
            String[] s=line.split("\t");
            int [] s2=new int[s.length];
            for(int i=0;i<s.length;i++){
                s2[i]=Integer.parseInt(s[i]);
                //System.out.println(s2[i]);
            }
            lista.add(s2);
        }
        br.close();
        int[][] liczby = new int[lista.size()][];
        liczby = lista.toArray(liczby);
0

Dzięki, w powyższym kodzie eclipse od razu krzyczy o wyjątku. Rzeczywiście w pliku liczby w wierszach oddzielone są \t, natomiast wiersze oddzielone są enterem. Teraz zastanawiam się jak to ominąć, bo pliku zmienić nie mogę. Czy można wstawić jakiś dodatkowy warunek? Albo pewnie alternatywa to posłużyć się wyrażeniami regularnymi, które wyszukają \t oraz ""...

1

O wyjątku opowiadasz bajki. Żeby nie było błędów wykonania dodaj sprawdzenie czy odczytany wiersz jest niepusty.

import java.io.*;
import java.util.*;

public class ReadFile{

    public static void main(String[]args)throws IOException, NumberFormatException{

        FileReader fr= new FileReader ("cosTam.txt");
        BufferedReader br= new BufferedReader(fr);
        List<int[]> lista = new ArrayList<int[]>();
        String line=null;
        while((line=br.readLine())!=null){
            if(!line.isEmpty())
            {           
                String[] s=line.split("\t");
                int [] s2=new int[s.length];
                for(int i=0;i<s.length;i++){
                    s2[i]=Integer.parseInt(s[i]);
                }
                lista.add(s2);
            }
        }
        br.close();
        int[][] liczby = new int[lista.size()][];
        liczby = lista.toArray(liczby);
    }
}
0

Nie denerwuj się Bogdan, odczytałem tylko komunikat z kompilatora :) Bardzo serdecznie dziękuję za pomoc! Kod działa poprawnie. Pozdrawiam

0

Mam jeszcze jedną prośbę. Oczywiście powyższy kod Bogdana działa poprawnie, natomiast próbuję jeszcze to zrobić bez używania list. Wypociłem:):

import java.io.*;
public class ReadFile{
public static void main(String[]args)throws IOException, NumberFormatException{

	FileReader fr= new FileReader ("cosTam.txt");
	BufferedReader br= new BufferedReader(fr);
	String line=null;
	//81 bo macierz z pliku ma tyle elementów
	String[] s=new String[81];
	int [] s2=new int [s.length];
	while((line=br.readLine())!=null){
		if(!line.isEmpty()){           
			s=line.split("\t");
			s2=new int[s.length];
			for(int i=0;i<s.length;i++){
				s2[i]=Integer.parseInt(s[i]);
			}
		}
	}
	int k=0;
	int [][]s3=new int[s.length][];
	for(int i=0;i<s.length;i++){
		for(int j=0;j<s.length;j++){
			s3[i][j]=s2[k];
			k++;
		}
	}
	br.close();
    }

}

Po kompilacji wyrzuca: Exception in thread "main" java.lang.NullPointerException
at ReadFile.main(ReadFile.java:26).
Tablica s2 powstaje dobrze. Jest teraz problem z przekształceniem jej w dwuwymiarową macierz. Pewnie kombinuję naokoło... Co można tu poprawić aby grało i buczało ;)?

0

Masz dwa błędy, w Javie tablica dwuwymiarowa jest tablicę tablic. Po instrukcji

int [][]s3=new int[s.length][];

każdy wiersz tablicy s3 jest nullem. Zmień na

int [][]s3=new int[s.length][s.length];

Zupełnie źle jest napisana pętla przepisująca. Na dodatek jest umieszczona w złym miejscu. Przepisujesz do tablicy s3 po zakończeniu czytania pliku, a tablica s2 zawiera wtedy tylko ostatni wiersz z pliku.

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