Autor Tema: C# ejercicio resuelto gestión ficheros leer líneas más larga contar vocales ejem  (Leído 4034 veces)

admintf

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Buenas a todos tengo el siguiente problema. No sé si el código pongo esta bien, no me acaba de ir bien

Ante todo, gracias por la ayuda.


1) Haz un programa que se escriba el nombre del fichero tecleado y empiece a leer línea por línea, que muestre la línea más larga, que posición esta y cuantas vocales tiene.

Código: [Seleccionar]
using System; 
                     
public class CountWordFile 
{     
    public static void Main() 
    { 
        String line; 
        int count = 0; 
         System.IO.StreamReader file = new System.IO.StreamReader(@"data.txt");   
             
           while((line = file.ReadLine()) != null){ 
   
            String[] words= line.Split(' '); 
     
            count = count + char.Length; 
        } 
         
        Console.WriteLine("numero de caracteres " + count); 
        file.Close(); 
    } 


2) Haz un programa que pregunte que archivo quieres leer y que pregunte el archivo que quieres crear nuevo. Que se copie el contenido línea por línea los muestre.

Código: [Seleccionar]
using System;
using System.IO;
  class Program {
    static void Main(string[] args)
    {
        string file = @".\Textfile.txt";
 
        string text = "This is some text.";
        File.WriteAllText(file, text);
 
        Console.WriteLine(File.ReadAllText(file));
        Console.WriteLine();
 
        string[] textLines1 = { "1 linea",
                               "2 linea",
                              "3 linea" };
 
        File.WriteAllLines(file, textLines1);
 
        Console.WriteLine(File.ReadAllText(file));
 
        string[] textLines2 = { "1 linea“};
                             "2 linea };
 
        using(StreamWriter writer = new StreamWriter(file))
        {
            foreach(string ln in textLines2)
            {
                writer.WriteLine(ln);
            }
        }
        Console.WriteLine(File.ReadAllText(file));
 
        Console.ReadKey();
    }
}


3) Haz un programa que pregunte nombre y verifique si el nombre se encuentra dentro del documento de texto. Primero compruebe si el archivo existe.
« Última modificación: 13 de Enero 2022, 18:58 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re: C# gestión ficheros.
« Respuesta #1 en: 23 de Mayo 2021, 01:31 »
Respecto al primer ejercicio.

Esta línea de código:
Código: [Seleccionar]
String[] words= line.Split(' '); Eso lo que hace es dividir la línea en palabras, cada palabra queda insertada en el array llamado words.
Pero luego no haces con ese array. De todos modos, el enunciado del ejercicio no te dice que busques palabras.

Esta otra línea:
Código: [Seleccionar]
count = count + char.Length;
Directamente no compila... char.Length  no es nada. Se estaría llamando a la propiedad Length de la clase char, pero es que no tiene dicha propiedad..

Lo que necesitas son dos String.
Uno para leer línea a línea el archivo de texto.
El otro String, para guardar la línea mayor.
Cada vez que se lee una línea se comparan la longitud de la línea leída con la que tengamos guardada como línea mayor (estas si tienen la propiedad .Length)
Si la línea recién leída es más larga, pasa a ser guardada como línea mayor y se sigue comparando con las siguientes líneas.

Además usaremos dos int.
Uno para contar las líneas leídas y el otro para guardar la posición de las línea que se va guardando como mayor.

Luego, lo que no se nos pide es que una vez tengamos finalmente la mayor línea de todas, calculemos cuantas vocales tiene.

Esto, para que el código quede mejor estructurado, es mejor usar un método que reciba la línea y retorne un int con la cantidad de vocales encontradas.
Para buscar vocales en la línea, lo que haremos será transformar el String que contiene la línea, en un array de char.
Recorremos el array, carácter a carácter, y comprobamos si es una vocal. Para esto podemos usar un switch, donde si el caracter es 'a', 'e', 'i', 'o', 'u'... pues incrementamos un contador.
Finalmente se retorna este contador, que indica las vocales encontradas.

Este podría ser el código:

