Leer y Escribir Estructuras de Datos VB6->C#

15/01/2008 - 17:47 por Eslender | Informe spam
En vb6 es muy eficiente leer y escribir estructuras de datos en archivos
binarios, tengo este ejemplo simple:

Option Explicit

Private Type structSample
Item As Integer
Value As Single
End Type

Private Sub EjemploSimple(File As String)
Dim ff As Long
Dim a() As structSample
Dim n As Long

' escribiendo
n = 1 ' dos ítems
ReDim a(0 To 1)
a(0).Item = 1
a(0).Value = 123.45
a(1).Item = 2
a(1).Value = 678.9

ff = FreeFile
Open File For Binary Access Write As ff
Put #ff, , n
Put #ff, , a()
Close ff
Erase a

' leyendo
Open File For Binary Access Read As ff
Get #ff, , n
ReDim a(0 To n)
Get #ff, , a()
Close ff

MsgBox a(1).Value ' muestra 678.9

Erase a
End Sub

Private Sub main()
EjemploSimple app.Path & "\sample.bin"
End Sub

¿Cómo sería en C#?
¿Donde encontraría una guía documentada?

Gracias -

Preguntas similare

Leer las respuestas

#1 Octavio Hernandez
15/01/2008 - 18:22 | Informe spam
Hola,

Mira esto:

http://samples.gotdotnet.com/QuickS...write.aspx

En esos tutoriales tienes una buena cantidad de ejemplos de todo tipo...

Slds - Octavio



"Eslender" wrote in message
news:
En vb6 es muy eficiente leer y escribir estructuras de datos en archivos
binarios, tengo este ejemplo simple:

Option Explicit

Private Type structSample
Item As Integer
Value As Single
End Type

Private Sub EjemploSimple(File As String)
Dim ff As Long
Dim a() As structSample
Dim n As Long

' escribiendo
n = 1 ' dos ítems
ReDim a(0 To 1)
a(0).Item = 1
a(0).Value = 123.45
a(1).Item = 2
a(1).Value = 678.9

ff = FreeFile
Open File For Binary Access Write As ff
Put #ff, , n
Put #ff, , a()
Close ff
Erase a

' leyendo
Open File For Binary Access Read As ff
Get #ff, , n
ReDim a(0 To n)
Get #ff, , a()
Close ff

MsgBox a(1).Value ' muestra 678.9

Erase a
End Sub

Private Sub main()
EjemploSimple app.Path & "\sample.bin"
End Sub

¿Cómo sería en C#?
¿Donde encontraría una guía documentada?

Gracias -
Respuesta Responder a este mensaje
#2 Jesús López
16/01/2008 - 14:53 | Informe spam
En C# es facil guardar y recuperar cualquier estructura de datos que sea
serializable en un archivo y también recuperarla de un archivo. Para ello
serializamos la estructura de datos en binario y la escribimos en un
archivo, o leemos el archivo y deserializamos el objeto:

Por ejemplo podríamos tener la siguiente clase para guardar o leer cualquier
objeto de un archivo:

public static class Persister
{
public static void SaveToFile(object obj, string filePath)
{
using (FileStream file = new FileStream(filePath,
FileMode.Create))
{
BinaryFormatter serializer = new BinaryFormatter();
serializer.Serialize(file, obj);
}
}

public static object ReadFromFile(string filePath)
{
using (FileStream file = new FileStream(filePath,
FileMode.Open))
{
BinaryFormatter serializer = new BinaryFormatter();
return serializer.Deserialize(file);
}
}
}


Por ejemplo podríamos tener una clase como la siguiente:


[Serializable()]
public class ClassSample
{
private int _item;
public int Item
{
get { return _item; }
set { _item = value; }
}

private double _value;
public double Value
{
get { return _value; }
set { _value = value; }
}

public ClassSample() { }

public ClassSample(int item, double value)
{
_item = item;
_value = value;
}

public override string ToString()
{
return "(" + this._item.ToString() + ", " +
this._value.ToString() + ")";
}
}



Y guardar una lista de objetos de esta clase en un archivo y después
leerlos:

public class Samples
{
public static void Sample()
{
List<ClassSample> list = new List<ClassSample>();

list.Add( new ClassSample(1, 1.0));
list.Add( new ClassSample(2, 2.0));
list.Add( new ClassSample(3, 3.0));

Persister.SaveToFile(list, "Lista.bin");

list = (List<ClassSample>) Persister.ReadFromFile("Lista.bin");

foreach (ClassSample obj in list)
{
Debug.WriteLine(obj.ToString());
}

}

}

