Leer un archivo binario y guardarlo en una estructura

04/07/2005 - 18:45 por William Contreras | Informe spam
Hola a todos, les cuento que estoy migrando una aplicacion de turbo C a C# y
tengo una funcion que lo que hace es leer un archivo binario y ir cuardando
el resultado en una estructura como la siguiente:

typedef struct {
enum fcn f; /*Mnemotecnico */
int ni; /*Nivel 0..MAXNIV */
int di; /*Direccion o desplazamiento 0..32767*/
} ensamblador;

la funcion que utilizo en turbo C es la siguiente:

/*Analizar argumentos de main*/
if (argc!=2)
printf("Uso : execp progobjeto.obp");
else {
if ( (obj=fopen(argv[1],"r+b"))==NULL ) {
printf("error al abrir archivo %s",argv[1]);
exit(1);
};
/*Leer el array de codigo*/
ic=0;
fread(&codigo[ic],sizeof(ensamblador),1,obj);
while ( !feof(obj) ) {
++ic;
fread(&codigo[ic],sizeof(ensamblador),1,obj);
}
/*listar_p();*/ /*Quita los comentarios para verificar que el array*/
/*de codigo ha sido cargado correctamente. */
interpretar(); /*Interpreta el codigo-p*/
fclose(obj);
}

y lo que yo quiero es hacer esta misma funcion en C# y el problema es que no
existe el Fread ni el Fwrite, ya investigue como se lee un archivo binario,
pero no se como hacer para que lea los byte exactos de la estructura, asi
como lo hace el fread, si alguien me ayuda se lo agradecere mucho ya que
tengo que entregar mi proyecto en esta semana y no se como hacer esto!!!!

Saludos William Contreras
 

Leer las respuestas

#1 William Contreras
09/07/2005 - 21:14 | Informe spam
gracias Octavio me sirvio de mucho tu ejemplo!!!!
saludos William Contreras
"Octavio Hernandez" escribió en el mensaje
news:OmnBK%
William,

Ahí va un ejemplo. Dado que es para una solución "mixta" (el fichero puede
haber sido creado con Turbo C, ¿no?), utiliza el conocimiento sobre el
tamaño de la estructura y el formato de representación interna de los
enteros en la plataforma Intel (con el byte menos significativo delante).
Si fuera una solución .NET pura, usaríamos otro tipo de solución basado
probablemente en la serialización (binaria o textual).

Salu2 - Octavio

public struct Ensamblador
{
public int f, cn, di;
public Ensamblador(int f, int cn, int di)
{
this.f = f; this.cn = cn; this.di = di;
}
}

private void button2_Click(object sender, System.EventArgs e)
{
const int tamañoRegistro = 12;

FileStream f = new FileStream("DATOS.BIN", FileMode.Open,
FileAccess.Read);
try
{
BinaryReader rdr = new BinaryReader(f);
try
{
do
{
byte[] datos = new byte[tamañoRegistro];
int n = rdr.Read(datos, 0, tamañoRegistro);
if (n < tamañoRegistro)
break;
Ensamblador ens = new Ensamblador(
datos[0] + datos[1] * 256 + datos[2] * 256 * 256 + datos[3] * 256 *
256 * 256,
datos[4] + datos[5] * 256 + datos[6] * 256 * 256 + datos[7] * 256 *
256 * 256,
datos[8] + datos[9] * 256 + datos[10] * 256 * 256 + datos[11] * 256
* 256 * 256);
// copiar el registro a algún lado, etc.
Console.WriteLine(ens.f);
}
while (true);
}
finally
{
rdr.Close();
}
}
finally
{
f.Close();
}
}

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

"William Contreras" escribió en el mensaje
news:
Hola Octavio, mira no seria mucha molestia que me pusieras un ejemplo?
esque ya probe y nada!!! gracias de antemano por todo
saludos william contreras
"Octavio Hernandez" escribió en el mensaje
news:
Winlliam,

Te recomendaría que en el programa en Turbo C preguntaras por
sizeof(ensamblador) para saber cuánto ocupa la estructura, porque ese
tamaño podría variar en función de las opciones del compilador de C.

Luego debes utilizar un BinaryReader sobre un FileStream, y utilizar la
versión de Read() que te permite leer un array de bytes indicando
cuántos bytes quieres.

Slds - Octavio

"William Contreras" escribió en el
mensaje news:%
Hola a todos, les cuento que estoy migrando una aplicacion de turbo C a
C# y tengo una funcion que lo que hace es leer un archivo binario y ir
cuardando el resultado en una estructura como la siguiente:

typedef struct {
enum fcn f; /*Mnemotecnico */
int ni; /*Nivel 0..MAXNIV */
int di; /*Direccion o desplazamiento 0..32767*/
} ensamblador;

la funcion que utilizo en turbo C es la siguiente:

/*Analizar argumentos de main*/
if (argc!=2)
printf("Uso : execp progobjeto.obp");
else {
if ( (obj=fopen(argv[1],"r+b"))==NULL ) {
printf("error al abrir archivo %s",argv[1]);
exit(1);
};
/*Leer el array de codigo*/
ic=0;
fread(&codigo[ic],sizeof(ensamblador),1,obj);
while ( !feof(obj) ) {
++ic;
fread(&codigo[ic],sizeof(ensamblador),1,obj);
}
/*listar_p();*/ /*Quita los comentarios para verificar que el array*/
/*de codigo ha sido cargado correctamente. */
interpretar(); /*Interpreta el codigo-p*/
fclose(obj);
}

y lo que yo quiero es hacer esta misma funcion en C# y el problema es
que no existe el Fread ni el Fwrite, ya investigue como se lee un
archivo binario, pero no se como hacer para que lea los byte exactos de
la estructura, asi como lo hace el fread, si alguien me ayuda se lo
agradecere mucho ya que tengo que entregar mi proyecto en esta semana y
no se como hacer esto!!!!

Saludos William Contreras














Preguntas similares