[C con Clase] ficheros

Davidson, Steven srd4121 en njit.edu
Vie Jun 14 06:29:42 CEST 2013


Hola Felician,

2013/6/13 felician draghici <felix1900toamna en yahoo.es>

> Hola, alguien me puede echar una mano con la escritura de un fichero?
> No logro entender porque no me escribe en el fichero comidas.plato y luego
> no saca nada del fichero y lo tengo que escribir de nuevo,como si no se
> almacena nada cuando se vuelve a ejecutar el programa.
> Tengo una struct con todos los datos necesarios y la funcion para guardar
> el nombre de la comida, su precio, y referencia.
> Seria para buscar el plato por su referencia y que te muestre el precio y
> el nombre de esta.
> Gracias por tu tiempo, un saludo
>
>
Desafortunadamente, no corregiste los errores que cometiste en el código
fuente que nos enviaste en un correo-e anterior. Intentaré indicar los
errores en este código fuente.


> struct pedido{
>          char telefono[50];//numero de telefono del cliente
>          char calle[50];//nombre de calle del cliente
>          char portal[50];
>          char piso[50];
>          float pedidos;//valor pedido
>          float total_pedidos;//valor total de los pedidos
>          float precio;
>          int referencia;
>          char plato[50];
>        };
>
> struct pedido comidas_precios(struct pedido comidas)
>

Según el comportamiento de esta función, este parámetro, 'comidas', no te
sirve. Sugiero crear 'comidas' dentro de esta función, pero no como
parámetro. En su lugar, indica 'void' para la lista de parámetros.

{
>     struct pedido {//estructura para lectura
>

Esto va a ser un error, porque has redefinido 'struct pedido'. Elige otro
nombre para esta estructura, para que no haya un conflicto entre nombres de
tipos de datos.

         int ref;
>          char comida[50];
>          float prec;
>         }lectura;
>
>

[CORTE]


>          do
>          {
>             fread(&comidas,sizeof(struct pedido),1,fc);
>

Esto provoca un error lógico, porque estás indicando 'struct pedido' que
definiste en esta función y no 'struct pedido' que definiste globalmente,
que es el tipo de dato de 'comidas'. Por eso deberías usar nombres
diferentes para los tipos de dato.

            if(lectura.ref == comidas.referencia)
>             {
>                  encontrado = 1;
>                  printf("\nSi");
>                  break;
>

En general, no sugiero usar 'break' al menos que no tengas otra forma de
hacer lo que quieres.


>
            }
>          }while(!feof(fc));
>
>

>          if(encontrado==1)
>          {
>                 fgets(comidas.plato,1,fc);
>

Esto no tiene sentido, porque ya leíste el registro encontrado y lo
guardaste en 'comidas'. No necesitas invocar esta función, así que elimina
esta sentencia.

                printf("\nReferencia: %d",comidas.referencia);
>                 printf("\nComida: %s",comidas.plato);
>                 printf("\nPrecio: %.2f",comidas.precio);
>          }
>          else
>          {
>              comidas.referencia=lectura.ref;//
>              printf("\n%d",comidas.referencia);//
>              printf("\nNombre del plato: ");
>              gets(comidas.plato);
>              printf("\nIntroduce el precio de %s: ",comidas.plato);
>              scanf("%f",&comidas.precio);
>              fflush(stdin);
>
>              printf("\n%s",comidas.plato);
>
>          }
>          fwrite(&comidas,sizeof(struct pedido),1,fc);
>

Nuevamente, si no cambias el nombre de la estructura definida aquí en esta
función, esta escritura al fichero no se realizará correctamente como
quieres.

        //fgets(comidas.plato,fc);
>      }
>
>     fclose(fc);
>   getchar();
> return comidas;
> }
>
>

Espero que esto aclare las dudas.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130614/c1c5d889/attachment.html>


Más información sobre la lista de distribución Cconclase