Código: [Seleccionar]
        static void Main(string[] args)
        {
            String linea, lineaMayor = "";
            int contadorLinea = 0, posicionLineaMayor = 0;
            System.IO.StreamReader file = new System.IO.StreamReader(@"d:\curso.txt");

            while ((linea = file.ReadLine()) != null)
            {
                contadorLinea++; //Contamos línea leída

                //Comparamos tamaño linea actual, con la linea Mayor encontrada hasta ahora
                if (linea.Length > lineaMayor.Length)
                {
                    //Es mayor, esta linea pasa a ser la linea mayor y guardamos su posicion
                    lineaMayor = linea;
                    posicionLineaMayor = contadorLinea;
                }

            }
            file.Close();
            //Ya tenemos la mayor línea y su posicion, mostramos resultados
            Console.WriteLine("Mayor linea encontrada:\n" + lineaMayor);
            Console.WriteLine("\t\n*****************************\n");
            Console.WriteLine("Posicion:" + posicionLineaMayor);
            Console.WriteLine("Cantidad de vocales: " + cuentaVocales(lineaMayor));

        }

        static int cuentaVocales(String linea)
        {
            int vocales = 0;

            //Convertimos la linea String a un array de caracteres (todos en minúscula)
            char[] caracteres = linea.ToLower().ToCharArray();

            //Repasamos cada caracter con un bucle y buscamos vocales con un switch
            for (int i = 0; i < caracteres.Length; i++)
            {
                switch(caracteres[i])
                {
                    case 'a':
                    case 'e':
                    case 'i':
                    case 'o':
                    case 'u':
                        vocales++;
                        break;
                }
            }

            return vocales;
        }

Si ejecutamos el código, parece funcionar correctamente:

Citar
Mayor linea encontrada:
¿Por qué se obliga en C a añadir archivos de cabecera incluso para funciones básicas del lenguaje? Posiblemente porque cuando se creó C se hizo teniendo muy en cuenta la eficiencia y el evitar sobrecargar el computador ocupando memoria inútilmente. Imagínate que eres el cliente de un restaurante ("el cliente del compilador") y que vas a pedir un menú. El dueño del restaurante no prepara todos los platos posibles y los pone a tu disposición, sino que espera a que tú le digas los platos que deseas y son únicamente esos los que prepara. De esta forma ahorra espacio y esfuerzo. En nuestro caso, en lugar de cargar en memoria y poner a tu disposición todas las posibles funciones del lenguaje, el compilador sólo carga y pone a disposición aquellas funciones que declaramos que vamos a usar. De este modo se gana en eficiencia.

*****************************

Posicion:135
Cantidad de vocales: 300
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re: C# gestión ficheros.
« Respuesta #2 en: 23 de Mayo 2021, 01:37 »
Sobre el segundo ejercicio, el código que has puesto no se corresponde con nada de lo que pide el enunciado.

Haz un intento escribiendo tú el código, no copiando algún ejemplo (que no resuelve nada de lo que se pide)

Tienes que pedir dos nombres de archivo al usuario: nombre de archivo a leer y nombre de archivo donde guardar una copia del primero.

Entonces hay que leer el primer archivo y escribir las mismas líneas en el otro.

Inténtalo, llega hasta donde puedas, y luego corregimos y completamos.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

admintf

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Re: C# gestión ficheros.
« Respuesta #3 en: 25 de Mayo 2021, 18:02 »
Buenas gracias por la respuesta:

El segundo ejercicio estado mirando no se si esto se parece más.
He cogido el bloque que lee el archivo después intentar copiar.


2 Haz un programa que pregunte que archivo quieres leer y que pregunte el archivo que quieres crear nuevo. Que se copie el contenido línea por línea los muestre.

Código: [Seleccionar]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace test
{
    class Program
    {
        private static byte leerarxivo;
        private static byte escribir;

        static void Main(string[] args)
        {
            //para leer
            int counter = 0;
            string line;
            int fixero;

            Console.WriteLine("Escribe el fixero a leer: ");
            fixero = Convert.ToByte(Console.ReadLine());

            // Read the file and display it line by line. 
            System.IO.StreamReader file =
                new System.IO.StreamReader(@+fixero);
            while ((line = file.ReadLine()) != null) // o  line =  file.ReadToEnd();
            {
                System.Console.WriteLine(line);
                counter++;
            }

            file.Close();


            // para escribir en el archivo

            void AdicionarInfoAlTxt()

            Console.WriteLine("que nombre tiene tener el fixero: ");
            escribir = Convert.ToByte(Console.Redline());
            {
                string rutaCompleta = @"+escribir";
               
                using (StreamWriter file = new StreamWriter(rutaCompleta, true))
                {
                    file.WriteLine(fixero);

                    file.Close();
                }
            }


            System.Console.WriteLine("There were {0} lines.", counter);
         
            System.Console.ReadLine();

            Console.ReadKey();

        }
    }
}

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re: C# gestión ficheros.
« Respuesta #4 en: 26 de Mayo 2021, 01:33 »
¿Has probado a ejecutar tu código?
Supongo que no, ya que de hecho no va a compilar porque hay alguna instrucción mal escrita:
Citar
escribir = Convert.ToByte(Console.Redline());

Pero es que además hay varios using innecesarios, se declaran dos variables estaticas de tipo byte, que luego no se usan para nada (porque de todos modos no tienen ninguna utilidad).

Cuando se pide el nombre del fichero, se convierte a byte lo que se recoja, para guardarlo en una variable int.
Código: [Seleccionar]
            Console.WriteLine("Escribe el fixero a leer: ");
            fixero = Convert.ToByte(Console.ReadLine());
No tiene ningún sentido. Ahí lo que pasará que si le doy el nombre "miFichero.txt", esto obviamente es imposible convertirlo a números, ni a int ni aún menos a byte (un byte es un número entre 0 y 255).
Por lo tanto se producirá una excepción y el programa se detendrá.

Esta línea tampoco la aceptará el compilador:
Código: [Seleccionar]
void AdicionarInfoAlTxt()¿Qué es?
Un intento de declaración de un método? ¿Sin punto y coma al final?
 ¿Sin llaves de apertura y cierre para definir su código?
De todos modos está dentro del método Main(), no se puede declarar/definir un método, dentro de otro método.

Y bueno, aunque nada de todo esto fallase, la lógica que sigue el código no es la adecuada de todas maneras. Primero leería las líneas, las mostraría en pantalla y cerraría fichero de lectura.

Luego intentaría escribir en el fichero copia, pero las líneas leídas no están guardadas en ningún sitio, así que no hay nada disponible para escribir.


No quiero ser demasiado crítico, pero quiero que veas que copiar retazos de código de aquí y de allá y juntarlo confiando que sirva de algo... no lleva a ninguna parte.
Es que ni siquiera has comprobado tú mismo si funciona o no.


No copies/uses código que no entiendes. Tienes que conseguir escribir tu propio código, aunque luego no funcione o no cumpla con todo lo que pide el enunciado.
Y antes de escribir código, tienes que tener clara la lógica que quieres seguir.

La lógica a seguir ya te la dije en el mensaje anterior:
Citar
Tienes que pedir dos nombres de archivo al usuario: nombre de archivo a leer y nombre de archivo donde guardar una copia del primero.

Entonces hay que leer el primer archivo y escribir las mismas líneas en el otro.

Si hubieras hecho un programa donde, al menos, pidiese los dos nombres de archivo y los guardase en el tipo de dato adecuado (String, no un byte o int), ya tendría mucho más mérito que la amalgama de código anterior.

Sigamos la lógica:
- Pedir nombre de archivo a leer. Si es un nombre lo que pedimos, es decir, una cadena de texto pues se recoge en un String.
Luego, usando ese String, podemos inicalizar un objeto StreamReader que será quien luego leerá líneas de ese fichero:
Código: [Seleccionar]
        static void Main(string[] args)
        {
            Console.Write("Fichero a leer: ");
            String origen = Console.ReadLine();
            System.IO.StreamReader ficheroOrigen = new System.IO.StreamReader(origen);
        }

Continuamos:
-Pedir nombre de archivo donde escribir. Es decir, el fichero donde haremos una copia del anterior. El proceso es el mismo, solo que esta vez inicializaremos un objeto StreamWriter, que será quién escriba.

Código: [Seleccionar]
        static void Main(string[] args)
        {
            Console.Write("Fichero a leer: ");
            String origen = Console.ReadLine();
            System.IO.StreamReader ficheroOrigen = new System.IO.StreamReader(origen);
           
            Console.Write("Fichero donde hacer copia: ");
            String copia = Console.ReadLine();
            System.IO.StreamWriter ficheroCopia = new System.IO.StreamWriter(copia);
        }

Siguiente paso:
Leer el primer archivo y escribir las mismas líneas en el otro.
Lo que haremos será leer línea a línea, tal y como hicimos en el primer ejercicio.
Por cada línea leída, la mostramos en pantalla. Pero además, tenemos que pedirle al StreamWriter que la escriba en el fichero "copia".
Porque esas líneas no se guardan en ningún sitio, cada vez que leemos una, la línea anterior se pierde.
Así que al mismo tiempo que leemos y mostramos en pantalla, también se la entregamos al StreamWriter.

