<div dir="ltr">Hola Felician,<div class="gmail_extra"><br><div class="gmail_quote">2013/6/3 felician draghici <span dir="ltr"><<a href="mailto:felix1900toamna@yahoo.es" target="_blank">felix1900toamna@yahoo.es</a>></span><br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="font-size:12pt;font-family:'times new roman','new york',times,serif">
<div>Hola tengo una duda con los ficheros y las estructuras,si alguien me puede echar una mano</div><div>Resulta que es un proyecto final y no se si esta bien utilizar una estructura para guardar todos los datos introducidos en un fichero o habra que utilizar una estructura de tipo array struct ejemplo estructura[]..ya sabeis,mi profe me esta volviendo un poco loco y necesito vuestra ayuda,tengo este programa de pedidos telefonicos(como por ejemplo un telecomida china),la pregunta es: si guardo todo en una estructura y se escribe luego en el fichero,luego puedo utilizar la misma estructura o habra que hacer una estructura "array"</div>
<div>,si se hace con una estructura nada mas los datos de ella deberan ser escritos en una fila del fichero o da igual de la escritora de este porque a mi me la escribe a continuacion y no puede
 hacer la comparacion entre numeros si los busco...gracias un saludo</div><div><br></div></div></blockquote><div><br></div><div style>Ciertamente hay dos maneras de resolver el problema presentado. Puedes optar por obtener el registro y escribirlo inmediatamente. De esta forma, puedes reusar la misma variable para obtener más registros. Es decir, creas una solución de lectura parcial del usuario y escritura parcial al fichero.</div>
<div style><br></div><div style>La otra solución es obtener todos los registros del usuario y guardarlos en memoria. Luego, escribes todos los registros en memoria al fichero. La ventaja es que podemos manipular los registros - y la información contenida en ellos - directamente en memoria. Cuando queramos, guardamos estos registros en el fichero. Realizar operaciones con el fichero suelen ser más lentas en ejecutarse que realizar las mismas operaciones en memoria.</div>
<div style><br></div><div style>Personalmente, si vas a realizar varias operaciones con los registros dados, entonces aconsejo que las hagas en memoria. Cuando estés listo para guardar esos registros, porque no van a ser modificados, entonces los guardas en el fichero. Por otro lado, si estás pensando en permitir miles de millones de registros y cada uno ocupa 100 bytes, entonces esto implicaría más de 93 GB. En el disco duro, esto no es un grave problema hoy día, pero para memoria RAM sí que lo es. En este caso, optaríamos por realizar las operaciones necesarias por tandas (grupos) de millones de registros, que seguramente ocuparán unos cententares de megabytes en memoria. La otra opción es simplemente crear una estructura de datos para dirigirnos a las posiciones en el fichero de los registros que queremos acceder, para poder realizar las operaciones con cada registro leído uno a uno.</div>
<div style><br></div><div style>Hay algunos matices a destacar en tu código fuente.</div><div style><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div><div style="font-size:12pt;font-family:'times new roman','new york',times,serif"><div><br></div><div>struct pedido introducir_datos(struct pedido telef);<br>int menu_programa(void);<br>int ver_menu(void);<br>
void mostrar_pedidos(struct pedido telef);</div><div>struct pedido{<br>         char telefono[10];//numero de telefono del cliente<br>         char calle[40];//nombre de calle del cliente<br>         char portal[4];<br>         char piso[5];<br>
         float pedidos;//valor pedido<br>         float total_pedidos;//valor total de los pedidos<br>       };</div></div></div></blockquote><div><br></div><div style>Debes definir esta estructura antes de tus funciones, porque algunos prototipos hacen referencia a este tipo de dato, que el compilador desconoce, porque defines 'pedido' póstumamente a usarlo.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div style="font-size:12pt;font-family:'times new roman','new york',times,serif">
<div><span style="font-size:12pt">int menu_programa(void)</span><br></div><div>{//FUNCION QUE PERMITE MOSTRAR EL MENU PRINCIPAL DEL PROGRAMA<br>    int var;<br>    system("cls");<br>    <br>    printf("\n\tMENU PRINCIPAL");<br>
    printf("\n\n1) Insertar telefono ");<br>    printf("\n2) Modificar pedido(ultimos 4 digitos telefonicos) ");<br>    printf("\n3) Ver total dinero sacado en el dia ");<br>    printf("\n4) Consultar precios
 productos y modificarlos ");<br>    printf("\n5) Mostrar total pedidos(numeros de telefonos)");<br>    printf("\n6) Borrar pedido por pedido");<br>    printf("\n0) Salir programa"); <br>
    <br>    printf("\n\nTeclea opcion: ");<br>    scanf("%d",&var);<br>    fflush(stdin);<br>    <br></div></div></div></blockquote><div><br></div><div style>Ten presente que este comportamiento de 'fflush()' no es estándar; pero en MS-DOS y MS-Windows, sí funcionará.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div style="font-size:12pt;font-family:'times new roman','new york',times,serif">
