algoritmo de recuperacion de cadenas

Iniciado por m@o_614, 5 Agosto 2014, 22:16 PM

0 Miembros y 1 Visitante están viendo este tema.

m@o_614

Saludos

Tengo que diseñar un algoritmo para ir recuperando unas cadenas de caracteres de un archivo pedido por el usuario. Un ejemplo del archivo sería:

char nombreVariable;

el codigo que yo tengo lo que hace es que va recorriendo el archivo caracter por caracter y si se encuentra un espacio en blanco o un signo de coma ', ' o de punto y coma ';',quiere decir que ha encontrado una cadena. En el ejemplo que puse las cadenas serian

char, nombreVariable y tambien el ;

Pero para el algoritmo que tengo solo obtiene las cadenas char y nombreVariable. El punto y coma no lo puede imprimir, y no se como cambiar el algoritmo que tengo:

este es el primer ciclo que me tiene que leer caracter por caracter hasta el final de archivo:

Código (java) [Seleccionar]
while((car = af.read()) != -1)
{
componenteLexico = Clase.leerArchivo(nombreArchivo,af);
System.out.print("[" + componenteLexico + "]");
}


y este es en el que me concatena los caracteres hasta que se encuentra con el caracter ' ' o ';'.

Código (java) [Seleccionar]
public static String leerArchivo(String nombre,RandomAccessFile r)
{
int car;
char c;
long posicion;
String cadena = null;
StringBuilder sb = new StringBuilder();
try
{
posicion = r.getFilePointer();
r.seek(posicion-1);
    while((car = r.read()) != -1 && car != ' ')
    {
    if(!esSignoPuntuacion(car))
    {
    c = (char)car;
            sb.append(c);
    }
    }
    cadena = sb.toString();
}
catch(IOException ex)
{
System.out.println("No se pudo abrir archivo");
}
return cadena;
}

public static boolean esSignoPuntuacion(int car)
{
if(car == ',' || car == ';' || car == '.')
   return true;
else
   return false;
}


gracias

Xandrete

#1
Bueno, primero fíjate en una cosa. No te solucionará el problema, pero puedes eliminar tranquilamente el parámetro nombre (de tipo String) de la función leerArchivo, ya que no lo usas y no te hace falta para nada.

Otra cosa es que cuando se invoca a leerArchivo, el archivo ya se encuentra abierto (si no, no hubieras podido crear el objeto RandomAccessFile r). Por tanto, en el catch la explicación "No se pudo abrir el archivo" es errónea y puede dar lugar a confusión. Si hay una excepción en ese punto, y por pantalla ves "No se pudo abrir el archivo", puede llevarte un tiempo llegar a la conclusión de que en realidad sí que se ha abierto, y que el error es otro. Por tanto, te recomendaría un ex.printStackTrace() en ese punto, si el programa se encuentra en fase experimental (te imprime la línea en que se produjo la excepción, la excepción en sí misma y la pila de activación, es muy útil en fases experimentales del desarrollo).

Y ya respondiendo a tu pregunta, fíjate en que tal y como está ahora, es totalmente imposible que leerArchivo te devuelva un signo de puntuación. Observa. Tal y como está ahora, si le pusieras una entrada:

char nombreVariable; Cosa

te devuelve "char", "nombreVariable" y "Cosa", pero la única razón por la que te devuelve esto es porque hay un espacio después del ;

Con

char nombreVariable;Cosa

obtendrías "char" y "nombreVariableCosa"

Lo que hace tu código ahora mismo es ignoral las , y los ;, no incorporándolos a la palabra en curso (pruébalo de todas formas, por si acaso, lo he hecho a ojímetro porque no tengo Java instalado en este ordenador).

Una posible solución es modificar tu leerArchivo para que al principio, antes de entrar en el while, compruebe si el carácter actual es un ; o una , en cuyo caso ha de devolverlo directamente. Si, por el contrario, empieza a leer letras y luego se encuentra con un ; o una , has de dejar de leer y hacer retroceder el puntero de lectura del archivo una posición, para que la próxima vez que invoques al leerArchivo te encuentres al punto y coma o a la coma en la posición actual.

Saludos