Autor Tema: Problema con archivo de texto  (Leído 1736 veces)

Moyano Jonathan

  • Amigo de uControl
  • PIC16F
  • ******
  • Mensajes: 602
Problema con archivo de texto
« en: Agosto 09, 2012, 12:52:43 am »
Hola como están  ;D

En esta ocasión les traigo un problema que me tiene dando vueltas hace un par de días y no lo he podido solucionar  :duda

Lo que necesito hacer es capturar una serie de datos de un listBox y Poder guardar los datos de manera ordenada en un archivo de texto. Esto hasta ahora lo pude lograr de la siguiente manera:




Código: [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows.Forms;

namespace Prueba_capturador
{
    public partial class Form1 : Form
    {
        string data;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            data = HOMBRO.Text + "," + CODO.Text + "," + CINTURA.Text + "," + "*";
            ListaComandos.Items.Add(data);
        }

        private void button2_Click(object sender, EventArgs e)
        {
           ListaComandos.Items.Clear();
        }

        private void button3_Click(object sender, EventArgs e)
        {
           
            SaveFileDialog k = new SaveFileDialog();

            k.Filter = "*.txt COORDENADAS|*.txt";

            if (k.ShowDialog() == DialogResult.OK)
            {
                using (StreamWriter sw = new StreamWriter(k.FileName))
                {
                    foreach (object _item in ListaComandos.Items)
                    {
                        sw.WriteLine(_item);
                    }
                    sw.Close();
                }
            }
           
        }

    }
}

Hasta ahí todo lindo, el archivo generado concuerda con lo que tengo en el ListBox. Ahora hay un pequeño problema técnico a nivel bytes del archivo generado. Para poder ver donde está mi problema, uso el programa HxD: http://mh-nexus.de/en/hxd/

Lo que obtengo es lo siguiente:



Ahí se puede apreciar que el problema son último cambio de línea y retorno de carro. Igual , el tema está en mi forma de tratar el texto cuando lo leo en mi otra aplicación...

Código: [Seleccionar]
 
private void LECTURA_SETPOINT_Click(object sender, EventArgs e)
        {
            StreamReader sr = null;                     // Inicializa el constructor.

            try
            {
                sr = new StreamReader(Nombre_Archivo.Text); // Intenta crear una instancia de lectura de archivo.
            }
            catch (FileNotFoundException ex)
            {
                // En caso de no poder encontrar el archivo, muestra el mensaje correspondiente.
                MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (FileLoadException ex)
            {
                // En caso de no poder abrir el archivo, muestra el mensaje correspondiente.
                MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (ArgumentException)
            {
                // En caso de encontrar un error en la lectura del archivo.
                MessageBox.Show("Debe seleccionar un archivo válido.", Application.ProductName,
                                    MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            if (sr != null) // Si el archivo contiene secuencias válidas...
            {
                if (Arduino.IsOpen)
                {
                    LECTURA_SETPOINT.BackColor = Color.Red;                   // Cuando iniciamos la secuencia, coloca en rojo el botón de lectura.
                    string[] a = sr.ReadToEnd().Split('\r');                  // Leemos todo el archivo y separamos los datos.
                    Lista_Comandos.Text = Convert.ToString(a.Length);         // Muestra la cantidad de instrucciones presentes en el archivo.
                    DEBUG.Items.Add("CANTIDAD DE INSTRUCCIONES:");
                    DEBUG.Items.Add(Convert.ToString(a.Length));              // Lo muestra en el cuadro de debug...

                    for (i = 0; i < (a.Length); i++)
                    {                            // Lee instrucción por instrucción de forma ascendente.
                        archivo = a[i];
                        Lectura_texto.Text = archivo;                             // Leemos las instrucciones.
                        string[] b = archivo.Split(',');                          // Parseamos las instrucciones para obtener cada comando por separado.
                        CODO.Text = b[0];                                       // Comandos correspondientes al hombro.
                        HOMBRO.Text = b[1];                                         // Comandos correspondientes al codo.
                        CINTURA.Text = b[2];                                      // Comandos correspondientes a la cintura.

                        DEBUG.Items.Add("SETPOINT:");
                        // Setpoint HOMBRO + Setpoint CODO + Setpoint CINTURA + fin de instrucción.
                        buffer = CODO.Text + "," + HOMBRO.Text + "," + CINTURA.Text + "," + "*";
                        // Mostramos los comandos que se envían al Arduino en la ventana de debug.
                        DEBUG.Items.Add(buffer);

                        try
                        {
                            Arduino.Write(buffer); // Envía el paquete.
                        }
                        // En caso de que no pueda enviarlo, mostramos un mensaje de error.
                        catch
                        {
                            i = a.Length; // Forzamos al bucle for a terminar el ciclo.
                            MessageBox.Show("Error al enviar dato, puerto serie ocupado o desconectado.", Application.ProductName,
                                            MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }

                        PauseForMilliSeconds(tiempo);                               // Realiza una pausa asincrónica de 1 segundo.

                    }

                    LECTURA_SETPOINT.BackColor = Color.LimeGreen;
                    sr.Close();   // Cerramos el archivo.
                    sr.Dispose(); // Libera todos los recursos utilizados por la gestión del archivo.
                }

            }
        }

Al no poder procesar la última línea del texto (retorno de carro y cambio de línea) me genera un error insalvable  y la aplicación entra en falla. Alguien me podría dar una mano para poder solucionar el problema  :titanic

Saludos y que anden bien !

BrunoF

  • PIC16F
  • ***
  • Mensajes: 721
Re: Problema con archivo de texto
« Respuesta #1 en: Agosto 09, 2012, 02:27:06 am »
Reemplazando:

                  foreach (object _item in ListaComandos.Items)
                    {
                        sw.WriteLine(_item);
                    }

por:
                  int i;
                  for (i=1; i <= ListaComandos.Items.Count ; i++)
                    {
                       if(i < ListaComandos.Items.Count) sw.WriteLine(_item); else sw.Write(_item);
                    }

debería bastar.

Saludos.

Moyano Jonathan

  • Amigo de uControl
  • PIC16F
  • ******
  • Mensajes: 602
Re: Problema con archivo de texto
« Respuesta #2 en: Agosto 09, 2012, 01:06:08 pm »
Muchas gracias por tu respuesta bruno  ;)

Lo que hice fue lo siguiente: No modifiqué la forma en que guardo el archivo, ya que el método que yo utilizo se me hace más sencillo.
Entonces lo que pensé fue cambiar la forma en la que el archivo es leído.
Por lo tanto, si el archivo tiene una línea que no contiene información útil, le resto 1 al index de lectura, como lo muestro aquí:

Código: [Seleccionar]


// Lee instrucción por instrucción de forma ascendente.   Se le resta 1 para no tener errores en la lectura del archivo de coordenadas.

for(i=0; i < (a.Length-1); i++){                           
            archivo = a[i];
            Lectura_texto.Text = archivo;                             // Leemos las instrucciones.
            string[] b = archivo.Split(',');                          // Parseamos las instrucciones para obtener cada comando por separado.
            HOMBRO.Text = b[0];                                       // Comandos correspondientes al hombro.
            CODO.Text = b[1];                                         // Comandos correspondientes al codo.
            CINTURA.Text = b[2];                                      // Comandos correspondientes a la cintura.
            PauseForMilliSeconds(1000);                               // Realiza una pausa asincrónica de 1 segundo.
}
           

Con eso estaría solucionado mi problema  :rolleyes2: :rolleyes2:

Si tienen alguna recomendación para mejorar la forma de leer el archivo será bienvenida  :gracias:

el_vpi

  • Moderador
  • PIC18F
  • ******
  • Mensajes: 1348
Re: Problema con archivo de texto
« Respuesta #3 en: Agosto 09, 2012, 01:47:49 pm »
Jonhatan, el archivo por lo que se ve esta bien guardado. Cada linea termina con un CR/LF de manera que quede la linea completa.
Si terminaras sin el ultimo CR/LF ahi si, estaria 'incompleta' la linea.
Tene cuidado porque por ejm en unix las lineas terminan solo con CR y no como en DOS con CR/LF

Saludos, Daniel.