La principal diferencia de esta técnica comparada con lo de leer y escribir
estructuras de datos binarias en VB. Es que en C# lo tienes que leer todo de
golpe y escribirlo todo de golpe, mientras que en VB puedes moverte por los
registros por el número de registro y leer/escribir sólo un registro. Sin
embargo cuando tenemos una colección de registros que queremos leer/escribir
otra manera que no sea todo a la vez, sería mejor utilizar una base de datos
que te da además mucha más funcionalidad. Hay muchos sistemas de bases de
datos lightweith que te podrían servir perfectamente para almacenar
información en local. Por citarte algunas gratis (en orden de mi propia
preferencia)

SQLite: http://sqlite.phxsoftware.com/
SQL Server compact:
http://www.microsoft.com/sql/editio...fault.mspx
Access (esto ya viene con el Windows)

Saludos:

Jesús López
www.solidq.com




"Eslender" escribió en el mensaje
news:
En vb6 es muy eficiente leer y escribir estructuras de datos en archivos
binarios, tengo este ejemplo simple:

Option Explicit

Private Type structSample
Item As Integer
Value As Single
End Type

Private Sub EjemploSimple(File As String)
Dim ff As Long
Dim a() As structSample
Dim n As Long

' escribiendo
n = 1 ' dos ítems
ReDim a(0 To 1)
a(0).Item = 1
a(0).Value = 123.45
a(1).Item = 2
a(1).Value = 678.9

ff = FreeFile
Open File For Binary Access Write As ff
Put #ff, , n
Put #ff, , a()
Close ff
Erase a

' leyendo
Open File For Binary Access Read As ff
Get #ff, , n
ReDim a(0 To n)
Get #ff, , a()
Close ff

MsgBox a(1).Value ' muestra 678.9

Erase a
End Sub

Private Sub main()
EjemploSimple app.Path & "\sample.bin"
End Sub

¿Cómo sería en C#?
¿Donde encontraría una guía documentada?

Gracias -
Respuesta Responder a este mensaje
#3 Harvey Triana
17/01/2008 - 23:24 | Informe spam
Un ejemplo:

struct structWits
{
public int Wits;
public float Value;
public structWits(int pWits, float pValue)
{
Wits = pWits;
Value = pValue;
}
}
struct structOnlineRecord
{
public int Count;
public structWits[] Wits;
public structOnlineRecord(int pCount)
{
Count = pCount;
Wits = new structWits[Count];
}
}

private void EjemploSimple()
{
structOnlineRecord a = new structOnlineRecord(2);

a.Wits[0].Wits =1;
a.Wits[0].Value = 6000.0F;
a.Wits[1].Wits = 2;
a.Wits[1].Value = 5800.5F;

SaveToBinaryFile(a, "C:\\WELLS\\a2.bin");
}

private void SaveToBinaryFile(structOnlineRecord a, string FileName)
{
using (FileStream f = new FileStream(FileName,
FileMode.OpenOrCreate))
{
BinaryWriter bw = new BinaryWriter(f);
bw.Write(a.Count);
for (int i = 0; i < a.Count; i++)
{
bw.Write(a.Wits[i].Wits);
bw.Write(a.Wits[i].Value);
}
bw.Flush();
bw.Close();
}
}

Para leer, usas BinaryReader. Los archivos no son compatibles con la misma
forma de VB6, no sé bien como C# escribe la secuencia de bytes. Hay otras
técnicas, mira:
http://dotnetjunkies.com/WebLog/chr.../9016.aspx

Recuerda marcar como [Serializable] si vas a usar BinaryFormatter

<Harvey Triana />
http://vexpert.mvps.org


"Eslender" wrote:

En vb6 es muy eficiente leer y escribir estructuras de datos en archivos
binarios, tengo este ejemplo simple:

Option Explicit

Private Type structSample
Item As Integer
Value As Single
End Type

Private Sub EjemploSimple(File As String)
Dim ff As Long
Dim a() As structSample
Dim n As Long

' escribiendo
n = 1 ' dos ítems
ReDim a(0 To 1)
a(0).Item = 1
a(0).Value = 123.45
a(1).Item = 2
a(1).Value = 678.9

ff = FreeFile
Open File For Binary Access Write As ff
Put #ff, , n
Put #ff, , a()
Close ff
Erase a

' leyendo
Open File For Binary Access Read As ff
Get #ff, , n
ReDim a(0 To n)
Get #ff, , a()
Close ff

MsgBox a(1).Value ' muestra 678.9

Erase a
End Sub

Private Sub main()
EjemploSimple app.Path & "\sample.bin"
End Sub

¿Cómo sería en C#?
¿Donde encontraría una guía documentada?

Gracias -
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida