Newsgroup: it.comp.java
Titolo: Problema con file e readLine() [Lunghino]

Ciao,
sono alla prese con la lettura da file e con il metodo readLine();
Il file in questione č cosě composto:
4
Fiat       2 2.54 6.69 4.57 9.69
Enel      1 6.54 7.89 0.25 3.21
Alitalia  2 8.21 2.01 4.98 3.24
BMP    1 7.41 1.54 8.96 5.35
La prima riga (4) contiene il numero totale delle azioni; le altre righe
sono cosě suddivise: il primo token (String) rappresenta il nome
dell'azione, il secondo (int) rappresenta il codice, gli altri 4 token
(double) rappresentano i valori assunti durante l'anno dal titolo azionario.
Ora:
il codice che ho scritto (solo il ciclo) per leggere questo file č il
seguente:
int i=0;
int totalAction // numero totale delle azioni
StringTokenizer st;
totalAction = Integer.parseInt(br.readLine());
do {
       String action = br.readLine();
       String name = action.substring(0, 11);
       System.out.println(name)                           // stampa di
controllo
       String numbers = action.substring(12);
       st = new StringTokenizer(numbers);
       int code = Integer.parseInt(st.nextToken());
      double lastQuot = Double.parseDouble(st.nextToken());
      double currQuot = Double.parseDouble(st.nextToken());
      double min = Double.parseDouble(st.nextToken());
      double max = Double.parseDouble(st.nextToken());
      i++;
}
while(i<totalAction);
...
il ciclo viene compilato senza problemi ma durante l'esecuzione ho il
seguente errore:
Fiat
Exception in thread "main" java.lang.NumberFormatException: For input
String: "2.54"
at
java.lang.NumberFormatException.forInputString(NumberFormatException.java:
48)
at java.lang.Integer.parseInt(Integer.java: 435)
at java.lang.Integer.parseInt(Integer.java: 476)
at Azioni.main(Azioni.java: 128)
Come vedete stampa il primo nome, memorizza l'int e poi, quando trova il
double si ferma; siccome il file di input (quello con le azioni) l'ho fatto
io, non vorrei che ci fosse qualcosa di sbagliato per quanto riguarda gli
spazi o qualcosa del genere; o magari l'estrazione delle 2 substring (sempre
per problema di spazi)...boh! :-(
Voi cosa dite?
Grazie!
Ciao!!


Prova il listato seguente, io non ho avuto problemi nel compilarlo ed
eseguirlo:
import java.io.*;
import java.util.*;
class LeggiFile
{
 public static void main(String arg[]) throws Exception
 {
  File f = new File("Azioni.txt");
  FileReader in = new FileReader(f);
  BufferedReader br = new BufferedReader(in);
  int i=0;
  int totalAction; // numero totale delle azioni
  StringTokenizer st;
  totalAction = Integer.parseInt(br.readLine());
  do
  {
         String action = br.readLine();
         st = new StringTokenizer(action);
         String name = st.nextToken();
         int code = Integer.parseInt(st.nextToken());
        double lastQuot = Double.parseDouble(st.nextToken());
        double currQuot = Double.parseDouble(st.nextToken());
        double min = Double.parseDouble(st.nextToken());
        double max = Double.parseDouble(st.nextToken());
         System.out.println(name+" "+code+" "+lastQuot+" "+currQuot+"
"+min+" "+max);
        i++;
  } while(i<totalAction);
  in.close();
 }
}
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (
http://www.grisoft.com
).
Version: 6.0.455 / Virus Database: 255 - Release Date: 13/02/2003

          String name = st.nextToken();
ok, questo potrebbe funzionare...anzi funziona, nel caso in cui i nomi delle
azioni siano formati da una sola parola, ma nel caso in cui fossero formati
da due parole (ora non mi viene in mente nessuna azione con 2 parole), la
"tecnica" del nextToken() non funziona in quanto, lo StringTokenizer,
trovando lo spazio, lo considera come un altro token....sbaglio?
E' per questo che utilizzavo il metodo substring...così anche nel caso in
cui i nomi venissero modificati funzionerebbe lo stesso, pur restando cmq
entro i limiti di caratteri.
Grazie!
Ciao!

 ha scritto nel messaggio
news:b2ttn0$1fhbr8$1...@ID-147723.news.dfncis.de...

Comunque l'errore non era quello, io l'ho modificato per uniformità con il
resto del codice, in effetti se il nome dell'azione è formato da più parole
è corretto leggere una stinga di lunghezza assegnata. Apparentemente il
codice sembra corretto a parte la riga:
String numbers = action.substring(12);
che ho modificato in
String numbers = action.substring(11,action.length());
per leggere sino in fondo la stringa rimanente.
Ciao.
Luciano.
