Se pierde los datos guardados en un rchivo txt

Iniciado por Meta, 22 Agosto 2021, 10:28 AM

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

Meta

Hola gente del foro:

¿Cómo están?

Tengo un programa que al ejecutarlo, con el teclado Enter y las flechas puedo escribir. Pulso Enter y le doy en Guardar con Enter otra vez.

Cierro el programa, lo vuelvo abrir.

Si ejecuto y cierro el programa, misteriosamente el archivo .txt está todo borrado, sobre todo si lo hago rápido.

¿Por qué ocurre esto?

¿Hay alguna forma de solucionarlo?

Código completo C#:
Código (csharp) [Seleccionar]
using System;
using System.IO;

namespace LCD_nombre_archivo_consola_12
{
    class Program
    {
        // Variables.
        static string guardarNombre = ""; // Guardar nombre escrito.
        static int coordenadaX = 0; // Coordenada X del setCursorPisition.
        static ConsoleKey tecla; // Guarda cualquier tecla pulsada.
        static int index = 0; // Índice.

        // Caracteres de este array.
        static readonly char[] roALFANUMERICO = new char[]
        {
         'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'Ñ', 'O', 'P',
         'Q', 'R', 'S', 'T', 'U', 'V', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
         'i', 'j', 'k', 'l', 'm', 'n', 'ñ', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'y',
         'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9','.', ',', '-', '_', ':', ';',
         '¿', '?', '(', ')', '[', ']', '{', '}', '<', '>', '=', '$', '&', '@', '\'', '"', ' '
        };

        // Dirección del carácter del array. El 83 presenta al espacio ' ' del array roALFANUMERICO indicado justo arriba.
        // Hay un total de 85 caracteres. Se cuenta desde el 0 al 84.
        static readonly int[] roINDICE_ARRAY = new int[]
        {
         84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84
        };

        // Palabras del array para imprimir en pantalla.
        static readonly string[] roTEXTO = new string[] { "ATRÁS", "GUARDAR" };

        static void Main(string[] args)
        {
            // Título de la pantalla.
            Console.Title = "Cambiar nombre";

            Inicio();
        }

        static void MainMenu()
        {
            Console.Clear(); // Limpiar pantalla.

            Console.SetCursorPosition(0, 0);
            Console.Write("Nombre del relé 1:  ");
            Console.SetCursorPosition(0, 1);

            // Recorre el índice del array, del 0 hasta donde llegue.
            for (int i = 0; i < roINDICE_ARRAY.Length; i++)
            {
                // Imprime los caracteres del array.
                Console.Write(roALFANUMERICO[roINDICE_ARRAY[i]]);
            }

            Console.SetCursorPosition(3, 3);
            Console.Write(roTEXTO[0]); // ATRÁS.
            Console.SetCursorPosition(12, 3);
            Console.Write(roTEXTO[1]); // GUARDAR.
        }

