C/Visual C - Fichero secuancial binario

 
Vista:
sin imagen de perfil
Val: 14
Ha aumentado su posición en 2 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Fichero secuancial binario

Publicado por Mario (8 intervenciones) el 21/08/2017 11:03:00
Hola, tengo los siguientes códigos para leer un fichero binario, y si se cumple una condición que escriba los datos en el otro fichero, os dejo una imagen del enunciado, no es una tarea es un examen que hice hace tiempo y quisiera saber que código es mas correcto.
fkPJK

Codigo 1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
struct stock{
    int cod_Articulo;
    int nivel_maximo;
    int nivel_minimo;
    int nivel_actual;
    char proveedor[30];
    int precio;
}regstock;
 
struct pedidos{
    int cod_Articulo;
    char proveedor[30];
    int total_pedido;
}regpedidos;
 
 
int main()
{
    FILE *stock,*pedidos;
 
    stock = fopen("stock.dat","rb+");
    pedidos = fopen("pedidos.dat","wb");
 
 
    if(stock == NULL || pedidos == NULL)
    {
        puts("Error al intentar leer los archivos");
    }
    else
    {
        while(!feof(stock))
        {
            fread(&regstock,sizeof(regstock),1,stock);
 
            if(regstock.nivel_actual<regstock.nivel_minimo)
            {
                regpedidos.cod_Articulo=regstock.cod_Articulo;
                strcpy(regpedidos.proveedor,regstock.proveedor);
                regpedidos.total_pedido=regstock.nivel_maximo-regstock.nivel_actual;
                fwrite(&regpedidos,sizeof(regpedidos),1,pedidos);
            }
        }
    }
 
    return 0;
}


Codigo 2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
struct stock{
    int cod_Articulo;
    int nivel_maximo;
    int nivel_minimo;
    int nivel_actual;
    char proveedor[30];
    int precio;
}regstock;
 
struct pedidos{
    int cod_Articulo;
    char proveedor[30];
    int total_pedido;
}regpedidos;
 
 
int main()
{
    FILE *stock,*pedidos;
 
    stock = fopen("stock.dat","rb+");
    pedidos = fopen("pedidos.dat","rb+");
 
    if(stock == NULL || pedidos == NULL)
    {
        puts("Error al intentar leer los archivos");
    }
    else
    {
        fread(&regstock,sizeof(regstock),1,stock);
        while(!feof(stock))
        {
            if(regstock.nivel_actual<regstock.nivel_minimo)
            {
                regpedidos.cod_Articulo=regstock.cod_Articulo;
                strcpy(regpedidos.proveedor,regstock.proveedor);
                regpedidos.total_pedido=regstock.nivel_maximo-regstock.nivel_actual;
                fwrite(&regpedidos,sizeof(regpedidos),1,pedidos);
            }
            fread(&regstock,sizeof(regstock),1,stock);///
        }
     }
 
    fclose(stock);
    fclose(pedidos);
 
    return 0;
}

Hay que suponer que los ficheros stock y pedidos ya están creados, básicamente hay que hacer que mientras el nivel actual sea menor que el mínimo, que escriba los datos en el fichero pedidos. Y el total pedidos sera el numero de pedidos que necesitara para llegar al nivel máximo.

Espero que puedan ayudarme a decir que código es el mas apropiado, gracias a todos de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Fichero secuancial binario

Publicado por Diego (150 intervenciones) el 21/08/2017 13:41:04
Buen día, este es un ejercicio muy recurrido durante trabajos prácticos y exámenes. Al ser un archivo binario debes saber que tipos de datos se guardaron y el orden de los mismos. Es decir, tienes que saber el formato que tiene para luego poder leer todos los campos.

Cuando quieres leer un Struct con un fread, puede que no interprete los datos de una manera correcta, debido a que el tamaño de un struct en un sistema operativo X86 no es el mismo que en un sistema operativo x64,

Por ende tendría que leer campo por campo e ir guardando los campo leidos en un struct. De esa manera evitas copiar bytes de mas o falta de los mismos.

Con respecto a lo otro no creo que te sea dificil la actualizacion del stock disponible.

Te dejo unos links:
Archivo binario: https://es.wikipedia.org/wiki/Archivo_binario#Manipulando_archivos_binarios

archivos en C: https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Manejo_de_archivos

*padding: http://www.programaloco.com/blog/MAjMyADMwAT0.html
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar