Guardar y leer archivo txt

  • Autor Autor Meta
  • Fecha de inicio Fecha de inicio
M

Meta

Alfa
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Opciones03.jpg

Usando C# en modo consola, se puede señalar con las flechas del teclado seleccionar alguna opción con esto >. Solo debe estar marcado con una x.

La idea es, al ejecutar el programa, si no encuentra el archivo.txt, lo cree y escribe la opción marcada con la x.

Al volver a ejecutar el programa, me indica la opción marcada que leyó en el archivo.txt.

Código que he hecho hasta ahora pero no lee, si lo crea es este:
using System;
using System.IO;

namespace Pruebas_Opciones_Consola_02
{
internal class Program
{
static void Main(string[] args)
{
#region Configuración ventana.
// Título de la ventana.
Console.Title = "Opciones";

// Tamaño de la ventana, x, y o, ancho y alto.
const byte ancho = 20, alto = 5;
Console.SetWindowSize(ancho, alto);

// Quitar scroll laterales. Derecho y abajo.
Console.SetBufferSize(ancho, alto);

// Color de fondo.
Console.BackgroundColor = ConsoleColor.Yellow;

// Color de las letras.
Console.ForegroundColor = ConsoleColor.Black;

// Limpiar pantalla y dejarlo todo en color de fondo.
Console.Clear();

// Visible el cursor. // No! Así lo haces invisible.
Console.CursorVisible = false;
#endregion

string[] opciones =
{
" ** TÍTULO ** ", // Posición 0.
" ( ) Opción A ", // 1
" ( ) Opción B ", // 2
" ( ) Opción C ", // 3
" SALIR ", // 4
">", // 5
"x", // 6
" ", // 7
" " // 8
};
string opA = "x";
string opB = " ";
string opC = " ";

Menu();

#region Opociones, selecciones y guardar archivo .txt
void OpcionesA()
{
Console.SetCursorPosition(0, 0);
Console.Write(opciones[0]); // ** TÍTULO **
Console.SetCursorPosition(0, 1);
Console.Write(opciones[1]); // ( ) Opción A
Console.SetCursorPosition(0, 2);
Console.Write(opciones[2]); // ( ) Opción B
Console.SetCursorPosition(0, 3);
Console.Write(opciones[3]); // ( ) Opción C
}

void OpcionesB()
{
Console.SetCursorPosition(0, 1);
Console.Write(opciones[4]); // SALIR
Console.SetCursorPosition(0, 2);
Console.Write(opciones[8]); //
Console.SetCursorPosition(0, 3);
Console.Write(opciones[8]); //
}

void SelectorA()
{
Console.SetCursorPosition(0, 1);
Console.Write(opciones[5]); // >
Console.SetCursorPosition(0, 2);
Console.Write(opciones[7]);
Console.SetCursorPosition(0, 3);
Console.Write(opciones[7]);
}

void SelectorB()
{
Console.SetCursorPosition(0, 1);
Console.Write(opciones[7]);
Console.SetCursorPosition(0, 2);
Console.Write(opciones[5]); // >
Console.SetCursorPosition(0, 3);
Console.Write(opciones[7]);
}

void SelectorC()
{
Console.SetCursorPosition(0, 1);
Console.Write(opciones[7]);
Console.SetCursorPosition(0, 2);
Console.Write(opciones[7]);
Console.SetCursorPosition(0, 3);
Console.Write(opciones[5]); // >
}
#endregion

void Menu()
{
sbyte indiceSeleccionado = 0; // Índice seleccionado de cada opción del menú.
bool salir = false; // Para salir del menú principal al INICIO.
sbyte SELECCION_OPCIONES_TOTALES = 3; // Total de opciones para seleccionar y fija.

// Capturar tecla para luego validar.
ConsoleKey tecla;

// Crear archivo y guarda el * seleccioinado en él.
if (File.Exists("Archivo.txt"))
{
string data = File.ReadAllText("Archivo.txt");
opA = Convert.ToString(data);
opB = Convert.ToString(data);
opC = Convert.ToString(data);
}

do
{
//******************************************************************
// Dibujo el menú principal.

switch (indiceSeleccionado)
{
case 0:
OpcionesA();
SelectorA();
Console.SetCursorPosition(3, 1);
Console.Write(opA);
Console.SetCursorPosition(3, 2);
Console.Write(opB);
Console.SetCursorPosition(3, 3);
Console.Write(opC);
break;

case 1:
OpcionesA();
SelectorB();
Console.SetCursorPosition(3, 1);
Console.Write(opA);
Console.SetCursorPosition(3, 2);
Console.Write(opB);
Console.SetCursorPosition(3, 3);
Console.Write(opC);
break;

case 2:
OpcionesA();
SelectorC();
Console.SetCursorPosition(3, 1);
Console.Write(opA);
Console.SetCursorPosition(3, 2);
Console.Write(opB);
Console.SetCursorPosition(3, 3);
Console.Write(opC);
break;

case 3:
OpcionesB();
Console.SetCursorPosition(0, 1);
Console.Write(opciones[5]); // >
break;
default:
Console.Write("Fuera de rango. ");
break;
}

// Fin de pintar el menú principal.
//******************************************************************

// Leer tecla ingresada por el usuario.
tecla = Console.ReadKey(true).Key;

// Validar el tipo de tecla.
if (tecla == ConsoleKey.Enter)
{
switch (indiceSeleccionado)
{
case 0:
opA = "x"; opB = " "; opC = " ";
// Si pulsa Enter, escribes en el archivo.
if (tecla == ConsoleKey.Enter)
{
File.WriteAllText("Archivo.txt", opA.ToString());
}
break;

case 1:
opA = " "; opB = "x"; opC = " ";
// Si pulsa Enter, escribes en el archivo.
if (tecla == ConsoleKey.Enter)
{
File.WriteAllText("Archivo.txt", opB.ToString());
}
break;

case 2:
opA = " "; opB = " "; opC = "x";
// Si pulsa Enter, escribes en el archivo.
if (tecla == ConsoleKey.Enter)
{
File.WriteAllText("Archivo.txt", opC.ToString());
}
break;

case 3:
indiceSeleccionado = 0; // Restaurar índice antes de salir.
salir = true; // Salir.
break;

default:
Console.Write("Fuera de rango. ");
break;
}
}

// ¿Has pulsado tecla flecha Abajo?
if (tecla == ConsoleKey.DownArrow)
{
indiceSeleccionado++;
}

// Entonces si pulsas tecla flecha Arriba.
if (tecla == ConsoleKey.UpArrow)
{
indiceSeleccionado--;
}

// Si está en la última opción, salta a la primera.
if (indiceSeleccionado > SELECCION_OPCIONES_TOTALES)
{
indiceSeleccionado = 0;
}

// Si está en la primera posición, salta a la última.
if (indiceSeleccionado < 0)
{
indiceSeleccionado = SELECCION_OPCIONES_TOTALES;
}

// Uso la tecla escape como salida.
} while (!salir);
}
}
}
}
 