Cuando el bucle que lee las líneas termina, hay que cerrar ambos Streamers, tanto el de lectura como el de escritura.
Especialmente el de escritura, si no lo cerramos, las líneas "escritas" no se transferirán al fichero de texto, así que no habremos conseguido nada.

Dejo el código final al completo. Para mostrar las líneas en pantalla de una forma más destacada, cambia el color del texto a amarillo. Pero esto ya son adornos estéticos, no es lo importante.

Código: [Seleccionar]
using System;

namespace CopiarFichero
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Fichero a leer: ");
            String origen = Console.ReadLine();
            System.IO.StreamReader ficheroOrigen = new System.IO.StreamReader(origen);
           
            Console.Write("Fichero donde hacer copia: ");
            String copia = Console.ReadLine();
            System.IO.StreamWriter ficheroCopia = new System.IO.StreamWriter(copia);

            Console.WriteLine("\n\n\t\tIniciando la copia linea a linea...");
            String linea;

            while ((linea = ficheroOrigen.ReadLine()) != null)
            {
                //Mostramos la linea actual en pantalla
                Console.WriteLine("Copiando linea:");
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine(linea);
                Console.ResetColor();

                //Escribimos la linea en el archivo copia
                ficheroCopia.WriteLine(linea);
            }
            ficheroOrigen.Close();
            ficheroCopia.Close();

            Console.WriteLine("\n\n\t\tCopia finalizada");

        }
    }
}

A continuación pongo el resultado obtenido en pantalla.
Fíjate que cuando se piden los nombres de archivos, hay que dar una ruta completa.
Se podría dar una ruta relativa..., pero puede ser más difícil acertar con la ruta correcta, ya que dependerá de donde se ejecuta el archivo .exe del programa.
Así que mejor dar una ruta completa, de un archivo de texto que tengamos en la raíz del disco, para no tener que indicar demasiadas carpetas en la ruta.
El archivo a leer tiene que existir.
El archivo a copiar, no hace falta que exista, el programa lo creará automáticamente.



Y obviamente no solo se ven las líneas en pantalla.
El fichero copiado aparecerá en la ruta que hayamos indicado.


Repasa el código que he puesto y comprueba que entiendes cada línea, que significa cada instrucción, por qué las estamos usando, cuál es la lógica que se ha seguido...

Lo que no entiendas, no dudes en preguntar.

Luego veremos el tercer ejercicio.

Saludos.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

admintf

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Re: C# gestión ficheros.
« Respuesta #5 en: 26 de Mayo 2021, 19:14 »
Buenas,

Por lo menos el programa me dice todo verde,
Comprobar no puedo bien, el visual studio hay algo mal pero no quiero tocar hasta tenga ejercicios hechos.

Gracias antemano.



3 Haz un programa que pregunte nombre y verifique si el nombre se encuentra dentro del documento de texto. Primero compruebe si el archivo existe.
Código: [Seleccionar]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace EX03
{
    class Program
    {
        static void Main(string[] args)
        {
            String archivo;
            String nombre;
            try
            {
                Console.WriteLine("Entra la ruta completa del archivo que desea comprovar:");
                archivo = Console.ReadLine();
                Console.WriteLine("Entra el nombre a buscar: ");
                nombre = Console.ReadLine();


                if (System.IO.File.Exists(archivo))
                {
                    Console.WriteLine("el fichero existe");
                }
                else
                {
                    Console.WriteLine("el fichero NO existe");
                }



                if (System.IO.File.Exists(nombre))
                   {
                    Console.WriteLine("el nombre existe");
                   }
                else
                {
                    Console.WriteLine("eel nombre no existe");
                }
            }

            catch (Exception e)
            {
                Console.WriteLine("Exception: " + e.Message);
            }
        }
    }
}


Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re: C# gestión ficheros.
« Respuesta #6 en: 27 de Mayo 2021, 00:54 »
Mmhh, esta vez el código va bien encaminado, aunque no del todo.

La comprobación inicial para ver si existe o no el fichero está bien.
Pero luego estas líneas:

Código: [Seleccionar]
if (System.IO.File.Exists(nombre))
                   {
                    Console.WriteLine("el nombre existe");
                   }
                else
                {
                    Console.WriteLine("eel nombre no existe");
                }
Aquí no estás comprobando si el nombre existe dentro del archivo, que es lo que se pide.

Estás comprobando si existe un archivo cuya ruta sea igual al nombre, y no es eso lo que hay que lograr.

Una vez has comprobado que el archivo sí existe, entonces hay que leer las líneas de ese archivo y comprobar si alguna línea contiene el nombre.

