Hola!

Registrándote como bakuno podrás publicar, compartir y comunicarte en privado con otros bakuos :D

Regístrame ya!

Leer un caracter en Java

Chiva_3

Bovino maduro
Desde
19 Abr 2009
Mensajes
188
Hola que tal
Quiero saber si me pueden ayudar, hago un programa en consola en Java, donde debo pedir algunos datos, el problema es que cuando leo un char, el siguiente elemento no lo puedo leer, me brinca. Yo recuerdo que en C me pasaba eso y lo solucionaba con un fflush(stdin); pero ahora en Java no se =S. Dejo parte de mi código.


Código:
System.out.println( "Ingresar la edad: " ); 
                    edad = Integer.parseInt( CLeeDatos.LeeDato() ); 
                    System.out.println( "Ingresar el sexo(F,M): " ); 
                    try { 
                        sexo = ( char ) System.in.read(); 
                        } catch ( java.io.IOException ioex ) { 
                            System.out.println( "Error en la lectura: " + 
                                    ioex.getMessage() ); 
                            break; 
                    } 
                    sexo = Character.toLowerCase( sexo ); 
                    System.out.println( "Ingresar la clave: " ); 
                    clave = CLeeDatos.LeeDato(); 
                    System.out.println( "Ingresar el médico: " ); 
                    medico = CLeeDatos.LeeDato();


Y en la consola recibo esto:



Código:
Ingresar la edad: 
20 
Ingresar el sexo(F,M): 
M 
Ingresar la clave: 
Ingresar el médico: 
Que paso aqui?


Como ven, no pude Ingresar la clave
icon_sad.gif
¿Alguien sabe como solucionarlo?

Por cierto, la clase CLeedatos es una que hemos hecho con el profesor, la he probado en varios programa y nunca me habia fallado.

Código:
package MisClases; 
import java.io.*; 
 
/** 
 * 
 * @author Ricardo 
 */ 
public class CLeeDatos 
{ 
 
        public static String LeeDato() 
        { 
                String sdato = ""; 
                InputStreamReader isr = new InputStreamReader( System.in ); 
                BufferedReader flujoE = new BufferedReader( isr ); 
 
                try 
                { 
                    sdato = flujoE.readLine(); 
                } 
                catch( IOException e ) 
                { 
                    System.err.println( "Error " + e.getMessage() ); 
                } 
 
                return sdato; 
        } 
 
}

Gracias de antemano

Saludos :mota:
 
No le veo nada malo excepto por ese "Break;". Sin él el programa me compila y corre perfecto.
 
No le veo nada malo excepto por ese "Break;". Sin él el programa me compila y corre perfecto.

Lo que pasa es que esa parte se encuentra en un switch, por eso es el break. Pero ya lo quite para probar y aún así no me funciona :cowverine:
Pongo todo el codigo aqui, gracias por contestar.

