PDA

View Full Version : [JAVA]prendere dati da tastiera...


NeoNum6
02-03-2006, 22:25
import java.io.*;

public class MainClass {

public static void main(String[] args) {
//per fare una lettura da tastiera
InputStreamReader tastiera=new InputStreamReader(System.in);
BufferedReader buffer=new BufferedReader(tastiera);

try{
System.out.println("inserisci il numero di dischi\n");
int n=(int)buffer.read();
System.out.println(n);
String [][] array=new String[5][n];
for (int j=0;j<5;j++){
for (int i=0;i<n;i++){
array [i][j]=new String(buffer.readLine());}
}}
catch(IOException e){
System.out.println("Errore!!"+e);
}
}



}

la domanda è: dove ho sbagliato? parlo della riga in cui c'è da immetere un numero da tastiera per completare l'array di array di stringhe... c'è bisogno di svuotare il buffer?come si fa?

^TiGeRShArK^
03-03-2006, 00:44
import java.io.*;

public class MainClass {

public static void main(String[] args) {
// per fare una lettura da tastiera
InputStreamReader tastiera = new InputStreamReader(System.in);
BufferedReader buffer = new BufferedReader(tastiera);

try {
System.out.println("inserisci il numero di dischi\n");
int n = Integer.parseInt(buffer.readLine());
System.out.println(n);
String[][] array = new String[5][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < 5; j++) {
array[j][i] = buffer.readLine();
}
}
System.out.println("Dati inseriti:");
for (int i = 0; i < n; i++) {
for (int j = 0; j < 5; j++) {
System.out.println(array[j][i]);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

l'errore fondamentale era utilizzare il metodo buffer.read() e poi castare ad int.... il metodo corretto è buffer.readLine() da convertire in int tramite Integer.parseInt()
poi ho fatto qualche modifichina nel codice perchè non mi piace fare un ciclo in cui c'è prima la j e poi la i, ma preferisco invertire i numeri nell'array :Prrr:

EDIT: dimenticavo... è pure inutile fare new String(buffer.readLine()) dato che questo metodo ti restituisce già una stringa...

NeoNum6
03-03-2006, 01:29
grazie mille

NeoNum6
04-03-2006, 13:36
ma nessuno crede che l'IO in Java sia un pò troppo confusionario?..insomma il concetto base è semplice
colleghi lo stream ad una fonte, e poi lo bufferizzi...ma quanta confusione....

Frank1962
04-03-2006, 13:40
ma nessuno crede che l'IO in Java sia un pò troppo confusionario?..insomma il concetto base è semplice
colleghi lo stream ad una fonte, e poi lo bufferizzi...ma quanta confusione....
prova le aleternative, per esempio C, e poi dimmi se Java non è quello semplice :D :D

NeoNum6
04-03-2006, 14:41
...io ho provato C...lo trovo più semplice a causa del livello di astrazione più basso...

dnarod
04-03-2006, 14:53
wow, sei una macchina...come fai a trovare l IO di c piu facile di quello di java?? buon per te comunque :)

^TiGeRShArK^
04-03-2006, 14:57
anche a me non piace tanto quello di java...
ma comunque non ci metti niente a crearti una classettina che te lo gestisca in modo semplice...
anzi... ora quasi quasi provo a farla e se esce bene la posto :D

NeoNum6
04-03-2006, 14:58
forse con un po più di pratica vi darò ragione... :)

NeoNum6
04-03-2006, 14:59
anche a me non piace tanto quello di java...
ma comunque non ci metti niente a crearti una classettina che te lo gestisca in modo semplice...
anzi... ora quasi quasi provo a farla e se esce bene la posto :D

magari! :D

NeoNum6
04-03-2006, 15:04
volevo domandarvi una cosa: ma è prassi che per leggere un char da file bisogna creare una variabile int e poi castarla a char? oppure ho sbagliato io qualcosa??
es:
try{
FileReader f=new FileReader("archivio.xml");
BufferedReader reader=new BufferedReader(f);
int a=reader.read();
System.out.println((char)a);
}
catch(FileNotFoundException g){
System.out.print("File Not FOund");
}
catch(IOException h){
System.out.print("IOException");
}

...BufferedReader ha un metodo readline...che legge un'intera riga...e se io volessi leggere una sola stringa? (StringTokenizer?)

^TiGeRShArK^
04-03-2006, 15:27
fatto..
scusate il ritardo ma ho dovuto sbrigare altre cosette pure :p

package keyboard;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Keyboard {

private static BufferedReader buffer;


public Keyboard() { }


public static String readLine(){
init();
try {
return buffer.readLine();
} catch (IOException e) {
return "ERROR: " + e.getMessage();
}
}


public static int readInt(){
init();
String line = readLine();
return Integer.parseInt(line);
}


private static void init(){
InputStreamReader keyboard = new InputStreamReader(System.in);
buffer = new BufferedReader(keyboard);
}
}

potete continuare ad estenderla come volete (sempre se vi serve a qualcosa 'sta skifezzina :D)
e comunque qui c'è la classe in cui l'ho provata:

import keyboard.Keyboard;

public class Prova {

public Prova() {}


public static void main(String[] args) {
System.out.println("Scrivi qualcosa: ");
System.out.println("Input della tastiera: " + Keyboard.readLine());
System.out.println("Inserisci un numero: ");
System.out.println("Numero inserito: " + Keyboard.readInt());
}

}

... si vede ke non ho un kazzo da fare finkè la build di diamonds è rotta, vero??? :D

^TiGeRShArK^
04-03-2006, 15:29
...BufferedReader ha un metodo readline...che legge un'intera riga...e se io volessi leggere una sola stringa? (StringTokenizer?)
si la soluzione migliore è caricarsi tutto il file in un'arrayList di stringhe e quindi applicare StringTokenizer ad ogni riga imho....

NeoNum6
04-03-2006, 15:49
a me sembra che la scanf(%s,stringa) sia molto più semplice in questo caso... :O

^TiGeRShArK^
04-03-2006, 15:59
perchè è + semplice di String s = Keyboard.readLine()???
tieni conto che col code completion ci metti meno a scrivere la seconda opzione e inoltre il codice risulta + chiaro e leggibile...
vuoi mettere con uno scanf(%s, stringa) come leggibilità? :D

NeoNum6
04-03-2006, 16:17
aspetta però... con String s = Keyboard.readLine() non hai mica finito...devi usare una StringTokenizer che ti divide le 10 100 1000 stringhe che ci sono sulla prima riga...ricordo che il bufferedreader è di circa 8000 caratteri! :eek:

dnarod
04-03-2006, 16:26
beh non c e solo readline
puoi leggere qualsiasi tipo di dato primitivo (dai un occhio alla documentazione), isolare cio che ti serve, matchare cio che vuoi cercare in una riga, eccetera

NeoNum6
04-03-2006, 16:29
qualcuno di voi programma in linux??
sto cercando di aprire unsa semplicissima finestra JPanelOption.showMessageDialog()


** ERROR **: file ../../../src/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c: line 572 (createRawData): assertion failed: (data_fid != 0)
aborting...

...dnarod a quel che dici tu ho già risposto...magari quando farò un po piu di esperienza la penserò come voI! :D

dnarod
04-03-2006, 19:02
azz hai messo me in quel noi....io sono quasi certamente piu inesperto di te, cmq grazie per la fiducia....probabilmente pero parlo cosi di java perche lo conosco meglio :)

^TiGeRShArK^
05-03-2006, 00:01
aspetta però... con String s = Keyboard.readLine() non hai mica finito...devi usare una StringTokenizer che ti divide le 10 100 1000 stringhe che ci sono sulla prima riga...ricordo che il bufferedreader è di circa 8000 caratteri! :eek:
aspetta..
ma ora stai parlando della tastiera o del file xml???
dalla tastiera mi pare difficile che una riga contenga 8000 caratteri.. :mbe:
se il file che devi leggere è un file xml ti basta usare un parser xml come xerces (ma ce ne sono molti altri)
Se invece devi leggere un file del tipo chiave valore, ad esempio:
heigth = 20
width = 50
basta caricartelo mediante la classe property che ti genera un hashmap da cui puoi ricavare tutto ciò che vuoi inserendo la chiave da leggere.
Per un file di testo generico invece il metodo migliore e imho quello che ti ho detto prima....
carichi tutto il file in un arraylist di stringhe e usi lo stringtokenizer su ogni riga..
in questo modo anzikè effettuare ogni volta accessi al file accedi alla memoria che è MOOOLTOOO più veloce (anche se solitamente il file viene caricato in cache tramite il prefetching dal sistema operativo, ma mi sa che cmq l'accesso in memoria è + efficiente).
alla fine dipende da quello ke devi fare...
non c'è una soluzione generale...
come diceva qualcuno "the right tool for the right job" cioè prima devi capire bene quali sono le tue esigenze e quindi potrai usare lo strumento che soddisfi meglio le tue esigenze....
cmq se mi spieghi meglio quello che devi fare forse ti posso aiutare :D

EDIT: OT dimenticavo. DNAROD: domani pom sei precettato a casa mia per darmi una mano col refactoring di diamonds. Puoi mancare solo se è prevista la fine del mondo per domani, è già da troppo tempo ke rimandi :Prrr: