Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Andesat en 3 Abril 2015, 20:54 pm



Título: Problema en c# con lectura y escritura en un archivo de texto
Publicado por: Andesat en 3 Abril 2015, 20:54 pm
Sucede que he estado aprendiendo c# y estoy dando apenas los primeros pasos. Buscando por ahí me encontre con un ejercicio que me parecía sencillo pero me he estancado :-[ y no estoy muy seguro de como resolverlo.

El ejercicio consistía en establecer un entero como contador, leer un documento de texto y copiar el contenido de este dentro de otro documento de texto, por cada quince caracteres copiados el contador disminuye en uno y al llegar a cero la copia se detiene durante cinco segundos.

Ahora viene en donde me da problemas. Una vez terminados los cinco segundos, el contador vuelve al valor original continua la copia de texto y si esta no se terminó, debe retomarla desde donde quedó la última vez y seguir copiado hasta que el contador llegue a cero nuevamente o hasta que termine de copiar, lo que suceda primero ypor ultimo avisar si la copia terminó.

No se como hacer para que empiece a copiar desde donde quedó y la verdad no quisiera dejar esto sin hacer despues de haberme interesado.

Estoy usando c# 5.0 en visual studio 2012.

Agradecería la ayuda ;D


Título: Re: Problema en c# con lectura y escritura en un archivo de texto
Publicado por: DarK_FirefoX en 3 Abril 2015, 21:31 pm
Creo que si pones el código de lo que tienes hecho te podríamos ayudar más. Porque así me vienen varias cosas a la mente, pero sabiendo lo que tienes hecho te podría ayudar de una manera más concisa

Salu2s


Título: Re: Problema en c# con lectura y escritura en un archivo de texto
Publicado por: Andesat en 4 Abril 2015, 00:13 am
Claro!
Disculpa la demora es que hubo un apagón.

Código
  1.            Console.WriteLine("Ingrese ruta del archivo de origen: ");
  2.            string rutaO = Console.ReadLine();
  3.  
  4.            Console.WriteLine("Ingrese ruta del archivo de destino: ");
  5.            string rutaD = Console.ReadLine();
  6.  
  7.            Console.WriteLine("Ingrese el contador: ");
  8.            int cont = int.Parse(Console.ReadLine());
  9.  
  10.            StreamReader sr = new StreamReader(rutaO);
  11.            string contenido = sr.ReadToEnd();
  12.            sr.Close();
  13.  
  14.            StreamWriter sw = new StreamWriter(rutaD, true);
  15.  
  16.  
  17.            while (cont > 0)
  18.            {
  19.                for (int i = 0; i < 15; i++)
  20.                {
  21.                    char Caracter = contenido[i];
  22.                    sw.Write(Caracter);
  23.                }
  24.                cont--;
  25.            }
  26.  
  27.            Console.ReadKey();

Esto es lo que intenté hacer al final pero no me funcionó


Título: Re: Problema en c# con lectura y escritura en un archivo de texto
Publicado por: Eleкtro en 4 Abril 2015, 01:11 am
No vas del todo mal encaminado, aunque también podrías hacerlo con una pila de caracteres.

Te muestro una posible solución siguiendo el enfoque que le has dado, puedes trasladarlo a tu aplicación de consola.

