0 votos
por (120 puntos) en Java
Hola, tengo una duda acerca de trabajo con ficheros de texto en Java:

Tengo un fichero de texto de nombre [nombre] que almacena datos enteros, strings y caracteres, separados por comas.

Una línea del fichero equivale a 1 alumno, con su dni, letra del dni, apellidos, nombre, telefono.

Lo que quiero hacer es que al teclear un dni me aparezca la información asociada a ese alumno. Tengo esto:

<pre>
Scanner orden = new Scanner(entrada.nextLine().toUpperCase());
if (orden.hasNextInt()) {
            int x = orden.nextInt();
            Alumno a = Gestors.buscarAlumno(nombre, DNI);
            if (socio!=null)
            System.out.printf("%6d - %s%n", a.dni(), a.nombre());
            else
            System.out.printf("Error");

    }

public static Alumno buscarAlumno (String nombre, int DNI) {
            try {
            Scanner f = new Scanner(new File (nombre));

            Alumno a = null;
            boolean encontrado = false;
            while (f.hasNextLine() &amp;&amp; !encontrado) {
            socio = leerAlumno(f);
            encontrado = a.dni()==DNI;
            }
            if (encontrado) return a;
            else return null;
            }
            catch (Exception e) { return null; }
            }
Falta algo porque cuando ejecuto el programa siempre me sale error.


6 Respuestas

0 votos
por (8.5k puntos)
Buenas,

Sin entrar en si tu manera es mejor o peor, hay varias cosas que tienes incorrectas:

- No veo el código del método leerAlumno()

- El objeto Alumno a no se crea nunca por tanto siempre es null

- La variable socio no esta ni declarada

- DNI no deberia de ser un int, debería de ser un String y se compara mediante equals()

Si al corregir todo eso te sigue dando error, pega el error que obtengas.

Un saludo


0 votos
por (120 puntos)
<pre> private static Alumno leerAlumno(Scanner f) {
           int unDNI= f.nextInt();
           String unNombre = f.next();

        return new Alumno(unDNI,unNombre);
           }
-Se supone que no es if (socio!=null), sino if(a!=null).

-DNI es un entero porque son números, tipo 1039293829.


0 votos
por (8.5k puntos)
Buenas otra vez,

El problema de "socio" y "a" lo tienes en mas sitios, como aquí:

socio = leerAlumno(f);

encontrado = a.dni()==DNI;

Por otro lado, el DNI no es un número, ya que un DNI puede ser 039293829 y al guardarlo como int se perdería el 0 de la izquierda (además Java lo interpretaría como octal).

Un saludo


0 votos
por (120 puntos)
Mira, los codigos originales son estos, y a partir de aqui tngo q modificarlos segun digo abajo:

-Método buscarAlumno

Código:

<pre>
public static Alumno buscarAlumno (String nombre, int nip) {
try {
Scanner f = new Scanner(new File (nombre));

Alumno alumno = null;
boolean encontrado = false;
while (f.hasNextLine() &amp;&amp; !encontrado) {
alumno = leerAlumno(f);
encontrado = alumno.nip()==nip;
}
if (encontrado) return alumno;
else return null;
}
catch (Exception e) { return null; }
}
Método leerAlumno:

Código:

<pre>
private static Alumno leerAlumno (Scanner f) {
int nip = f.nextInt(); // Lee el valor del NIP
f.skip(" "); // Salta un espacio en blanco
return new Alumno(nip,f.nextLine());
}
Y para ejecutar tengo esto:

Código:

<pre>
Scanner orden = new Scanner(entrada.nextLine().toUpperCase());
if (orden.hasNextInt()) {
int nip = orden.nextInt();
Alumno alumno = GestorFicheroAlumnos.buscarAlumno(nombre, nip);
if (alumno!=null)
System.out.printf("%6d - %s%n", alumno.nip(), alumno.nombre());
else
System.out.printf("El NIP %d no corresponde a ningún alumno%n", nip); }
Al ejecutar eso y poner un NIP (codigo tipo el DNI), me aparece x pantalla el NIP y el NOMBRE DEL ALUMNO al lado. Tengo que hacer lo mismo pero con un fichero de texto que almacena datos así:

"DNI, LETRA DEL DNI, APELLIDOS, NOMBRE, TELEFONO"

Separados por comas, ¿cómo modifico los métodos anteriores para presentar la información de cada socio por pantalla?:S


0 votos
por (8.5k puntos)
Buenas,

Evidentemente no voy a hacer tu trabajo/tarea, este foro no es para eso, es para resolver dudas.

¿Porque hay que usar esos métodos? es un copia/pega?

Para recorrer un ficheros del tipo csv (coma separated values), bastaría con algo así:


        Scanner sc = new Scanner(new File(rutaArchivo));
        sc.useDelimiter(",");
        while (sc.hasNext()) {
           String token = sc.next();
           System.out.println(token);
        }

Espero que te sirva,

Un saludo


0 votos
por (40 puntos)
Muy buenas,

Una recomendación importante; NUNCA pongas en tu código cosas del estilo de:

...

} catch (Exception e) {

  return null;

}

...

Si tu códificación es errónea, nunca te enterarás de qué ha pasado realmente (NullPointerException, IOException, etc...), por lo que serás incapaz de depurarlo y te costará muchísimo solucionar el problema.

Captura sólo las excepciones que realmente tienes que capturar y piensa muy bien cual sería el origen de esa excepción y como debería comportarse tu SW en en ese caso. Y cuando las captures, procura soltar siempre una traza suficientemente descriptiva. Por ejemplo, bastaría con algo como:

...

} catch (LoQueSeaException e) {

  e.printStackTrace();

  ...

}

...

Si sigues estas simples normas en todos los sitios, verás como te costará muchísimo menos depurar tu código.


Preguntas relacionadas

0 votos
0 respuestas
0 votos
1 respuesta
preguntado por kikuncioo (20 puntos) Ene 28, 2016 en Java
0 votos
2 respuestas
preguntado por Lili (20 puntos) Ene 28, 2016 en Java
0 votos
1 respuesta
preguntado por jubalo (200 puntos) Ene 28, 2016 en Java
0 votos
3 respuestas
Bienvenido a Dudas de Programación, donde puedes hacer preguntas y recibir respuestas sobre los problemas más frecuentes de los lenguajes de programación, frameworks de desarrollo y bases de datos que utilices. Foro de Línea de Código

Categorías

...