        #region Inicio.
        static void Inicio()
        {
            Console.SetWindowSize(20, 5); // Residemensiona pantalla. X = 20, Y = 5.
            Console.BackgroundColor = ConsoleColor.Gray; // Fondo gris.
            Console.ForegroundColor = ConsoleColor.Black; // Letras negras.

            // ¿El archivo Existe?
            if (File.Exists("Archivo.txt"))
            {
                // Sí. Lee el archivo de texto.
                string nombre = File.ReadAllText("Archivo.txt");
                int a, b; // Almacena ídice array.
                for (a = 0; a < nombre.Length; a++)
                {
                    for (b = 0; roALFANUMERICO[b] != nombre[a]; b++)
                    {
                        ;
                    }
                    roINDICE_ARRAY[a] = b; // b indica índice y lo añade al roINDICE_ARRAY.
                }
            }
            // No. El Archivo.txt no existe.
            else
            {
                // Crea un archivo nuevo, escribe el contenido en el archivo y, a continuación, lo cierra.
                // Si el archivo de destino ya existe, se sobrescribe.
                File.WriteAllText("Archivo.txt", guardarNombre);
            }

            MainMenu(); // Dibuja el menú.

            while (true)
            {
                Console.CursorVisible = true; // Cursor invisible.
                index = 0;

                // Si se cumple estas condiciones, Enter, flecha izquierda, flecha derecha
                if ((tecla == ConsoleKey.Enter) || (tecla == ConsoleKey.RightArrow) || (tecla == ConsoleKey.LeftArrow))
                {
                    MainMenu(); // Dibuja el menú.
                }

                // Posiciona cursor.
                Console.SetCursorPosition(coordenadaX, 1);

                // Almacena en la variable tecla, la tecla pulsada.
                tecla = Console.ReadKey(true).Key;

                // Si coincide una tecla pulsada.
                switch (tecla)
                {
                    case ConsoleKey.RightArrow: // Flecha derecha detectada.
                        // ¿CoordenadaX menor que 15?
                        if (coordenadaX < 15)
                        {
                            coordenadaX++; // Sí. Añada + 1 en la coordenadaX.
                        }
                        // No. Sale de aquí.
                        break;

                    case ConsoleKey.LeftArrow: // Flecha izquierda detectada.
                        // ¿coordenadaX es mayor que 0?
                        if (coordenadaX > 0)
                        {
                            coordenadaX--; // Sí. Decremente o quita -1.
                        }
                        // No. Sale de aquí.
                        break;

                    case ConsoleKey.UpArrow: // Flecha arriba.
                        roINDICE_ARRAY[coordenadaX]++; // En el índice del array añade + en coordenadaX.
                        // ¿El índice del array es mayor o igual que el array Alfanumérico?
                        if (roINDICE_ARRAY[coordenadaX] >= roALFANUMERICO.Length)
                        {
                            roINDICE_ARRAY[coordenadaX] = 0; // Sí. Deja en 0 la coordenada del índice del array.
                        }
                        Console.Write(roALFANUMERICO[roINDICE_ARRAY[coordenadaX]]);
                        break;

                    case ConsoleKey.DownArrow: // Flecha abajo detectado.
                        roINDICE_ARRAY[coordenadaX]--; // Decrementa a -1 el índice del array.
                        // ¿La coordenadaX del indice del array es menor que 0?
                        if (roINDICE_ARRAY[coordenadaX] < 0)
                        {
                            // Sí. Imprimir el valor alfanumérico.
                            roINDICE_ARRAY[coordenadaX] = roALFANUMERICO.Length - 1;
                        }
                        Console.Write(roALFANUMERICO[roINDICE_ARRAY[coordenadaX]]);
                        break;

                    case ConsoleKey.Enter: // Detecta la tecla Enter.
                        Console.SetCursorPosition(1, 3); // Posición del cursor.
                        Console.CursorVisible = false; // Se oculta el cursor.
                        Console.Write(">"); // Imprime en pantalla >.

                        // ¿La tecla almacenada es distinto a la tecla Enter?
                        while ((tecla = Console.ReadKey(true).Key) != ConsoleKey.Enter)
                        {
                            // Sí.
                            switch (tecla)
                            {
                                case ConsoleKey.RightArrow:
                                    index = 1;
                                    Console.SetCursorPosition(1, 3);
                                    Console.Write(" ");
                                    Console.SetCursorPosition(10, 3);
                                    Console.Write(">");
                                    break;
                                case ConsoleKey.LeftArrow:
                                    Console.SetCursorPosition(10, 3);
                                    Console.Write(" ");
                                    Console.SetCursorPosition(1, 3);
                                    Console.Write(">");
                                    index = 0;
                                    break;

                                case ConsoleKey.UpArrow:
                                    Inicio();
                                    break;

                                case ConsoleKey.DownArrow:
                                    Inicio();
                                    Console.SetCursorPosition(coordenadaX, 1);
                                    break;
                            }
                        }

                        if (index == 0)
                        {
                            Atras();
                        }
                        if (index == 1)
                        {
                            Guardar();
                        }
                        break;
                }
            }
        }
        #endregion

