• Domingo 22 de Diciembre de 2024, 07:58

Autor Tema:  Problema De Stream ???  (Leído 2768 veces)

danijr78

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Problema De Stream ???
« en: Viernes 28 de Abril de 2006, 20:24 »
0
Tengo un problema al ejecutar el siguiente código.
El nombre del archivo se obtiene bien por el diálogo pero después algo falla con el stream...

private StreamReader sr; // variable de clase

private void miFich_Click(object sender, System.EventArgs e)
{         
   if(ofdFich.ShowDialog()==System.Windows.Forms.DialogResult.OK && ofdFich.FileName!="")
   {
      string nom = ofdFich.FileName;
      FPrincipal.ActiveForm.Text+= nom;         
      sr= new StreamReader(nom);         
      if(ap.suPista().estaLibre())
         leerAvion();
   }
}
public void leerAvion()
{         
   string cad=null;
   do
   {
      cad=sr.ReadLine();         
   }
      while(cad==null);         
   string[] cpo= cad.Split(',');
   Avion av= null;
--   if( cpo[1].Trim().ToUpper().StartsWith("COM"))// ERROR INDICE
                            // FUERA DE LIMITES                      
         
{...}   
}

La excepción se produce porque el Split solo guarda un string en cad y no existe cad[1].
En el debugger el contenido de cad al producirse la excepción es algo así:
      " \0\0\0\0\0 \0\0 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\02 \0\0\0\0\0\0... (basura)

El contenido del fichero abierto es:
   Boeing 747, comer, Valencia, Madrid, 20:45, 1234
Boeing 747, com, Valencia, BCN, 20:56, 1234
Boeing 747, pasa, Valencia, Paris, 20:59, 123, 25

Algo debe estar mal pero no lo veo...

hellscream

  • Miembro activo
  • **
  • Mensajes: 95
    • Ver Perfil
Re: Problema De Stream ???
« Respuesta #1 en: Viernes 28 de Abril de 2006, 21:19 »
0
Arregla la parte en la que lees el archivo (do...while)

danijr78

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: Problema De Stream ???
« Respuesta #2 en: Viernes 28 de Abril de 2006, 21:41 »
0
He probado a hacer simplemente cad=sr.ReadLine() en lugar de hacerlo dentro del do...while ( teoricamente la primera linea del archivo es válida porque tiene comas) y sigue dando el mismo error. Como podria arreglarlo? No entiendo muy bien a que te refieres...

hellscream

  • Miembro activo
  • **
  • Mensajes: 95
    • Ver Perfil
Re: Problema De Stream ???
« Respuesta #3 en: Viernes 28 de Abril de 2006, 23:42 »
0
Esa porción de código que te dije que arreglaras es porque cad es sobre-escrito en cada iteración del do-while, hasta que cad sea null, es decir que cad *seguramente* sea null al final de tu lectura.

No sé exáctamente como quieres procesar ese archivo, ya que si lo hicieras línea a línea deberías poner el código que te falla dentro del do-while, pero por lo que muestras, dá la impresión de que primero quieres leer todo el archivo y luego recién procesarlo...

danijr78

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: Problema De Stream ???
« Respuesta #4 en: Sábado 29 de Abril de 2006, 04:25 »
0
el metodo leerAvion debe leer UNA SOLA LINEA, guardar los campos separados por comas en un array y despues procesarlos para crear un objeto con esos argumentos.
el do...while lo puse para asegurarme de que leia una linea no vacia pero realmente solo debe leer una linea pero MANTENIENDO EL STREAM para en llamadas posteriores leer la siguiente. Es decir:
1- definir el stream al archivo del dialogo
2- leerAvion
    - leer una linea
    - separar campos
    - procesar campos
El problema sigue estando en leer una linea ya que lee basura y no hay comas...
pero...Por qué???