<div> return var;<br>getchar();       <br></div></div></div></blockquote><div><br></div><div style>Esto no tiene sentido. Si retornas, la función termina de ejecutarse inmediatamente, por lo que nunca llega a 'getchar()'.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div style="font-size:12pt;font-family:'times new roman','new york',times,serif">
<div>}</div><div>struct pedido introducir_datos(struct pedido telef)<br>{//FUNCION QUE PERMITE AÑADIR DATOS EN EL FICHERO DE LOS PEDIDOS<br>      struct pedido {<br>         char num_tel[50];<br>         char direccion[50];<br>
         char portal2[50];<br>         char piso2[50];
 <br>        }lectura;<br>    <br></div></div></div></blockquote><div><br></div><div style>Esto no tiene sentido y además puede no funcionar como quieres. El error está en redefinir 'pedido'; porque ya la tienes definida globalmente. Simplemente usa el tipo de dato:<br>
<br>struct pedido lectura;</div><div><br></div><div>Es cierto que los campos tienen diferentes nombres, pero más importante es la diferencia de tipos.<br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div><div style="font-size:12pt;font-family:'times new roman','new york',times,serif"><div>     FILE *fichero;<br>     int a,b,encontrado=0;//contador<br>     char t,p,po,c;<br>    <br>     for(b=0;b<50;b++)<br>
     { <br>         lectura.direccion[b] = '\0';   <br>         lectura.piso2[b] = '\0';  <br>         lectura.portal2[b] = '\0';<br>         lectura.num_tel[b] = '\0'; <br>     }<br>          <br>
</div></div></div></blockquote><div><br></div><div style>Esto no es necesario. Simplemente indica el carácter nulo para el comienzo de cada cadena. Por ejemplo,</div><div style><br></div><div style><div>lectura.direccion[0] = lectura.piso2[0] = lectura.portal2[0] = lectura.num_tel[0] = '\0';</div>
</div><div><br></div><div style>Por otro lado, podrías haber inicializado la estructura, 'lectura', en lugar de asignar valores iniciales después de su definición. Esto es,</div><div style><br></div><div style>struct pedido lectura = { "", "", "", "" };<br>
</div><div style><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div style="font-size:12pt;font-family:'times new roman','new york',times,serif">
<div><span style="font-size:12pt">        scanf("%s",&lectura.num_tel);</span></div></div></div></blockquote><div><br></div><div style>Esto es incorrecto. 'num_tel' es un array. No tiene sentido encontrar su dirección de memoria, porque un array ya es una dirección de memoria. Por lo tanto, escribe:<br>
<br>scanf( "%s", lectura.num_tel );<br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div><div style="font-size:12pt;font-family:'times new roman','new york',times,serif"><div>        fflush(stdin); <br>        <br>       <br>        fread(&telef.telefono,sizeof(telef.telefono),1,fichero);<br>
</div></div></div></blockquote><div><br></div><div style>Aquí, lo mismo; 'telefono' ya es una dirección de memoria. Escribe:<br><br>fread( telef.telefono, sizeof(telef.telefono), 1, fichero );<br></div><div><br></div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div style="font-size:12pt;font-family:'times new roman','new york',times,serif">
<div><span style="font-size:12pt">       if(strcmp(telef.telefono,</span><span style="font-size:12pt">lectura.num_tel)!=0)</span></div></div></div></blockquote><div><br></div><div style>Aquí puedes tener un error. Como 'telefono' contiene menos caracteres que 'num_tel', es posible que la comparación sea errónea.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div style="font-size:12pt;font-family:'times new roman','new york',times,serif">
<div><br>       //if(encontrado==0)<br>       {      <br>         
 printf("\nEscriba el nombre de la calle:");<br>          scanf("%s",&lectura.direccion);<br>          fflush(stdin);<br>          printf("\nPortal:");<br>          scanf("%s",&lectura.portal2);<br>
          fflush(stdin);<br>          printf("\nPiso y letra:");<br>          scanf("%s",&lectura.piso2);<br></div></div></div></blockquote><div><br></div><div style>Nuevamente, estos campos son arrays: no uses el operador &.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div style="font-size:12pt;font-family:'times new roman','new york',times,serif">
