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.
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");
}
}
Porque no usas Base de Datos? Tansiquiera Access, es mucho más comodo... ;)
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
Si sólo es un simple listín telefónico sería desaprobechar recursos una db, ¿no?
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
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.
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)
Yo creo que es mejor serializar una colección de una clase tuya :) es más fácil, y menos líneas!
Como lo serializo, busque información de eso pero no entiendo nada :S
utiliza un archivo XML u utilizas todos los controles y clases de acceso a datos, asi te evitaras problemas y sera como una base de datos.
Un DataSet Tipado, creas la tabla con la estrucutra y lo guardas con un metodo que tiene el dataset.
WriteToXML(string File) creo que es ese.
Atentamente,
Juan Manuel Lombana
Medellín - Colombia
Mira este codigo, tal vez te sirva, no es la forma mas efectiva de hacer lo que te dije, y ademas, le faltan metodos
Quise probar el visual studio 2010 pero me anda re lento asi que .... no es mi mejor intento ;-)
class Agenda
{
// Supongamos que este es el archivo de texto, separado en lineas
string[] texto = { "PEPITO;45879684;", "JUAN;42369851;", "JOSE;47896523;" };
Hashtable agenda = new Hashtable(); // Agenda en memoria
public bool LeerArchivo()
{
if (File.Exists("agenda.txt")) {
StreamReader sr = File.OpenText("agenda.txt");
string linea = "";
int medio = 0;
while (!sr.EndOfStream)
{
linea = sr.ReadLine();
medio = linea.IndexOf(";")
agenda.Add(linea.Substring(0, medio), linea.Substring(medio, linea.LastIndexOf(";", medio) - 1))
}
return true;
} else
return false;
}
public void LeerArray()
{
int medio = 0;
foreach (string s in texto)
{
medio = s.IndexOf(";")
agenda.Add(s.Substring(0, medio), s.Substring(medio, s.LastIndexOf(";", medio) - 1))
}
}
public void Modificar(string nombre, string nuevoTelefono) {
agenda[nombre] = nuevoTelefono;
}
public void GuardarArchivo()
{
StreamWriter sw = File.CreateText("archivo.txt");
foreach (string nombre in agenda)
sw.WriteLine(nombre + ";" + agenda[nombre] + ";");
sw.Flush();
sw.Close();
}
}
EDIT:
Cita de: MANULOMM en 6 Enero 2010, 19:59 PM
utiliza un archivo XML u utilizas todos los controles y clases de acceso a datos, asi te evitaras problemas y sera como una base de datos.
Un DataSet Tipado, creas la tabla con la estrucutra y lo guardas con un metodo que tiene el dataset.
WriteToXML(string File) creo que es ese.
Atentamente,
Juan Manuel Lombana
Medellín - Colombia
Tambien es otra buena opcion, hay miles de formas de resolver tu problema ;D ya sea "a mano" o con clases del .net
Hola, usa archivos de acceso aleatorio para hacer eso.aca tenes un ejemplo:
VB.NET Solution for working with random files (http://www.codeproject.com/KB/files/ybrandomfile.aspx)
tenes una estructura UDT y volcas todos esos datos al archivo.
casi todas las agendas simples estan realizadas asi.
saludos.
HOla de vuelta, gracias por las respuestas, al final lo pude hacer andar, lo que hice fue leer el archivo y montar todo en una lista, modificaba lo que queria, creaba un archivo temporal con el contenido de la lista y reemplazaba el temporal por el orginal.
Podrias mandarme el codigo que utilzaste?:D
Cita de: monal en 12 Noviembre 2013, 05:38 AMPodrias mandarme el codigo que utilzaste?:D
¿Podrías leer las normas?.
Has revivido un tema de hace 3 años para formular una pregunta irrelevante a alguien que ni siquiera va a leer tu mensaje.
CitarÚltima vez activo: 12 Septiembre 2010, 00:57
Fíjense un poco mejor en los detalles importantes.
PD: La manipulación de texto es algo muy sencillo, en Google y en el buscador del foro encontrarás cientos de ejemplos, y aquí encontrarás algún que otro código de ayuda el cual puedes convertir online a C#: http://foro.elhacker.net/net/libreria_de_snippets_posteen_aqui_sus_snippets-t378770.0.html
Si sigues teniendo dudas, formula una pregunta en un nuevo post.
Cierro el tema,
saludos!