VB.Net:
Código
  1. Imports System.IO
  2. Imports System.Text
  3. Imports System.Threading.Interlocked
  4. Imports System.Threading.Thread
  5.  
  6. Public Class Form1
  7.  
  8.    Private Sub Test() Handles MyBase.Shown
  9.  
  10.        Writer(sourceFilepath:="C:\Source.txt",
  11.               targetFilepath:="C:\Target.txt",
  12.               maxChars:=15,
  13.               sleepCount:=3,
  14.               sleepInterval:=5 * 1000)
  15.  
  16.    End Sub
  17.  
  18.    Public Sub Writer(ByVal sourceFilepath As String,
  19.                      ByVal targetFilepath As String,
  20.                      ByVal maxChars As Integer,
  21.                      ByVal sleepCount As Integer,
  22.                      ByVal sleepInterval As Integer)
  23.  
  24.        Dim cloneSleepCount As Integer = sleepCount
  25.  
  26.        Dim charCount As Integer = -1
  27.        Dim sr As StringReader = New StringReader(File.ReadAllText(sourceFilepath, Encoding.Default))
  28.        Dim sw As New StringWriter
  29.  
  30.        Do Until (sr.Peek = -1)
  31.  
  32.            sw.Write(Convert.ToChar(sr.Read))
  33.  
  34.            If (Increment(charCount) = maxChars) OrElse (sr.Peek = -1) Then
  35.  
  36.                If Decrement(cloneSleepCount) = 0 Then
  37.                    Debug.WriteLine(String.Format("Deteniendo por {0} ms...", sleepInterval))
  38.                    Sleep(sleepInterval)
  39.                    cloneSleepCount = sleepCount - 1
  40.                End If
  41.  
  42.                Debug.WriteLine(String.Format("Copiando {0} caracteres: '{1}'", charCount, sw.ToString))
  43.                File.AppendAllText(targetFilepath, sw.ToString, Encoding.Default)
  44.  
  45.                charCount = -1
  46.                sw.GetStringBuilder.Clear()
  47.  
  48.            End If
  49.  
  50.        Loop
  51.  
  52.        sr.Close()
  53.        sw.Close()
  54.        Debug.WriteLine("Copia terminada.")
  55.  
  56.    End Sub
  57.  
  58. End Class

Traducción online a C#:
Código
  1. using System;
  2. using System.Diagnostics;
  3. using System.IO;
  4. using System.Text;
  5. using System.Threading.Interlocked;
  6. using System.Threading.Thread;
  7.  
  8. public class Form1
  9. {
  10.  
  11. private void Test()
  12. {
  13. Writer(sourceFilepath: "C:\\Source.txt", targetFilepath: "C:\\Target.txt", maxChars: 15, sleepCount: 3, sleepInterval: 5 * 1000);
  14. }
  15.  
  16. public void Writer(string sourceFilepath, string targetFilepath, int maxChars, int sleepCount, int sleepInterval)
  17. {
  18. int cloneSleepCount = sleepCount;
  19.  
  20. int charCount = -1;
  21. StringReader sr = new StringReader(File.ReadAllText(sourceFilepath, Encoding.Default));
  22. StringWriter sw = new StringWriter();
  23.  
  24. while (!((sr.Peek == -1))) {
  25.  
  26. sw.Write(Convert.ToChar(sr.Read));
  27.  
  28. if ((Increment(charCount) == maxChars) || (sr.Peek == -1)) {
  29.  
  30. if (Decrement(cloneSleepCount) == 0) {
  31. Debug.WriteLine(string.Format("Deteniendo por {0} ms...", sleepInterval));
  32. Sleep(sleepInterval);
  33. cloneSleepCount = sleepCount - 1;
  34. }
  35.  
  36. Debug.WriteLine(string.Format("Copiando {0} caracteres: '{1}'", charCount, sw.ToString));
  37. File.AppendAllText(targetFilepath, sw.ToString, Encoding.Default);
  38.  
  39. charCount = -1;
  40. sw.GetStringBuilder.Clear();
  41. }
  42. }
  43.  
  44. sr.Close();
  45. sw.Close();
  46. Debug.WriteLine("Copia terminada.");
  47. }
  48. }
  49.  
  50. //=======================================================
  51. //Service provided by Telerik (www.telerik.com)
  52. //=======================================================

Saludos


Título: Re: Problema en c# con lectura y escritura en un archivo de texto
Publicado por: DarK_FirefoX en 4 Abril 2015, 02:59 am
Bueno, siguiendo de acuerdo al código que ya escribiste, te voy a tratar de explicar lo que puedes hacer.

Lo que tenías está bastante bien. Verás en el siguiente código, una manera diferente de usar los StreamReadery StreamWriter, te explico.