danijr78

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: Problema De Stream ???
« Respuesta #5 en: Lunes 1 de Mayo de 2006, 12:54 »
0
Por favor alguien puede solucionarlo? es urgente!!
Gracias por adelantado.

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Problema De Stream ???
« Respuesta #6 en: Lunes 1 de Mayo de 2006, 14:02 »
0
Hola

Debes arreglar varias cosas:

En primer lugar el null es un indicador de final de fichero y no de linea vacia, en tal caso para capturar la linea vacia puedes hacer cad.count y mirar si es igual a cero.

Por este motivo debes cambiar el bucle de lectura de lineas y poner algo asi:

Código: Text
  1.  
  2.  
  3.  while ((line = sr.ReadLine()) != null)
  4. {
  5.        // aqui ya puedes trabajar con cada linea del texto
  6. }
  7.  
  8.  
  9.  

Para procesar cada linea quitandole las comas y meterla en una estructura, yo me haria una funcion a la cual le pasas la linea como string y dentro de ella te separe cada substring y los monte en la estructura y te lo devuelva ya montado

Código: Text
  1.  
  2.  
  3. struct Avion
  4. {
  5.       string nombre;
  6.       ......
  7.       ......
  8. }
  9.  
  10.  while ((line = sr.ReadLine()) != null)
  11. {
  12.        Avion nuevoAvion=new Avion();    
  13.        Avion=MontaEstructura(line);
  14. }
  15.  
  16.  
  17.  


Haciendo esto no deberias tener problemas

un saludo  :hola:

danijr78

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: Problema De Stream ???
« Respuesta #7 en: Lunes 1 de Mayo de 2006, 17:45 »
0
Mirando el debugger y probando me he dado cuenta que las 3 primeras lineas que lee del fichero son basura y a partir de la 4º ya lee el texto. El fichero es un .doc ... alguien sabe porque pasa esto?

danijr78

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: Problema De Stream ???
« Respuesta #8 en: Lunes 1 de Mayo de 2006, 17:58 »
0
Gracias Diodo pero el problema está a la hora de definir el StreamReader.
Me interesa un SR global que debo definir dentro de un método que sólo se ejecuta una vez y después quiero hacer uso de ese SR dentro de otro método LeerAvion.
En LeerAvion sólo hay que leer UNA línea y el problema esta aquí. Después el tratamiento de la línea no hay problema.

//METODO INICIAL
if(ofdFich.ShowDialog()==System.Windows.Forms.DialogResult.OK && ofdFich.FileName!="")
{            
   sr= new StreamReader(ofdFich.FileName);
....
//METODO LEERAVION
string cad;
string[] cpo;
cad=sr.ReadLine();//ERROR NULL REFERENCE
cpo= cad.Split(',');   
Avion av= null;
            
if( cpo[1].Trim().ToUpper().StartsWith("COM"))// ERROR INDICE ARRAY FUERA LIMITES

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Problema De Stream ???
« Respuesta #9 en: Lunes 1 de Mayo de 2006, 18:24 »
0
Eso a lo que llamas basura sera una mascara de formato, o encabezado del documento, algo parecido a lo que llevan los ficheros html.
Si intentas leer un fichero html como flujo de datos te encontraras con caracteres o palabras clave que son necesarios para que el documento sea interpretado por el navegador.
Asi que tendras que apañartelas para diferenciar lo que es "basura" , de la infomacion util para ti

Respecto lo del streamreader global no lo entiendo , sorry.

danijr78

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: Problema De Stream ???
« Respuesta #10 en: Martes 2 de Mayo de 2006, 00:01 »
0
Con lo de global queria decir que es una variable de la clase que me interesa definir al principio y una sola vez, para leer la siguiente linea cada vez que sea necesario, ya que no quiero leer en un bucle sino a traves de un metodo al que se invocará en determinadas circunstancias.
No se si me explico bien, pero lo decia por si podia ser un problema definir el Stream en un metodo y utilizarlo en otro posteriormente siempre dentro de la misma clase, aunque yo creo que no deberia ser problema...
Gracias de todos modos.