Dziwne zachowanie System.in.read() w pętli

0

Jestem początkujący w programowaniu i dzisiaj podczas ćwiczeń natknąłem się na dziwną sytuacje z metodą System.in.read() i pętlą. Otóż iteracja po wywołaniu System.in.read() przeskakuje o 3 i wtedy metoda System.in.read() ponownie jest wywoływana. Pomoże mi ktoś zrozumieć dlaczego tak się dzieje?

wywołanie System.in.read()
iteracja i = 0
tablica[i] = "a"
iteracja i = 1
tablica[i] = null
iteracja i = 2
tablica[i] = null
wywołanie System.in.read()
.....

import pakiet1.*; 
import java.io.*; 

public class Main {
	public char c[] = new char[10]; 
	
	public void readLine() {		
		try{
			for(int i = 0; i < 10; i++) {
				c[i] = (char) System.in.read(); 
				System.out.println("i " + i); 
				System.out.println("char " + c[i]); 
			}
		} catch(IOException e) {
			System.out.println("Blad"); 
		} 	
	}
	
	public static void main(String args[]) {					
		Main main = new Main();
		main.readLine(); 	
	}
}
0

Dziwne, u mnie działa...
https://ideone.com/6aZRnV
Jakie masz dane wejściowe?

0

U mnie (w kompilatorach online) działa, ale:

  1. Nie powinieneś rzutować odczytanego inta na char jeśli wcześniej nie sprawdzisz czy nie ma wartości -1. Wartość -1 oznacza że nie ma już intów do odczytania
  2. W ogóle nie powinieneś rzutować inta na char. Java używa Unicode, a Unicode już dawno przekroczył wartość 2^16-1 (0xFFFF)
0
RewAnd napisał(a):

Dziwne, u mnie działa...
https://ideone.com/6aZRnV
Jakie masz dane wejściowe?

Na wejściu podaje dowolny znak z klawiatury

przykład działania programu w konsoli:

k
i 0
char k
i 1
char
i 2
char

o
i 3
char o
i 4
char
i 5
char

t
i 6
char t
i 7
char
i 8
char

y
i 9
char y

0
Kamil Żabiński napisał(a):

U mnie (w kompilatorach online) działa, ale:

  1. Nie powinieneś rzutować odczytanego inta na char jeśli wcześniej nie sprawdzisz czy nie ma wartości -1. Wartość -1 oznacza że nie ma już intów do odczytania
  2. W ogóle nie powinieneś rzutować inta na char. Java używa Unicode, a Unicode już dawno przekroczył wartość 2^16-1 (0xFFFF)

To ciekawe co napisałeś to wygląda to trochę tak jakby program nie wiedział że nie ma już więcej znaków do odczytania i próbował dalej pobierając nulle.

1

Dokładnie tak jest. Tylko u mnie to nie były nulle a -1, które po zrzutowaniu na char daje 0xFFFF. -1 jest informacją o końcu strumienia. To Ty sam powinieneś przestać czytać jeśli odczytasz -1

0
Kamil Żabiński napisał(a):

Dokładnie tak jest. Tylko u mnie to nie były nulle a -1, które po zrzutowaniu na char daje 0xFFFF. -1 jest informacją o końcu strumienia. To Ty sam powinieneś przestać czytać jeśli odczytasz -1

Postanowiłem użyć przeciążonej wersji metody System.in.read() która wydawać by się mogło rozwiąże problem.

int read(byte[] b, int off, int len)
Odczytuje ze strumienia liczbę bajtów nie większą niż określona przez len i zapisuje je w tablicy b, począwszy od komórki wskazywanej przez off. Zwraca rzeczywiście przeczytaną liczbę bajtów.

import pakiet1.*; 
import java.io.*; 

public class Main { 
	byte[] b = new byte[10];  

    public void readLine() {        
        try{
            for(int i = 0; i < 10; i++) {
				System.in.read(b,i,1);
				System.out.println("tabValue: " + b[i] + " i: " + i);	
            }
        } catch(IOException e) {
            System.out.println(e); 
        }   
    }

    public static void main(String args[]) {                    
        Main main = new Main();
        main.readLine();    
    }
}

Problem jednak dalej jest taki sam
przykładowe wykonanie:

k
tabValue: 107 i: 0
tabValue: 13 i: 1
tabValue: 10 i: 2
o
tabValue: 111 i: 3
tabValue: 13 i: 4
tabValue: 10 i: 5
t
tabValue: 116 i: 6
tabValue: 13 i: 7
tabValue: 10 i: 8
y
tabValue: 121 i: 9

Problem o dziwo zniknął kiedy wpisałem 3 jako argument

System.in.read(b,i,3);

teraz jest tak:

k
tabValue: 107 i: 0
o
tabValue: 111 i: 1
t
tabValue: 116 i: 2
y
tabValue: 121 i: 3
n
tabValue: 110 i: 4
a
tabValue: 97 i: 5
s
tabValue: 115 i: 6
t
tabValue: 116 i: 7
java.lang.indexoutofboundsexception

Błąd jest tutaj pewnie dlatego że może oczekiwać 3 bajtów a tablica ma 10 elementów ale dalej nie wiem dlaczego poprzedni przykład powoduje błąd.
Ma ktoś może jakiś pomysł?

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