Tu codigo esta bien, solo necesita unos cmabios.

Prueba haciendo estos ajustes colega.

Tienes un problema potencial de índice fuera de límites en tu menu. Tu variable SELECCION_OPCIONES_TOTALES está establecida en 3, pero sus opciones de menu incluyen en realidad 4 opciones (0 a 3).

Asi que cambia esto:
if (indiceSeleccionado > SELECCION_OPCIONES_TOTALES)

Por esto:
if (indiceSeleccionado > 3)

Asegurate de que las llamadas de File.WriteAllText se utilizan correctamente. Es posible que estes deseando comprobar si el archivo se puede crear o si tiene permisos para escribir en él.

C#:
if (tecla == ConsoleKey.Enter)
{
    switch (indiceSeleccionado)
    {
        case 0:
            opA = "x"; opB = " "; opC = " ";
            break;

        case 1:
            opA = " "; opB = "x"; opC = " ";
            break;

        case 2:
            opA = " "; opB = " "; opC = "x";
            break;

        case 3:
            indiceSeleccionado = 0; // Restaurar índice antes de salir.
            salir = true; // Salir.
            break;

        default:
            Console.Write("Fuera de rango. ");
            break;
    }
    // Guardar en archivo solo después de actualizar la opción seleccionada
    File.WriteAllText("Archivo.txt", opA + opB + opC);
}
 
