Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di godx3
    Registrato dal
    Apr 2008
    Messaggi
    37

    Io

    Non capisco perchè questo codice mi dia risultati strani.
    Non ho voluto gestire le eccezzioni e me la sono cavata con la throws IOException
    Nella parte di immissione dati non capisco perchè mi incasini le println con l'nput con scanner
    Non c'è alcun problema se elimino le righe di stampa...
    Forse non ho ben capito come funziona l'oggetto scanner...
    Vi ringrazio per una cortese risposta

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.util.Formatter;
    import java.util.Scanner;

    public class Main {

    public static void main(String[] args) throws IOException {

    String nome;
    String cognome;
    int eta;
    int i;

    Formatter output = new Formatter("testo.txt");
    Scanner inputkey = new Scanner(System.in);


    System.out.println("Inserisci i valore:");
    i = 0;
    while(inputkey.hasNext() == true) {
    System.out.print("Inserisci il nome: ");
    nome = inputkey.next();
    System.out.print("Inserisci il cognome: ");
    cognome = inputkey.next();
    System.out.print("Inserisci l'eta: ");
    eta = inputkey.nextInt();

    output.format("%d\t\t%s\t\t%s\t\t%d\n", i,nome,cognome,eta);


    i++;
    }

    output.close();
    Scanner inputfile = new Scanner(new File("testo.txt"));
    System.out.println("Ecco i valore immessi");

    while(inputfile.hasNext() == true) {
    i = inputfile.nextInt();
    nome = inputfile.next();
    cognome = inputfile.next();
    eta = inputfile.nextInt();

    System.out.printf("%d\t%s\t\t%s\t\t%d\n", i,nome,cognome,eta);
    }
    inputfile.close();
    }

    }

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480

    Moderazione

    Forse è meglio utilizzare titoli un po' più significativi di Io...
    Segui le norme indicate dal Regolamento, in futuro.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Io

    Originariamente inviato da godx3
    Nella parte di immissione dati non capisco perchè mi incasini le println con l'nput con scanner
    System.out è un PrintStream. Per default viene creato con l'autoflush a true

    autoFlush - A boolean; if true, the output buffer will be flushed whenever a byte array is written, one of the println methods is invoked, or a newline character or byte ('\n') is written

    Dal momento che hai usato print(), allora non avviene un flush automatico (perché non rientra in uno dei casi indicati sopra). Il testo viene solamente accodato nel buffer e solo quando viene riempito totalmente allora viene flushato.

    Quindi se la intenzione è quella di usare print(), allora metti semplicemente un flush() dopo la print().


    P.S. quando usi i nuovi metodi di formattazione printf/format per il newline è meglio mettere %n, non \n. Il primo scrive la sequenza corretta per la piattaforma su cui sta "girando" l'applicazione mentre \n mette proprio solo \n e quindi il newline è nello stile Unix/Linux.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it L'avatar di godx3
    Registrato dal
    Apr 2008
    Messaggi
    37
    Ho modificato il codice sostituendo le print() con le println() e niente da fare...
    Credo che il problema sia nell'uso del metodo dell'oggetto scanner "hasNext()"
    Infatti provando con un do-while, nella prima iterazione il problema non si presenta...
    Ma non appena viene invocato il metodo hasNext si ripresentano i problemi..

    do {
    System.out.println("Inserisci il nome:");
    nome = inputkey.next();
    System.out.println("Inserisci il cognome:");
    cognome = inputkey.next();
    System.out.println("Inserisci l'eta:");
    eta = inputkey.nextInt();

    output.format("%d\t\t%s\t\t%s\t\t%d\n", i,nome,cognome,eta);


    i++;
    } while(inputkey.hasNext() == true);

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da godx3
    Credo che il problema sia nell'uso del metodo dell'oggetto scanner "hasNext()"
    Dovresti capire come funziona l'input dallo standard input in generale. Lo standard-input è "bufferizzato", qualunque testo digitato non arriva alla applicazione finché non hai premuto invio. Solo quando questo avviene allora alla applicazione arriva il testo e uno Scanner associato a System.in può capire se ci sono token e quanti/quali.

    Quando si arriva a hasNext() lo Scanner non può ancora sapere se ci sono dei token. Aspetta lì dell'input. Tu digiti ad esempio pippo pluto INVIO
    hasNext a quel punto capisce che nell'input sopra c'è almeno 1 token e ritorna.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it L'avatar di godx3
    Registrato dal
    Apr 2008
    Messaggi
    37
    Ma gli stream di output e input dovrebbero essere indipendente... continuo a non capire perchè la stampa a video risulti sfasata, anche forzandolo con un flush()

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da godx3
    Ma gli stream di output e input dovrebbero essere indipendente...
    Sì e in effetti è così. Nella prima risposta che ho dato a dire il vero mi sono dimenticato di una cosa: se non sbaglio le print() usano internamente le write() che scrivono array di byte. Quindi "dovrebbe" rientrare nei casi indicati dall'autoflush.
    Dico "dovrebbe" perché non sono sicuro e dovrei andare a controllare nel sorgente di PrintStream e nel libro Java I/O che ho.

    Originariamente inviato da godx3
    continuo a non capire perchè la stampa a video risulti sfasata, anche forzandolo con un flush()
    Ok, esempio:

    Scanner sc = new Scanner (System.in);
    System.out.println ("1)");
    System.out.println (sc.next ());
    System.out.println ("2)");
    System.out.println (sc.next ());


    Se lo avvii stampa inizialmente 1) A quel punto resta lì fermo in attesa di input.
    Digita ad esempio ciao prova INVIO

    Vedi che stampa subito velocemente:
    ciao
    2)
    prova

    È successo che solo quando hai digitato INVIO alla applicazione arriva "ciao prova". E a quel punto visto che sono 2 token, le due next() ritornano immediatamente.

    Sarebbe una cosa simile con hasNext().

    Scanner sc = new Scanner (System.in);
    if (sc.hasNext ()) { ......... }

    Resta lì fermo in attesa di input. Solo quando hai digitato: qualcosa INVIO allora l'input viene letto e Scanner può stabilire se ci sono token o no.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it L'avatar di godx3
    Registrato dal
    Apr 2008
    Messaggi
    37
    OK! Perfettamente capito! Non mi volevo convincere che hasNext() funzionasse (in linea di principio) come gli altri metodi next(), nextInt() ecc...
    D'altro canto è anche piuttosto logico visto che il buffer viene svuotato dopo il prelevamento del token...
    Grazie mille! Ho apprezzato veramente tanto l'aiuto!

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.