        static void Atras()
        {
            Console.Clear();
            Console.SetCursorPosition(0, 1);
            Console.Write("HAS PULSADO ATRÁS   ");
            Console.ReadKey(); // Pulse cualquier tecla para salir.
        }

        static void Guardar()
        {
            guardarNombre = "";
            Console.Clear(); // Limpia la pantalla.

            // Lee todo el contennido del array y lo guarda en guardarNombre.
            for (int a = 0; a < roINDICE_ARRAY.Length; a++)
            {
                guardarNombre += roALFANUMERICO[roINDICE_ARRAY[a]].ToString();
            }
            Console.SetCursorPosition(0, 2);
            Console.Write(guardarNombre); // Imprime el contenido.

            // Crear Archivo.txt y el contenido de guardarNombre.
            File.WriteAllText("Archivo.txt", guardarNombre);

            Console.SetCursorPosition(0, 1);
            Console.Write("HAS GUARDADO       ");

            // Pulsa otra vez tecla.
            Console.ReadKey();
        }
    }
}


Saludos camaradas.

Edito:
Ya funciona. Tenía que poner el else despuués del if, para que no se ejecute siempre, que lo tenía en el aire. Aún así voy a leer atentamente tus consejos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Serapis

#1
Hay varias cosas que conceptualmente no están bien, como llevo prisa, te respondo rápido y de pasada, por tanto sin analizar más que por encima tú código... a la noche con más trnquilidad te lo reviso mejor, pero si en lo que ahora te diga logras solucionarlo, pues mejor.

- Es raro que a los métodos de una clase los llames 'roLO_QUE_SEA', y en cambio a la clase le dejes el nombre 'Program'. Da a la clase el nombre propicio, por ejemplo 'CuerpoHumano', entonces los métodos 'Comer', 'NumeroDedos', 'Caminar', 'EstaEnfermo', suenan naturales a una clase 'CuerpoHumano'...
- Es confuso igualmente una variable 'nombre' cuyo contenido aloja todo el contenido de un fichero...
- Donde aparece declarada esa variable nombre, lees todo el texto del fichero y se lo asignas a una variable. Pero dicha variables es de cadena, luego su contenido no es un array de strings, ni siquiera un array de líneas, tampoco un array de bytes (chars), peor ahí tienes un bucle tal cual comparas con ese array 'roOTRO_LO_QUE_SEA'...
- Todo eso está en una función llamada 'Inicio', pero aún así pretendes escribir un fichero con el contenido de 'guardarNombre', que lo más probable es que sea una cadena vacía, si la función 'Inicio' hace honor a su nombre.
- Los métodos de lectura y escritura del fichero por otro lado (y es aquí donde pueda residir tu mayor problema), refiere a una ruta relativa, no a una ruta absoluta. Una ruta relativa lo es de la ruta que actualmente sea la ruta absoluta, la cual puede cambiar fuera de tu programa. (Esto es, pudiera estar siendo escrito correctamente pero vete a saber donde...).
Es preferible crear un string 'RutaAbs' = "C:\\tu ruta\al sitio que\te refieras\", así luego también una string rutaFile = "El dichoso fichero.txt", y entonces abres, lees, escribes con string ruta = RutaAbs + RutaFile... por ejemplo:
If (IO.File.Exists(ruta)); .... tendrás más posibilidades de éxito si el resto del código está bien.

- No he mirado más código que hasta llegar a esa función 'Inicio'... pudiera haber otros problemas.