Utilizando el using, garantizamos que el stream se cree y a la vez dentro del ámbito del using este abierto, luego que se salga de ese ámbito, el stream automáticamente se cierra. Gracias a esta funcionalidad podemos hacer uso del método Peek() que te devuelve el próximo caracter disponible (sin consumirlo), este método devuelve un int, entonces devuelve -1 si no hay chars para leer por lo tanto utilizamos eso para controlar el ciclo, ahora, este puntero es modificado por varios métodos de la clase StreamReader. Como por ejemplo el que utilicé: ReadBlock(). El cuál recibe varios parámetros, un array de char (char[]), el cuál va a servir como un buffer para ir almacenando en este caso los 15 chars leídos (debes declararlo e iniciarlo previamente como verás en el código. El otro parámetro es la posición en cual va a comenzar a copiar los chars en el buffer, en este caso 0, para que sea desde el principio. Y por último, la cantidad de chars a leer del fichero, 15 en este caso.

Luego la otra linea se ejecuta sobre el StreamWriter, es el método Write(), el cual tiene varias sobrecargas (varias definiciones del método donde cambian los tipos de parámetros y/o la cantidad). En particular tiene una que recibe un array de char (char[]), o sea un buffer. Por lo tanto le pasamos el buffer que teníamos anteriormente y el escribirá en el StreamWriter los chars en ese array.

Por ultimo, tienes que añadir a los usings de tu aplicación:

Código
  1. using System.Threading;

para poder hacer uso del método estático

Código
  1. Thread.Sleep(5000);

Donde 5000 significan los 5s, pues el método recibe como parámetro un int que son la cantidad de milisegundos que te va a suspender el hilo actual (esperar).

Aquí te dejo el código:

Código
  1. Console.WriteLine("Ingrese ruta del archivo de origen: ");
  2.            string rutaO = Console.ReadLine();
  3.  
  4.            Console.WriteLine("Ingrese ruta del archivo de destino: ");
  5.            string rutaD = Console.ReadLine();
  6.  
  7.            Console.WriteLine("Ingrese el contador: ");
  8.            int cont = int.Parse(Console.ReadLine());
  9.  
  10.            using (StreamReader sr = new StreamReader(rutaO))
  11.            {
  12.                using(StreamWriter sw = new StreamWriter(rutaD))
  13.            {
  14.                    int i = cont;
  15.  
  16.                        while (sr.Peek() != -1)
  17.                        {
  18.                            if (i == 0)
  19.                            {
  20.                                Thread.Sleep(5000);
  21.                                i = cont;
  22.                            }
  23.                            char[] buffer = new char[15]; //creamos e inicializamos el array de char para usarlo como buffer
  24.                            sr.ReadBlock(buffer, 0, 15); //Lee y copia en el buffer desde el StreamReader
  25.                            sw.Write(buffer); //Escribe en el StreamWriter desde el buffer
  26.                            i--;
  27.                        }
  28.  
  29.            }
  30.            }

Espero lo hayas entendido todo, trate de explicarte lo mejor posible.
Dinos como te funcionó.

Saludos


Título: Re: Problema en c# con lectura y escritura en un archivo de texto
Publicado por: Andesat en 4 Abril 2015, 04:50 am
Gracias a todos por tomarse el tiempo para responder a mi pregunta!

DarK_FirefoX, todo esta muy bien explicado, y funciona perfecto para lo que estoy haciendo.

He aprendido algo nuevo hoy, muchas gracias.

Saludos.


Título: Re: Problema en c# con lectura y escritura en un archivo de texto
Publicado por: DarK_FirefoX en 4 Abril 2015, 14:52 pm
Gracias a todos por tomarse el tiempo para responder a mi pregunta!

DarK_FirefoX, todo esta muy bien explicado, y funciona perfecto para lo que estoy haciendo.

He aprendido algo nuevo hoy, muchas gracias.

Saludos.

Un placer!, que bueno que todo se haya entendido. Cualquier otra duda, ya sabes ;)
Salu2s