Buenas colega.

Me sale esto.

Al leer, guardar parece que guarda bien, pero al leer como que no.
 

Adjuntos

  • Opciones04.webp
    Opciones04.webp
    6,4 KB · Visitas: 3
Ya me funciona, se hace así:

Dejo el código por si alguien lo necesita o solo quiere curiosear hasta en el alma. Xddddddd.
C#:
using System;
using System.IO;

namespace Pruebas_Opciones_Consola_02
{
    internal class Program
    {
        static void Main(string[] args)
        {
            #region Configuración ventana.
            // Título de la ventana.
            Console.Title = "Opciones";

            // Tamaño de la ventana, x, y o, ancho y alto.
            const byte ANCHO_X = 20, ALTO_Y = 5;
            Console.SetWindowSize(ANCHO_X, ALTO_Y);

            // Quitar scroll laterales. Derecho y abajo.
            Console.SetBufferSize(ANCHO_X, ALTO_Y);

            // Color de fondo.
            Console.BackgroundColor = ConsoleColor.Yellow;

            // Color de las letras.
            Console.ForegroundColor = ConsoleColor.Black;

            // Limpiar pantalla y dejarlo todo en color de fondo.
            Console.Clear();

            // Visible el cursor. // No! Así lo haces invisible.
            Console.CursorVisible = false;
            #endregion

            string[] opciones =
{
                    "    ** TÍTULO **    ",    // Posición 0.
                    "  ( ) Opción A      ",    // 1
                    "  ( ) Opción B      ",    // 2
                    "  ( ) Opción C      ",    // 3
                    "  SALIR             ",    // 4
                    ">",                       // 5
                    "x",                       // 6
                    " ",                       // 7
                    "                    "     // 8
                };
            string opA = "x";
            string opB = " ";
            string opC = " ";

            Menu();

            #region Opociones, selecciones y guardar archivo .txt
            void OpcionesA()
            {
                Console.SetCursorPosition(0, 0);
                Console.Write(opciones[0]);       //    ** TÍTULO **   
                Console.SetCursorPosition(0, 1);
                Console.Write(opciones[1]);       //   ( ) Opción A
                Console.SetCursorPosition(0, 2);
                Console.Write(opciones[2]);       //   ( ) Opción B
                Console.SetCursorPosition(0, 3);
                Console.Write(opciones[3]);       //   ( ) Opción C
            }

            void OpcionesB()
            {
                Console.SetCursorPosition(0, 1);
                Console.Write(opciones[4]);       //   SALIR
                Console.SetCursorPosition(0, 2);
                Console.Write(opciones[8]);       // 
                Console.SetCursorPosition(0, 3);
                Console.Write(opciones[8]);       //
            }

            void SelectorA()
            {
                Console.SetCursorPosition(0, 1);
                Console.Write(opciones[5]);       // >
                Console.SetCursorPosition(0, 2);
                Console.Write(opciones[7]);
                Console.SetCursorPosition(0, 3);
                Console.Write(opciones[7]);
            }

            void SelectorB()
            {
                Console.SetCursorPosition(0, 1);
                Console.Write(opciones[7]);
                Console.SetCursorPosition(0, 2);
                Console.Write(opciones[5]);       // >
                Console.SetCursorPosition(0, 3);
                Console.Write(opciones[7]);
            }

            void SelectorC()
            {
                Console.SetCursorPosition(0, 1);
                Console.Write(opciones[7]);
                Console.SetCursorPosition(0, 2);
                Console.Write(opciones[7]);
                Console.SetCursorPosition(0, 3);
                Console.Write(opciones[5]);        // >
            }
            #endregion

            void Menu()
            {
                sbyte indiceSeleccionado = 0;                // Índice seleccionado de cada opción del menú.
                bool salir = false;                          // Para salir del menú principal al INICIO.
                sbyte SELECCION_OPCIONES_TOTALES = 3;        // Total de opciones para seleccionar y fija.

                // Capturar tecla para luego validar.
                ConsoleKey tecla;

                // Crear archivo y guarda el * seleccioinado en él.
                if (File.Exists("Archivo.txt"))
                {
                    // Leer los datos separados
                    string[] result = File.ReadAllText("Archivo.txt").Split(new char[] { ',' });
                    opA = result[0];
                    opB = result[1];
                    opC = result[2];
                }

                do
                {
                    //******************************************************************
                    // Dibujo el menú principal.

                    switch (indiceSeleccionado)
                    {
                        case 0:
                            OpcionesA();
                            SelectorA();
                            Console.SetCursorPosition(3, 1);
                            Console.Write(opA);
                            Console.SetCursorPosition(3, 2);
                            Console.Write(opB);
                            Console.SetCursorPosition(3, 3);
                            Console.Write(opC);
                            break;

                        case 1:
                            OpcionesA();
                            SelectorB();
                            Console.SetCursorPosition(3, 1);
                            Console.Write(opA);
                            Console.SetCursorPosition(3, 2);
                            Console.Write(opB);
                            Console.SetCursorPosition(3, 3);
                            Console.Write(opC);
                            break;

                        case 2:
                            OpcionesA();
                            SelectorC();
                            Console.SetCursorPosition(3, 1);
                            Console.Write(opA);
                            Console.SetCursorPosition(3, 2);
                            Console.Write(opB);
                            Console.SetCursorPosition(3, 3);
                            Console.Write(opC);
                            break;

                        case 3:
                            OpcionesB();
                            Console.SetCursorPosition(0, 1);
                            Console.Write(opciones[5]);       // >
                            break;
                        default:
                            Console.Write("Fuera de rango.     ");
                            break;
                    }

                    // Fin de pintar el menú principal.
                    //******************************************************************

                    // Leer tecla ingresada por el usuario.
                    tecla = Console.ReadKey(true).Key;

                    // Validar el tipo de tecla.
                    if (tecla == ConsoleKey.Enter)
                    {
                        switch (indiceSeleccionado)
                        {
                            case 0:
                                opA = "x"; opB = " "; opC = " ";
                                break;

                            case 1:
                                opA = " "; opB = "x"; opC = " ";
                                break;

                            case 2:
                                opA = " "; opB = " "; opC = "x";
                                break;

                            case 3:
                                indiceSeleccionado = 0; // Restaurar índice antes de salir.
                                salir = true;           // Salir.
                                break;

                            default:
                                Console.Write("Fuera de rango.     ");
                                break;
                        }
                        // Guardar en archivo solo después de actualizar la opción seleccionada.
                        // Guardar los datos con separador.
                        File.WriteAllText("Archivo.txt", string.Join(",", new string[] { opA, opB, opC }));
                    }

                    // ¿Has pulsado tecla flecha Abajo?
                    if (tecla == ConsoleKey.DownArrow)
                    {
                        indiceSeleccionado++;
                    }

                    // Entonces si pulsas tecla flecha Arriba.
                    if (tecla == ConsoleKey.UpArrow)
                    {
                        indiceSeleccionado--;
                    }

                    // Si está en la última opción, salta a la primera.
                    if (indiceSeleccionado > SELECCION_OPCIONES_TOTALES)
                    {
                        indiceSeleccionado = 0;
                    }

                    // Si está en la primera posición, salta a la última.
                    if (indiceSeleccionado < 0)
                    {
                        indiceSeleccionado = SELECCION_OPCIONES_TOTALES;
                    }

                    // Uso la tecla escape como salida.
                } while (!salir);
            }
        }
    }
}
 
Atrás
Arriba