Es decir, imagina que el archivo de texto seleccionado, contiene una lista de nombres con sus teléfonos:
Citar
Nombre: sara pelaez -- Telefono: 656789034
Nombre: laura juan -- Telefono: 690872311
Nombre: alfredo timoneda -- Telefono: 650812093
Nombre: eva llanes -- Telefono: 633908070
Nombre: lidia guarque -- Telefono: 654120987
Nombre: sandra cevallos -- Telefono: 621109082
Nombre: jorge morales -- Telefono: 656231050

Y como nombre a buscar nos indican: jorge morales

Pues hay que leer esas líneas y comprobar si alguna contiene la cadena "jorge morales".
Si la tiene, podemos mostrar la línea completa.

Si no la tuviera, habrá que informar de que no existe ese nombre.


Mira, te explico la lógica que yo he seguido y luego pongo el código completo al final.

* Primero pido el nombre a buscar
* Luego pido el nombre de fichero. Esta petición la hago dentro de un bucle de forma que se va a repetir hasta que:
- me indique una ruta de un fichero que si existe
- o bien teclee la cadena "fin" para terminar el programa, sin hacer ninguna búsqueda

*A continuación, si NO ha introducido "fin" y el bucle anterior ha terminado, es que entonces SÍ tengo un ruta de fichero válida.
Pues entonces inicializo un StreamReader y comienzo a leer líneas dentro de otro bucle.
Este bucle se repite hasta que:
- No queden líneas por leer en el fichero
- Encuentre el nombre que se busque. Esto lo controlo con una variable bool, si encuentro el nombre, le daré valor true a esta variable y entonces el bucle terminará, sin seguir leyendo más líneas.

* Por cada línea leída, compruebo si contiene el nombre indicado. ¿Cómo?
Pues cuando leo una línea, esta se guarda en un String. Este String, tiene un método llamado Contains() al cuál le puedo pasar una cadena de texto y me dice si ese String contiene esa cadena o no (true o false)
Así que le paso el nombre a buscar y si retorna true, indico en pantalla que se ha encontrado el nombre y muestro la línea completa.
A la variable bool le doy valor true, y así el bucle sabe que ya puede terminar.

* Por último, compruebo de nuevo el valor de esta variable bool.
Si su valor al final del programa es false, significa que el bucle ha terminado sin haber encontrado el nombre que se busca, así que lanzo un mensaje final avisando de que no existe ese nombre.

Este es el código. Fíjate también que solo necesito dos "using ...." al principio.
En tus códigos pones varios using innecesarios como estos:
Código: [Seleccionar]
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

Aquí mi código. Insisto en que lo repases y si algo no lo entiendes, pregúntalo.
No te conformes con tener una solución, asegúrate de que la comprendes.

Código: [Seleccionar]
using System;
using System.IO;

namespace BuscaNombreFichero
{
    class Program
    {
        static void Main(string[] args)
        {
            String linea, nombre, fichero;
            bool encontrado = false;

            Console.WriteLine("Nombre a buscar: ");
            nombre = Console.ReadLine();

            //Con el bucle repito la solicitud de archivo hasta que exista o hasta que el usuario elija "fin"
            do
            {
                Console.WriteLine("Fichero donde hacer busqueda(escriba 'fin' para terminar): ");
                fichero = Console.ReadLine();
                if (!fichero.Equals("fin"))
                {
                    if (!File.Exists(fichero))
                        Console.WriteLine("No se encuentra ese fichero...\n");
                }
            } while (!fichero.Equals("fin") && !File.Exists(fichero));


            if (!fichero.Equals("fin")) //El siguiente código solo se ejecuta si NO se ha introducido "fin"
            {
                StreamReader lector = new StreamReader(fichero);

                //Leemos mientras hayan lineas, o hasta que se encuentre el nombre buscado
                while ((linea = lector.ReadLine()) != null && !encontrado)
                {
                    //Comprobamos si esta linea contiene el nombre
                    if (linea.Contains(nombre))
                    {
                        Console.Write("El nombre ha sido encontrado en la linea: ");
                        Console.ForegroundColor = ConsoleColor.Yellow;
                        Console.WriteLine(linea);
                        Console.ResetColor();
                        encontrado = true; //Esto pone fin al bucle
                    }
                }

                lector.Close();
                if (!encontrado)
                    Console.WriteLine("No se ha encontrado el nombre en el fichero.");
            }
        }
    }
}
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".