Código:
public static void menuPacientes( CDriver personal )
    {
        String nombre = "" , direccion = "" , telefono = "";
        int edad = 0;
        char sexo;
        String clave = "";
        String medico = "";
        String diagnostico = "";
        String fecha = "";
        ArrayList<String> tratamiento = new ArrayList<String>();
        int cama;
        String opciones[] = { "Nuevo paciente" , "Buscar paciente" ,
                              "Listar" , "Salir" };
        int op;
        do {
            op = 0; sexo = 'X';
            System.out.println( "Elegir una opción para los pacientes" );
            try{
                op = CMenu.menu( opciones );
            } catch( java.lang.NumberFormatException error )
            {
                System.err.println( "No insertes caracteres" );
            }
            switch( op )
            {
                case 1:
                    System.out.println( "Ingresar el nombre: " );
                    nombre = CLeeDatos.LeeDato();
                    System.out.println( "Ingresar la dirección: " );
                    direccion = CLeeDatos.LeeDato();
                    System.out.println( "Ingresar el telefono: " );
                    telefono = CLeeDatos.LeeDato();
                    System.out.println( "Ingresar la edad: " );
                    try{
                        edad = Integer.parseInt( CLeeDatos.LeeDato() );
                    } catch( java.lang.NumberFormatException error )
                    {
                        System.err.println( "No insertes caracteres." );
                        break;
                    }
                    System.out.println( "Ingresar el sexo(F,M): " );
                    try {
                        sexo = ( char ) System.in.read();
                        } catch ( java.io.IOException ioex ) {
                            System.out.println( "Error en la lectura: " +
                                    ioex.getMessage() );
                    }
                    sexo = Character.toLowerCase( sexo );
                    System.out.println( "Ingresar la clave: " );
                    clave = CLeeDatos.LeeDato();
                    System.out.println( "Ingresar el médico: " );
                    medico = CLeeDatos.LeeDato();
                    System.out.println( "Ingresar el diagnostico: " );
                    diagnostico = CLeeDatos.LeeDato();
                    System.out.println( "Ingresar la fecha de ingreso: ");
                    fecha = CLeeDatos.LeeDato();
                    System.out.println( "Ingresar la cama: " );
                    try{
                        cama = Integer.parseInt( CLeeDatos.LeeDato() );
                    } catch( java.lang.NumberFormatException error )
                    {
                        System.err.println( "No insertes caracteres." );
                        break;
                    }
                    char c = 's';
                    do {
                        System.out.println( "Ingresar el tratamiento: " );
                        tratamiento.add( CLeeDatos.LeeDato() );
                        System.out.println( "¿Ingresar otro tratamiento?"+
                                            "[S,N]: " );
                        try {
                            c = ( char ) System.in.read();
                        } catch ( java.io.IOException ioex ) {
                            System.out.println( "Error en la lectura: " +
                                    ioex.getMessage() );
                        }
                        c = Character.toLowerCase( c );
                    } while ( c != 'n' );
                    try {
                        personal.nuevaPersona( nombre , direccion ,
                                telefono , edad , sexo , clave , medico ,
                                diagnostico , fecha , tratamiento , cama);
                    } catch ( CExcepcion e ) {
                        System.out.println( e.getMessage() );
                    }
                    break;
                case 2:
                    System.out.println( "Nombre del paciente: " );
                    nombre = CLeeDatos.LeeDato();
                    try {
                        personal.consulta(nombre ,
                                CPaciente.class.getName());
                        busquedaP( personal , nombre );
                    } catch ( CExcepcion e ) {
                        System.out.println( "Intente de nuevo." );
                    }
                    break;
                case 3:
                    personal.listarPersonas( CPaciente.class.getName() );
                    break;
                default:
                    break;
            }
        } while ( op != 4 );
    }

Saludos
 
Lo intenté con una versión reducida:

public class Algo {

public static void main(String[] args) {
String nombre = "", direccion = "", telefono = "";
int edad = 0;
char sexo;
String clave = "";
String medico = "";
String diagnostico = "";
String fecha = "";

System.out.println("Ingresar la clave: ");
clave = CLeeDatos.LeeDato();
System.out.println("Ingresar el médico: ");
medico = CLeeDatos.LeeDato();
System.out.println("Ingresar el diagnostico: ");
diagnostico = CLeeDatos.LeeDato();
System.out.println("Ingresar la fecha de ingreso: ");
fecha = CLeeDatos.LeeDato();
System.out.println("Ingresar la cama: ");
fecha = CLeeDatos.LeeDato();
}
}

Con la misma clase CLeeDatos que pusiste arriba y me compila bien, incluso funciona perfecto:

run:
Ingresar la clave:
clave0102
Ingresar el médico:
nombre del doctor
Ingresar el diagnostico:
se siente muy mal
Ingresar la fecha de ingreso:
12/12/2010
Ingresar la cama:
la del fondo a la derecha
GENERACIÓN CORRECTA (total time: 26 seconds)

Y tu código se ve bien, no le veo errores.

De casualidad, que IDE utilizas?
Eh compilado todo usando NetBeans y anda perfecto.
 
También uso el NetBeans 6.9.1 =S

Lo que sucede es que el problema viene cuando intento leer un char. Como el sexo. Despues al intentar leer la clave es cuando se brinca :starwars:
 
Muy bien, encontré el detalle que mencionas xD
Lo solucioné así, espero te sirva:
try {
sexo = CLeeDatos.LeeDato().charAt(0);
} catch (Exception e) {
System.out.println("Error en la lectura: "
+ e.getMessage());
}
Si no te gusta podemos buscar otro método.
 
Eii man, muchas gracias!!Jaja la verdad es que si no tuviera que enviarlo hoy antes de la medianoche ( así como la cenicienta XD ), buscaba otro método,pero por ahora es perfecto. Y funciona muy bien. Muchas gracias!!,Saludos
 
Como última observación puedes hacer un condicional para que sólo acepte 'F' o 'M' y tire error en caso contrario.
Y creo que el Try-Catch está sobrando. Suerte.
 
Volver
Arriba