Lettura da file

di il
21 risposte

21 Risposte - Pagina 2

  • Re: Lettura da file

    Ho deciso che implementerò anche i modelli, non una lista completa, sarebbe impossibile da fare ora e in poco tempo, ma qualcuno almeno.
    così dovrò variare un pochino il progetto
  • Re: Lettura da file

    Buonasera a tutti
    ebbene si son tornato!
    sempre con lo script automobili! comincio a odiare la programmazione ahahaha e dire che ho deciso che diventerò programmatore di giochi una volta trasferito ahahaha
    ma passiamo alla questione
    mi son, finalmente, costruito il file con le marche delle auto, e quello con i modelli (non è esattamente un lavoro fine, e ad ogni modo ci ho messo un massimo di 10 modelli per marca)
    ora volevo crearmi la mia bella matrice utilizzando lo scanner per la lettura da file e lo split per separare i vari elementi.
    riporto il codice sotto
    
    String modelli[][] = new String[80][15];
    try
    		{
    			Scanner reader = new Scanner(new FileReader("Modelli.txt"));
    			System.out.println(reader);
    			for (int i = 0; reader.hasNextLine(); i++)
    			{
    				String line[] = reader.nextLine().split(",");
    				for (int k = 0; reader.hasNext(); k++)
    				{
    					modelli[i][k] = line[k];
    					System.out.println(modelli[i][k]);
    				}
    			}
    		}
    		catch (FileNotFoundException e)
    		{
    			System.out.println(e);
    			//e.printStackTrace();
    		}
    
    allego anche il file.

    la riga 35 è questa: modelli[k] = line[k];

    una breve spiegazione
    il file di testo è formato da 80 righe e un minimo di 2, fino a un massimo di 11 elementi per riga
    e quindi credo che l'unica soluzione per poter fare un'assegnazione ad una matrice sia questa (poi magari mi sbaglio eh)
    però con il metodo hasNext() arrivato alla fine della prima riga, mi da errore. lo allego al post
    l'errore, dopo averci riflettuto bene, non l'ho capito.
    ora, sono abbastanza sicuro che quando qualcuno di voi lo vedrà, e dirà di che si tratta, sicuramente sarà qualcosa che ho pensato ma che non ho pensato giusta.
    chiedo il vostro lume gentiluomini

    EDIT:
    ho provato anche a far girare il secondo for mettendo come condizione k <= 10, ma così facendo avrei dovuto editare il file di testo mettendo un sacco di spazi e virge in più sulle righe che non contengono 11 elementi.
    ho inoltre provat ad aumentare la grandezza della matrice senza risultato.
    credo che il problema sia si line ma non riesco a capire

    Allegati:
    22492_0f42ce3a7d79a5785fc4a2a7f7e16088.jpg
    22492_0f42ce3a7d79a5785fc4a2a7f7e16088.jpg
  • Re: Lettura da file

    Come hai intuito il problema è la condizione del for interno:
    
    String line[] = reader.nextLine().split(",");
    for (int k = 0; reader.hasNext(); k++) {
    // ...
    
    Perché usare hasNext ()? Il metodo hasNext () restituirà true fino a quando lo Scanner vedrà che esiste un token successivo, quindi sforerai presto dall'array che hai istanziato. Nell'edit scrivi che hai provato a mettere k <= 10, ma giustamente se mancano alcuni dati il problema si ripresenta.
    La soluzione è semplice: ti basta controllare il numero di elementi che è contenuto dentro al vettore line, che ha tutti i token della singola riga ...
  • Re: Lettura da file

    Si ci ho provato.
    ho provato a usare length(line) ma ancora non funziona.
    ho provato a importare la classe arrays, fare un Array.getLength(line) ma non mi vede la classe array ahahaha *sconforto* forse sbaglio qualcosa, comunque se metto il length nella condizione del for mi da errore, ho quindi provato a metterlo in una variabile e poi a far ciclare il for fino a quando k è minore della variabile ma nada

    EDIT:
    ok, il problema del for con la grandezza del vettore era che mettevo "<=" il che faceva eccedere, ora però mi ridà comunque errore alla penultima riga mmh

    bella funziona!
    però mi propone sempre la stessa stringa che ora riporto qua:
    
    java.util.Scanner[delimiters=\p{javaWhitespace}+][position=0][match valid=false]
    [need input=false][source closed=false][skipped=false][group separator=\.][decim
    al separator=\,][positive prefix=][negative prefix=\Q-\E][positive suffix=][nega
    tive suffix=][NaN string=\Q?\E][infinity string=\Q?\E]
    
    quando facevo lo stesso test con il file automobili, non mi ha mai dato una scritta simile. da cosa dipende?
  • Re: Lettura da file

    Io mi riferivo semplicemente a line.length, non serve passare per altri metodi vari.

    E quella riga che vedi è dovuta al fatto che stai (implicitamente) richiamando il toString della classe Scanner con la stampa a video dell'oggetto scanner:
    
    System.out.println(reader);
    
    Questa istruzione è totalmente inutile ...
  • Re: Lettura da file

    Ansharja ha scritto:


    Io mi riferivo semplicemente a line.length, non serve passare per altri metodi vari.

    E quella riga che vedi è dovuta al fatto che stai (implicitamente) richiamando il toString della classe Scanner con la stampa a video dell'oggetto scanner:
    
    System.out.println(reader);
    
    Questa istruzione è totalmente inutile ...
    non mi ero minimamente accorto che c'era ancora quella riga di codice la ahahahahha
    grazie mille
  • Re: Lettura da file

    Posso chiedere se qualcuno è così gentile da spiegarmi brevemente lo scanner? fondalmentalmente ho capito come funziona, però pare non lo abbia capito bene, e onestamente cercando online, e sulla guida oracle, non ci ho capito molto di più

    EDIT:
    per esempio, se ho un file con diversi scaglioni di prezzi (lo allego), come posso assegnare a una piccola matrice, scaglioni[7][2], alla colonna 0 il primo valore, e alla colonna 1 il secondo valore? leggendo normalmente lo scanner me li rileva come int, ma al contrario di split, non mi crea un arrey per gestire i vari valori, quindi ho pensato a una cosa simile
    
    int scaglioni[][] = new int[15][2];
    
    try
    {
    	Scanner reader = new Scanner(new FileReader("Prezzi.txt"));
    	for (int i = 0; reader.hasNextLine (); i++)
    	{
    		int prezzo = reader.nextInt();
    		scaglioni[i][0] = prezzo; //prezzo minimo
    		scaglioni[i][1] = prezzo; //prezzo massimo
    	}
    }
    catch (FileNotFoundException e)
    {
    	System.out.println(e);
    	e.printStackTrace();
    }	
    
    che però non funziona
    quindi ho pensato di riarrangiarmi con una soluzione che farà accapponare la pelle a voi esperti (sono dannatamente sicuro ci siano soluzioni migliori)
    
    int scaglioni[][] = new int[15][2];
    
    try
    {
    	Scanner reader = new Scanner(new FileReader("Prezzi.txt"));
    	for (int i = 0; reader.hasNextLine (); i++)
    	{
    		for (int k = 0; k < 2; k++)
    		{
    			int prezzo = reader.nextInt();
    			scaglioni[i][k] = prezzo;
    		}
    	}
    }
    catch (FileNotFoundException e)
    {
    	System.out.println(e);
    	e.printStackTrace();
    }
    
    (e onestamente così funziona ma mi sembra alquanto bruttino)
    però, come dice il mio prof. di sistemi, siamo informatici, e quindi dobbiamo risolvere i problemi. io in un modo l'ho risolto, che sia giusto o sbagliato, migliore o peggiore di altri, questo son in grado di fare attualmente
Devi accedere o registrarti per scrivere nel forum
21 risposte