Deberías intentar esforzarte por analizar lo que estás haciendo y ser capaz de describirlo en 4 líneas para que cualquiera pueda hacerse una idea sin necesidad de tener que leer todo tu código y 'despaguetizarlo'... sobretodo, otorga nombres descriptivos a las variables, funciones (y también clases, pués el nombre d ela clase debería ya sola ella dar una idea aproximada de lo que hace o se supone que ha de hacer, tampoco sobra un comentario acompañando a cada clase y función que especifique cual es el cometido de la misma, sobretodo si el nombre no se eligió adecuadamente (por ejemplo ese inicio, es muy confuso, en general la incialización de una clase debería hacerse a través de sus métodos 'New').

Si tienes tiempo y miras de corregir y luego respondes si arreglaste tus problemas bien, si no a la noche (madrugada más bien), lo reviso con más calma...

Meta

Buenas:

Ya no falla. Lo corregí arriba y dejé una descripción.



Lo que hace el programa.
1. Solo se usa las flechas del teclado y la tecla Enter.
2. Te pide que introduzcas un nombre, que puedes manejar con la flecha del teclado.
3. Cuando termines de introducir un nombre, pulsas Enter, el cursor > irá en ATRÁS como puedes ver abajo.


4. Pulsas las teclas derecha o izquierda para elegir con el cursor > en GUARDAR y pulse Enter, guardará el nombre de un archivo de texto plano con la extensión .txt. Se llama Archivo.txt.
5. Si haz pulsado la tecla Enter en > Guardar, te muestra el mensaje de abajo.


6. Se pulsa Enter otra vez y se cierra el programa.
7. Al ejecutar el programa de nuevo, lee el Archivo.txt su contenido y lo muestra en pantalla.

Hasta aquí llega.

Ya que la estructura del programa indicas que lo tengo estilo chapuza, pues intentar hacerlo la mejor manera posible.

Una vez que domine esta parte. Debo hacer un mini menú de elegir 8 relés en el cual elijo uno a uno y escribo más guardo el nombre de cada uno de ellos.

Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Serapis

#3
Ok... si has solucionado el problema, no hay necesidad de darle más vueltas, más si te comprometes a mejorar la redacción dle código.  ;-)


Todavía quiero señalarte algo... la forma de comentar, no debe ser describir de nuevo la línea, con la instrucción del lenguaje que ya hace, sino describir en términos humanos su implicación
Compara tus comentarios con los que a continuación de ellos te propongo:
 
Código (c#) [Seleccionar]

 
        {
            Console.SetWindowSize(20, 5); // Residemensiona pantalla. X = 20, Y = 5.
            Console.BackgroundColor = ConsoleColor.Gray; // Fondo gris.
            Console.ForegroundColor = ConsoleColor.Black; // Letras negras.
//------------------------------------------------------------------------
        {
            // Establece el aspecto y estilo de la consola.
            Console.SetWindowSize(20, 5);
            Console.BackgroundColor = ConsoleColor.Gray;
            Console.ForegroundColor = ConsoleColor.Black;
//------------------------------------------------------------------------
//------------------------------------------------------------------------
            // ¿El archivo Existe?
            if (File.Exists("Archivo.txt"))
            {
                // Sí. Lee el archivo de texto.
                string nombre = File.ReadAllText("Archivo.txt");
                int a, b; // Almacena ídice array.
                for (a = 0; a < nombre.Length; a++)
                {
                    for (b = 0; roALFANUMERICO[b] != nombre[a]; b++)
                    {
                        ;
                    }
                    roINDICE_ARRAY[a] = b; // b indica índice y lo añade al roINDICE_ARRAY.
                }
            }
            // No. El Archivo.txt no existe.
            else
            {
                // Crea un archivo nuevo, escribe el contenido en el archivo y, a continuación, lo cierra.
                // Si el archivo de destino ya existe, se sobrescribe.
                File.WriteAllText("Archivo.txt", guardarNombre);
            }
//------------------------------------------------------------------------           
            if (File.Exists("Archivo.txt"))
            {
                // Sí el fichero existe.... se vuelca en el array ¿...?
                int j, k;
                string nombre = File.ReadAllText("Archivo.txt");
                for (j = 0; j < nombre.Length; j++)
                {
                    for (k = 0; roALFANUMERICO[k] != nombre[j]; k++)
                    {
                        ;
                    }
                    roINDICE_ARRAY[j] = k
                }
            }
            else
            {
                // Si no existe se crea con el contenido actual de  ¿...?
                File.WriteAllText("Archivo.txt", guardarNombre);
            }


Meta

Muchas gracias y los consejos mi muy distinguido amigo.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/