<div>          fflush(stdin);<br>        <br>          strcpy(telef.telefono,lectura.num_tel);<br>         
 strcpy(telef.portal,lectura.portal2);<br>          strcpy(telef.piso,lectura.piso2);<br>          strcpy(telef.calle,lectura.direccion);<br></div></div></div></blockquote><div><br></div><div><div>Aquí puedes tener errores. Como los campos de 'telef' contienen menos caracteres que los de 'lectura', se puede dar el caso peligroso de copiar caracteres de más que rebasen las limitaciones de tales campos. Esto supone sobreescribir memoria posterior.</div>
</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div style="font-size:12pt;font-family:'times new roman','new york',times,serif">
<div>          fwrite(&telef.telefono,sizeof(telef.telefono),1,fichero);<br>          fwrite(&telef.calle,strlen(telef.calle),1,fichero);<span style="font-family:arial;font-size:small"> </span></div></div></div></blockquote>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div style="font-size:12pt;font-family:'times new roman','new york',times,serif">
<div>          fwrite(&telef.portal,strlen(telef.portal),1,fichero);<br>          fwrite(&telef.piso,strlen(telef.piso),1,fichero);   <br></div></div></div></blockquote><div><br></div><div><div>Nuevamente, estos campos son arrays; no uses el operador &.</div>
</div><div><br></div><div style>De todas maneras, tienes un error al intentar escribir las cadenas al fichero binario, en lugar de escribir los arrays. Como se trata de un fichero binario, la idea es poder leer un campo o incluso el registro entero de una sola sentada porque sus tamaños son fijos.</div>
<div style><br></div><div style>Podrías escribir el registro con una sola llamada a 'fwrite()'.</div><div style><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div><div style="font-size:12pt;font-family:'times new roman','new york',times,serif"><div>       }<br>       else<br>       {   <br>          fread(&telef.telefono,sizeof(telef.telefono),1,fichero);
 <br>          fread(&telef.calle,strlen(telef.calle),1,fichero);<br>          fread(&telef.portal,strlen(telef.portal),1,fichero);<br>          fread(&telef.piso,strlen(telef.piso),1,fichero);<br></div></div>
</div></blockquote><div><br></div><div style>No tiene sentido calcular el tamaño de la cadena, cuando vas a leer desde el fichero una cadena completamente diferente a la que tienes en memoria. Nuevamente, deberías leer los arrays enteros con la cantidad fija. Además, podrías leer todo el registro de golpe con una sola llamada a 'fread()'.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div style="font-size:12pt;font-family:'times new roman','new york',times,serif">
<div>       //   fgets(telef.calle,1,fichero);<br>        //  fgets(telef.portal,1,fichero);<br>        //  fgets(telef.piso,1,fichero);<br>          printf("\nTelefono: %s",telef.telefono);<br>          printf("\nCalle: %s",telef.calle);<br>
          printf("\nPortal: %s",telef.portal);<br>          printf("\nPiso:
 %s",telef.piso);   <br>       }<br>     }<br>     <br>    <br> ///   }//fin operaciones con el fichero<br>     fclose(fichero);<br>     <br>     <br>getchar();     <br></div></div></div></blockquote><div><br></div>
<div style>La función debe retornar una estructura; pero no retornas nada.</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div><div style="font-size:12pt;font-family:'times new roman','new york',times,serif"><div>}</div><div>//FUNCION PARA VER EL LISTADO DE LAS COMIDAS Y PRECIOS QUE HAY EN EL RESTAURANTE</div><div>int ver_menu(void)<br>
{<br>     system("cls");<br>     FILE *fm;//fichero menu comidas<br>     char letra;<br>     <br>     fm = fopen("C://c_files//proyecto//comidas.txt","rb");<br>     <br>     if(fm==NULL)<br>     {<br>
        printf("\nError de lectura de fichero menu");<br>    
 }<br>     else<br>     {<br>        letra = fgetc(fm); <br>         while(feof(fm)==0)<br>         {<br>            printf("%c",letra);<br>            letra = fgetc(fm);<br>         }<br>     }<br>     <br>     fclose(fm);<br>
    <br> getchar();<br>return 0; <br></div></div></div></blockquote><div><br></div><div style>Si no tienes pensado retornar nada; entonces indica 'void' como el tipo de retorno de esta función.</div><div style><br>
</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div style="font-size:12pt;font-family:'times new roman','new york',times,serif">
<div>}</div></div></div></blockquote><div><br></div><div><br></div><div style>Espero que todo esto te sea de ayuda.</div><div><br></div><div style>Steven</div><div style><br></div></div></div></div>