Modificar el contenido de una linea de un archivo de texto en c#

Iniciado por nico56, 6 Enero 2010, 15:48 PM

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

nico56

Hola que tal, tengo un archivo de texto con una lista de personas y sus telefonos, por ejemplo asi:


PEPITO;45879684;
JUAN;42369851;
JOSE;47896523;



Y tengo que hacer una funcion que reciba en un parametro el nombre de la persona, y en otro un nuevo telefono que lo debe reemplazar en el archivo.




public void modificar_telefono(string nombre,string telefono)
{
     FileStream fs = new FileStream("cheques.txt", FileMode.Open);
     StreamReader sr = new StreamReader(fs);
     char[] x ={ ';' }; // delimitador

      string[] campos= sr.ReadLine().Split(x);

      while(!sr.EndOfStream)
      {
               if( campos[0] == nombre )
                        //aca deberia poner la instruccion para modifcar la linea

               campos= sr.ReadLine().Split(x);
       }

         fs.Close();
         sr.Close();


}



He probado creando un nuevo archivo, copiando todo hasta encontrar la linea y seguir copiando pero me parece una forma muy chota de hacerlo.

Desde ya gracias y saludos.

ABDERRAMAH

Esto lo cito de http://www.elguille.info/colabora/NET2005/svalsse_leyendo_y_escribiendo_archivos.htm :

Citar
Leyendo desde un archivo usando BufferedStream

using System;
using System.Text;
using System.IO;

static void Main(string[] args)
{
    string path = "c:\\sample\\sample.xml";
    Stream instream = File.OpenRead(path);

    // crear buffer para abrir stream
    BufferedStream bufin = new BufferedStream(instream);
    byte[] bytes = new byte[128];

    // leer los primeros 128 bytes del archivo
    bufin.Read(bytes, 0, 128);
    Console.WriteLine("Allocated bytes: "+Encoding.ASCII.GetString(bytes));
}

Leyendo desde un archivo de texto

using System;
using System.IO;

static void Main(string[] args)
{
    string fileName = "temp.txt";
    FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
    StreamReader reader = new StreamReader(stream);

    while (reader.Peek() > -1) Console.WriteLine(reader.ReadLine());
    reader.Close();
}

Escribiendo en un archive de texto

using System;
using System.IO;

static void Main(string[] args)
{
    string fileName = "temp.txt";
    FileStream stream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write);
    StreamWriter writer = new StreamWriter(stream);

    writer.WriteLine("Esta es la primera línea del archivo.");
    writer.Close();
}

Creando un archivo y escribiendo en este

Este ejemplo usa el método CreateText() el cual crea un Nuevo archive y retorna un objeto StreamWriter que escribe a un archivo usando formato UTF-8.

using System;
using System.IO;

static void Main(string[] args)
{
    string fileName = "temp.txt";
    StreamWriter writer = File.CreateText(fileName);

    writer.WriteLine("Este es mi Nuevo archivo creado.");
    writer.Close();
}

Insertando texto en un archivo

using System;
using System.IO;

static void Main(string[] args)
{
    try
    {
        string fileName = "temp.txt";
        // esto inserta texto en un archivo existente, si el archivo no existe lo crea
        StreamWriter writer = File.AppendText(fileName);
        writer.WriteLine("Este es el texto adicionado.");
        writer.Close();
    }
    catch
    {
        Console.WriteLine("Error");
    }
}

Shell Root

Porque no usas Base de Datos? Tansiquiera Access, es mucho más comodo... ;)
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

nico56

No es mucho una base de datos para eso? Es una aplicacion muy simple :S. La idea era reemplazar una linea del archivo de texto :S

ABDERRAMAH

Si sólo es un simple listín telefónico sería desaprobechar recursos una db, ¿no?

nico56

Mas haya que valga la pena o no usar una base de datos, como puedo modificar una linea de un archivo de texto con c# ? :S

ABDERRAMAH

#6
El problema es mi nivel de C#, que es muy básico, lo que no se hacer y ahora no tengo tiempo de mirar es cómo concatenar strings, yo en vb lo haría así:

writer.writeline(cstr(nombre&";"&telefono&";"))

en un algoritmo como el tuyo sería así (aunque ya te digo que la concatenación de nombre+;+telefono+; no está bien hecha en codigo c#)

public void modificar_telefono(string nombre,string telefono)
{
     FileStream fs = new FileStream("cheques.txt", FileMode.Open);
     StreamReader sr = new StreamReader(fs);
     char[] x ={ ';' }; // delimitador
     string[] campos= sr.ReadLine().Split(x);
      string fileName = "cheques.txt";

      while(!sr.EndOfStream)
      {
               if( campos[0] == nombre )
                        //aca deberia poner la instruccion para modifcar la linea
 {
     
      // esto inserta texto en un archivo existente, si el archivo no existe lo crea
      StreamWriter writer = File.AppendText(fileName);
      writer.WriteLine(nombre+x+telefono+x);   //abderramah-YO NO SE HACER CONCATENACIONES EN C# x es un char, ¿se puede concatenar a un string?
      writer.Close();
    }
              campos= sr.ReadLine().Split(x);
       }
        fs.Close();
        sr.Close();
}


examina esto, tiene fallos porque yo lo que programo no es C#, mira la linea donde se escribe y concatena bien las variables a ver si te va.

raul338

No se si sea conveniente modificar la linea solamente, lo mejor (para mi) (sin usar base de datos) es que pases todo a un hashtable o lista, y desde ahi lo modificas  y lo guardas todo en uno, puede ser mas largo, pero seria mejor que recorrer toda una linea y sobreescribirla, ademas, se puede hacer eso?? xD (capaz usando Peek y Write)

[D4N93R]

Yo creo que es mejor serializar una colección de una clase tuya :) es más fácil, y menos líneas!

nico56

Como lo serializo, busque información de eso pero no entiendo nada :S