PDA

View Full Version : [Java]gestione input e StringTokenizer


blue_blue
03-12-2007, 01:05
Ciao!
Probabilmente è l'ora tarda ( :sisi: ), ma mi stanno venendo dubbi atroci sulla gestione dell'input..
Esempio pratico: sto facendo un esercizio dove chiede di creare un archivio di patenti di guida;secondo la consegna, il costruttore (di cui ho solo la firma) " inizializza l'archivio con i dati prelevati da un file il cui nome e' passato come parametro e dove le patenti di guida sono riportate una per riga con il seguente formato:
numero:nome:punteggio "

Io (sperando di aver capito bene) ho scritto così:
public M(String file) throws IOException
{
archivio= new Coppia[1];
dim = 0;

FileReader r = new FileReader (file);
BufferedReader reader = new BufferedReader(r);
while (reader.readLine() != null)
{
String line = reader.readLine();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens())
{
String num = tokenizer.nextToken(":");
String nome = tokenizer.nextToken(":");
int punt = Integer.parseInt(tokenizer.nextToken("\n"));
aggiungi(num, nome, punt);
}
}
reader.close();
}
per compilare compila, ma mi viene il dubbio che non funzioni come voglio..cioè, dopo il primo tokenizer.nextToken(), lui alla seconda invocazione passa automaticamente al token successivo, no? o scritto così continua a prendermi su la stessa parola? e poi: dopo un primo giro di while mi passa automaticamente alla riga successiva del file, no? :stordita:

Grazie mille in anticipo :)

wingman87
03-12-2007, 01:12
Perché non fai qualche stampa a video per vedere cosa viene messo dentro le variabili? Sempre che non hai un debugger che sarebbe molto meglio.

Dark Phoenix
03-12-2007, 20:02
non ne sono sicuro....

....ma prova un po' così!?

public M(String file) throws IOException
{
archivio= new Coppia[1];
dim = 0;

FileReader r = new FileReader (file);
BufferedReader reader = new BufferedReader(r);
while (reader.readLine() != null)
{
String line = reader.readLine();
StringTokenizer tokenizer = new StringTokenizer(line, ":");
while (tokenizer.hasMoreTokens())
{
String num = tokenizer.nextToken();
String nome = tokenizer.nextToken();
int punt = Integer.parseInt(tokenizer.nextToken());
aggiungi(num, nome, punt);
}
}
reader.close();
}

blue_blue
03-12-2007, 21:58
Eccomi..ho appena provato a creare una classe di prova, ma mi dà questo errore, anche dopo aver modificato la classe come consigliato da Dark Phoenix..


C:\...>java ProvaPatente patenti.txt
Exception in thread "main" java.lang.NumberFormatException: For input string: "34CD56"
at java.lang.NumberFormatException.forInputString(NumberFormatException.
java:48)
at java.lang.Integer.parseInt(Integer.java:456)
at java.lang.Integer.parseInt(Integer.java:497)
at M.aggiungi(M.java:37)
at M.<init>(M.java:26)
at ProvaPatente.main(ProvaPatente.java:8)
non capisco dove sto sbagliando..

Questo è il contenuto di patenti.txt:

12AB34:Antonio Verdi:20
34CD56:Berto Rossi:20
56EF78:Carlo Bianchi:20

vegeta83ssj
03-12-2007, 23:43
prova a postare il metodo "aggiungi", secondo me il problema è lì!
Il compilatore ti sta dicendo che non riesce a convertire "34CD56" in Integer, evidentemente nel metodo aggiungi tu fai un'operazione del genere sul primo parametro che però è una stringa e non un intero (o stringa che rappresenti un intero).

Ciauz

blue_blue
04-12-2007, 00:01
prova a postare il metodo "aggiungi", secondo me il problema è lì!
Il compilatore ti sta dicendo che non riesce a convertire "34CD56" in Integer, evidentemente nel metodo aggiungi tu fai un'operazione del genere sul primo parametro che però è una stringa e non un intero (o stringa che rappresenti un intero).

Ciauz
:doh: :doh: mamma mia, hai ragione..ma cavolo, si può chiamare "numero" una variabile che non è un numero?! io già sono torda di mio, se poi ci si mettono di impegno per farmi sbagliare :sofico:

comunque ora ho modificato, ma ancora non va..
Adesso mi dice:

C:\...>java
ProvaPatente patenti.txt
Exception in thread "main" java.lang.NullPointerException
at java.util.StringTokenizer.<init>(StringTokenizer.java:182)
at java.util.StringTokenizer.<init>(StringTokenizer.java:204)
at M.<init>(M.java:20)
at ProvaPatente.main(ProvaPatente.java:8)

Dark Phoenix
05-12-2007, 18:25
Beh ora è facile....

Il buon vecchio nullpointer exception a quella liga lì....


Exception in thread "main" java.lang.NullPointerException
at java.util.StringTokenizer.<init>(StringTokenizer.java:182)
at java.util.StringTokenizer.<init>(StringTokenizer.java:204)
at M.<init>(M.java:20)
at ProvaPatente.main(ProvaPatente.java:8)


Evidentemente c'è qualche valore null vagante... Se posti il codice intorno a quelle righe possiamo vedere meglio... :cool:

blue_blue
07-12-2007, 22:47
Beh ora è facile....

Il buon vecchio nullpointer exception a quella liga lì....



Evidentemente c'è qualche valore null vagante... Se posti il codice intorno a quelle righe possiamo vedere meglio... :cool:

:yeah: trovato, grazie comunque!

Tornando in tema..per la gestione dell'input quali sono le modalità più usate? Io conosco Scanner (e in quel caso se devo dargli in lettura un file, devo inserirlo con il <, giusto? ) e FileReader + BufferedReader ( e qua invece passo il nome del file come parametro del main, no?)..ho detto cavolate?
E invece per creare un file di output cosa si usa di solito??

ABCcletta
09-12-2007, 18:53
Io preferisco usare gli stream. Utilizzando FileInputStream ho sempre ottenuto il risultato sperato.

Devi incapsulare gli stream in modo da ottenere una lettura bufferizzata, ovvero:
File f = new File(pathdelfile);
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f)));

Puoi leggere le linee del file una ad una utilizzando una readLine:
String input = br.readLine();

Ah, devi trattare l'IOException...

Dark Phoenix
10-12-2007, 00:36
Guarda se devi trattare solo file di "caratteri" puoi utilizzare FileReader.

P.S.
@ABCcletta: L' "imbussulamento" in InputStreamReader volendo lo puoi togliere

ABCcletta
10-12-2007, 03:05
Guarda se devi trattare solo file di "caratteri" puoi utilizzare FileReader.

P.S.
@ABCcletta: L' "imbussulamento" in InputStreamReader volendo lo puoi togliere

Non mi pare, se crei un inputstream dopo ci vuole un reader e poi ci applichi la lettura bufferizzata. Comunque farò una prova...


EDIT: Infatti non va. Forse volevi intendere qualche altra cosa?

Dark Phoenix
12-12-2007, 18:10
Si mi sono espresso malissimo....

in pratica volevo dire che così è più snello...


File f = new File(pathdelfile);
BufferedReader br = new BufferedReader(new FileReader(f));

ABCcletta
12-12-2007, 18:37
Si mi sono espresso malissimo....

in pratica volevo dire che così è più snello...


File f = new File(pathdelfile);
BufferedReader br = new BufferedReader(new FileReader(f));


Ah si con FileReader si :D
Ma preferisco avere a che fare con gli stream :D