Visualizzazione dei risultati da 1 a 8 su 8

Discussione: Lettura File Java

  1. #1

    Lettura File Java

    Salve a tutti,
    sto facendo un programmino per la gestione di un'enoteca. Questo è il testo:

    Si supponga che esista il file vini.txt, contenente la situazione iniziale del magazzino strutturata nel modo seguente:
    <nome_vino> <annata> <prezzo> <numero_bottiglie>
    il numero di righe del file non è noto a priori. Tutti e quattro i campi di una riga sono stringhe di al più 20 caratteri che non contengono spazi.
    Dopo aver caricato in memoria il database, il programma deve presentare all’utente un menù (meglio se grafico) con le seguenti opzioni:
    1. Tasti <R/r> ricerca per <nome> (restituisce, se presente nel database,
    annata, prezzo e numero di bottiglie disponibili).
    2. Tasti <V/v> vendita di <n> bottiglie (possibile solo se il prodotto esiste
    e se disponibile nella quantità richiesta; ci fossero meno bottiglie di
    quelle richieste la transazione deve considerarsi impossibile).
    3. Tasti <I/i> inserzione di <n> bottiglie di un vino (se il vino è già
    presente nel database, si deve semplicemente incrementare il
    contatore delle bottiglie).
    4. Tasti <S/s> salvataggio sul file vini.txt del database.
    5. Tasti <Q/q> uscita dal programma (senza salvare).

    Ho creato tre classi: Enoteca, Menu e Vini.
    Ora non sto utilizzando i database e ho scritto questo codice:
    codice:
    import java.io.*;
    public class Menu{
      
      public static void main(String args[]){
        System.out.println("Inserisci il nome del file");
        Enoteca elenco = new Enoteca();
        
        try{
          
          BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
          elenco.loadTesto(input.readLine());
          Vini vino;
          boolean loop = true;
          
          while(loop){
            System.out.println("Inserisci la scelta: ");
            String scelta = " ";
            scelta = input.readLine();
            scelta = scelta.toLowerCase();
            char choice = scelta.charAt(0);
            
            switch(choice){
              case 'r':
                System.out.println("Inserisci il nome del vino: ");
                elenco.ricerca(input.readLine());
              break;
            
              case 'v':
                try{
                  System.out.println("Inserisci il nome del vino: ");
                  String nome = input.readLine();
                  System.out.println("Inserisci l'annata: ");
                  String annata = input.readLine();
                  System.out.println("Inserisci la quantità desiderata: ");
                  int qta = Integer.parseInt(input.readLine());
                  elenco.uguale(nome, annata, qta);
                }catch(IOException e) {}
              break;
            
              case 'i':
                System.out.println("Inserisci il nome del vino: ");
                String nome = input.readLine();
                System.out.println("Inserisci l'annata: ");
                String annata = input.readLine();
                System.out.println("Inserisci la quantità: ");
                int qta = Integer.parseInt(input.readLine());
                elenco.inserisci(nome, annata, qta);
              break;
            
              case 's':
                elenco.scriviFile("vini.txt");
                loop = false;
              break;
            
              case 'q':
                loop = false;
                System.exit(0);
              break;
            
              default:
              break;
            }
          } 
        }catch(IOException e) {}
      }
    }
    
    classe Enoteca
    import java.io.*;
    import java.util.*;
    
    public class Enoteca{
      
      LinkedList lista; // = new LinkedList();
      Vini vino;
      
      public Enoteca(){
      	lista = new LinkedList();
      }
      
      public void loadTesto(String file ){
        try {
          String nome;
          String annata;
          String prezzo;
          int num_bott;
    
           BufferedReader br = new BufferedReader(new FileReader(file));
          String sc = br.readLine(); 
          StringTokenizer st;
          while (sc != null){
            
            st =  new  StringTokenizer(sc);
            
            nome = st.nextToken();
            nome = nome.toLowerCase();
            annata = st.nextToken();
            annata = annata.toLowerCase();
            prezzo = st.nextToken();
            prezzo = prezzo.toLowerCase();
            num_bott = Integer.parseInt(st.nextToken());
            lista.add(new Vini(nome, annata, prezzo, num_bott));
            sc = br.readLine();
          }
          //br.close();
        }
        catch(IOException e) {
          System.out.println("Formato del file di origine errato!\n");
          System.exit(0);
        }
      }
      
    
      public void ricerca(String nome){
        Iterator i = lista.iterator();
        int count = 0;    
          while(i.hasNext()){
            Vini wine;
            wine = (Vini)i.next();
            if((wine.esisteNom(nome))){
              wine.stampa();
              count++;
            }
          }
          if(count == 0)
            System.out.println("Il vino non è presente nell'elenco");
      }
      
      public void uguale(String nome, String annata, int qta){
        Iterator i = lista.iterator();
        Vini vino;
        int count = 0;
          while(i.hasNext()){
            vino = (Vini)i.next();
            if(vino.esisteNom(nome) && vino.esisteAnn(annata)){
              if(vino.verificaQta(qta)){
                System.out.println("L'operazione è andata a buon fine");
                
              }
              else
                System.out.println("La quantità presente non è sufficiente");
            }count ++;
            
          }
        if (count == 0)
          System.out.println("Il vino non è presente");
      }
      
      public void inserisci(String nome, String annata, int qta){
        Iterator i = lista.iterator();
        Vini vino;
        int count = 0;
          while(i.hasNext()){
            vino = (Vini)i.next();
            if(vino.esisteNom(nome) && vino.esisteAnn(annata)){
              vino.incrementaQta(qta);
              count ++;
            }
          }
          if (count == 0)
            System.out.println("Il vino non è presente");
      }
        
      public void scriviFile(String file){
        Iterator it = lista.iterator();
        try{
          PrintStream out = new PrintStream(new FileOutputStream("risultati.txt"));
          while (it.hasNext()) {
    				Vini v = (Vini)it.next();
    				out.println(v);
    			}
        }
        catch(FileNotFoundException e){
          System.out.println(e);
          System.exit(0);
        }
      }
    }
    
    classe Vini
    
    public class Vini{
      private String nome;
      private String annata;
      private String prezzo;
      private int num_bott;
      
      public Vini(String nome, String annata, String prezzo, int num_bott){
        this.nome = nome;
        this.annata = annata;
        this.prezzo = prezzo;
        this.num_bott = num_bott;
      }
      
      public void stampa() {
        System.out.println("annata: "+this.annata+" "+"prezzo: "+this.prezzo+" "+"numero di bottiglie: "+ this.num_bott);
    	}
      
      public boolean verificaQta(int qta){
        if((this.num_bott) >= qta){
          this.num_bott -= qta;
          return true;
        }
        return false;
      }
      
      public void incrementaQta(int qta){
        this.num_bott += qta;
      }
      
      public boolean esisteNom(String name){
        if((this.nome).equals(name)){
          return true;
        }else{
        return false;
        }
      }
      
      public boolean esisteAnn(String annata){
        if((this.annata).equals(annata))
          return true;
        return false;
      }
      
      public String toString() {
        String str = new String(this.nome+" "+this.annata+" "+this.prezzo+" "+this.num_bott);
        return(str);
      }
    }
    ho creato un file "Vini.txt" , ma quando tento di eseguire il programma mi da l'errore "Formato del file di origine errato!".
    Sbaglio qualcosa nella lettura del file?
    Grazie

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: Lettura File Java

    Originariamente inviato da franceskaaaz
    ho creato un file "Vini.txt" , ma quando tento di eseguire il programma mi da l'errore "Formato del file di origine errato!".
    Sbaglio qualcosa nella lettura del file?
    Non ho letto tutto il codice ma se oltre a stampare "Formato del file di origine errato!" stampi anche lo stack trace dell'eccezione magari si capisce cosa è successo

    e.printStackTrace()


    edit:

    comunque cose come
    codice:
    public boolean esisteAnn(String annata){
        if((this.annata).equals(annata))
            return true;
        return false;
    }
    sono orrende da vedere, duplichi codice inutilmente quando basta fare

    codice:
    public boolean esisteAnn(String annata){ 
        return this.annata.equals(annata);
    }
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    grazie del consiglio
    comunque l'eccezione è:
    exception in thread main java.util.nosuchelementexception
    at java.util.StringTokenizer.nextToken(Unknow Source)
    at Enoteca.loadTesto(Enoteca.java:32)
    at Menu.main(Menu.java:13)

    ma non capisco cosa sia...

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    L'errore è chiaro: stai richiedendo un token che non esiste.
    Che stringa stai tokenizzando?
    Qual è la riga 32 di Enoteca.java?

    ps: sistema il tag code, così è illeggibile...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    codice:
    public void loadTesto(String file ){
        try {
          String nome;
          String annata;
          String prezzo;
          int num_bott;
    
           BufferedReader br = new BufferedReader(new FileReader(file));
          String sc = br.readLine(); 
          StringTokenizer st;
          while (sc != null){
            
            st =  new  StringTokenizer(sc);
            
            nome = st.nextToken();
            nome = nome.toLowerCase();
            annata = st.nextToken();
            annata = annata.toLowerCase();
            prezzo = st.nextToken();
            prezzo = prezzo.toLowerCase();
            num_bott = Integer.parseInt(st.nextToken());
            lista.add(new Vini(nome, annata, prezzo, num_bott));
            sc = br.readLine();
          }
          //br.close();
        }
        catch(IOException e) {
          System.out.println("Formato del file di origine errato!\n");
    	e.printStackTrace();
    
          System.exit(0);
        }
      }
    la riga 32 è questa :
    codice:
     prezzo = st.nextToken();

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Ok, ma che stringa ti arriva? Perché sembra che manchi un pezzo...

    Fai una cosa: all'inizio di quel while fatti stampare il valore di sc e vediamo cosa ti arriva


    ps1: al posto di StringTokenizer è preferibile il metodo split() di String. Comunque non è qui il problema

    ps2: quel while può essere riscritto così:

    codice:
    BufferedReader br = new BufferedReader(new FileReader(file));
    String sc = null;
    
    while ( (sc = br.readLine() ) != null ) {
        // operazioni 
    }
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #7
    allora per vedere gli errori ho scritto -Xlint e in output:
    codice:
    .\Enoteca.java:7: warning: [rawtypes] found raw type: LinkedList
      LinkedList lista; // = new LinkedList();
      ^
      missing type arguments for generic class LinkedList<E>
      where E is a type-variable:
        E extends Object declared in class LinkedList
    .\Enoteca.java:11: warning: [rawtypes] found raw type: LinkedList
            lista = new LinkedList();
                        ^
      missing type arguments for generic class LinkedList<E>
      where E is a type-variable:
        E extends Object declared in class LinkedList
    .\Enoteca.java:35: warning: [unchecked] unchecked call to add(E) a
    the raw type LinkedList
            lista.add(new Vini(nome, annata, prezzo, num_bott));
                     ^
      where E is a type-variable:
        E extends Object declared in class LinkedList
    .\Enoteca.java:50: warning: [rawtypes] found raw type: Iterator
        Iterator i = lista.iterator();
        ^
      missing type arguments for generic class Iterator<E>
      where E is a type-variable:
        E extends Object declared in interface Iterator
    .\Enoteca.java:65: warning: [rawtypes] found raw type: Iterator
        Iterator i = lista.iterator();
        ^
      missing type arguments for generic class Iterator<E>
      where E is a type-variable:
        E extends Object declared in interface Iterator
    .\Enoteca.java:85: warning: [rawtypes] found raw type: Iterator
        Iterator i = lista.iterator();
        ^
      missing type arguments for generic class Iterator<E>
      where E is a type-variable:
        E extends Object declared in interface Iterator
    .\Enoteca.java:100: warning: [rawtypes] found raw type: Iterator
        Iterator it = lista.iterator();
        ^
      missing type arguments for generic class Iterator<E>
      where E is a type-variable:
        E extends Object declared in interface Iterator
    7 warnings
    può dipendere dalla lista?

  8. #8
    Ho risolto in questo modo:
    codice:
    BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
           elenco.loadTesto("vini.txt");
          //elenco.loadTesto(input.readLine());
          Vini vino;
          boolean loop = true;
    In questo modo faccio leggere direttamente il file e mi funziona tutto correttamente.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.