Hola Salvador, he aplicado el cambio que me has dicho, y sigue pasando lo mismo, no lee la primera palabra, lee la segunda, y la ultima palabra la escribe dos veces :S<div>la i esta inicializada a 0, y con la funcion fseek deberia ponerse el contador al principio de todo, para leer la primera palabra, xo nose xk no lo hace, me lee la segunda. y luego la ultima me la vuelve a repetir :S</div>
<div>gracias por las ideas para optimizarlo, una vez consiga k funcione me dedicare a mejorarlo</div><div><br></div><div><div>#include <stdio.h></div><div>#include <string.h></div><div><br></div><div><br></div>
<div>struct t_palabra {                      // t_palabra es una estructura que contiene castellano ingles y contadores de aciertos y fallos</div><div>       char castellano[30];</div><div>       char ingles[30];</div><div>
       int cont_aciertos;</div><div>       int cont_errores;</div><div>       };</div><div>       </div><div>              </div><div>int main (void)</div><div><br></div><div>{</div><div>    FILE *fichero;                       // apunta al fichero donde se guardaran las palabras y sus aciertos/fallos</div>
<div>    struct t_palabra palabra;            // definim la variable paraula.</div><div>    char respuesta[50];                  // l'usuari entra la seva resposta</div><div>    int i;                               // recorrer el ficher</div>
<div>    </div><div>struct t__virt_palabra {                    // l'utilitzo per augmentar els contadors cada cop k l'usuari practica 1 paraula. (nose una altre manera de fer-ho)</div><div>       char virt_castellano[30];</div>
<div>       char virt_ingles[30];</div><div>       int virt_cont_aciertos;</div><div>       int virt_cont_errores;</div><div>       };    </div><div>struct t__virt_palabra virt_palabra;        // definim la variable virt_palabra</div>
<div>    </div><div>    fichero = fopen ("datos.dat", "rb+");              // s'obre el ficher datos.dat. rb+ es correcte????? al ficher hi ha tant caracters</div><div>                                                       // castellano, ingles, com enters (els contadors) x tant te que ser binari, no?</div>
<div>    </div><div>    if (fichero == NULL)                                 // salta en cas que no existeixi l ficher datos.dat</div><div>       printf ("Error: No se ha podido abrir el fichero datos.dat.");</div>
<div>    </div><div>    else</div><div>    {   </div><div>        i=0;</div><div>        strcpy (respuesta, "hola");</div><div>        virt_palabra.virt_cont_aciertos = 0;</div><div>        virt_palabra.virt_cont_errores = 0;</div>
<div>        </div><div>        fseek(fichero, i*sizeof(struct t_palabra), SEEK_SET); // se pone el cursor al inicio de todo xk i=0</div><div>        </div><div>        while (!feof(fichero))                        // preguntar al usuari paraules, fins k sarrivi a la ultima paraula, </div>
<div>        {                                                     // despres d'aquesta tindria que parar!!!!! i no ho fa :s, tornar a preguntar </div><div>                                                              // sempre la ultima :(</div>
<div>            if(fread(&palabra, sizeof(palabra), 1, fichero)) {</div><div>                               </div><div>            //fread(&palabra, sizeof(palabra), 1, fichero);     // en la primera iteracio, llegirm la primera paraula gracies a i=0</div>
<div>            printf ("\nEscribe la traduccion de...: ");       // preguntem la paraula</div><div>            printf ("\n%s: ", palabra.castellano);</div><div>            gets(respuesta);                                  // l'usuari entra la paraula</div>
<div>            </div><div>            // analitzar si l'usuari la encertat, o fallat, i incrementar els contadors corresponents x cada paraula</div><div>                            if (strcmp(respuesta, palabra.ingles) == 0)  // compara resposta amb palabra.ingles si es correcte...</div>
<div>                            {</div><div>                            printf ("\nCorrecto!");           // felicitem al usuari x cortesia, tenim que incrementar el contador d'encerts</div><div>                            </div>
<div>                                   // com que no es pot modificar nomes 1 apartat de la estructura paraula, tenim que introduir de nou tot...</div><div>                                   // copiem a la variable virtual (nomes serveix x traspar informacio) la paraula i la seva traduccio</div>
<div>                                   strcpy (virt_palabra.virt_castellano, palabra.castellano);</div><div>                                   strcpy (virt_palabra.virt_ingles, palabra.ingles);</div><div>                                   // incrementem el contador una unitat</div>
<div>                                   //palabra.cont_aciertos a la primera iteració val 0 (aixi sa inicialitzat)</div><div>                                   // i ho guardem a la virtual tb, x tal d copiar tot again.</div>
<div>                                   virt_palabra.virt_cont_aciertos = palabra.cont_aciertos + 1;</div><div>                                   </div><div>                                   // important: com que hem utilitzat fread, el curso esta darrera la paraula llegida ara!!</div>
<div>                                   // la variable virtual conte les noves dades, es a dir, amb el contador incrementat,</div><div>                                   // x tant, tenim que ficar el cursor al inici de la paraula k estavem treballant, xk </div>
<div>                                   // escrigui la informacio just a sobre de la paraula antiga</div><div>                                   // ara la i estava a la posicio dspres de size of (equivalent a i=0), es a dir, dspres de la primera paraula</div>
<div>                                   // en la primera iteració, ja que la i val 0, amb aquesta comanda tornem a la posicio inical</div><div>                                   </div><div>                                   fseek(fichero, i*sizeof(struct t_palabra), SEEK_SET);</div>
<div>                                   </div><div>                                   strcpy (palabra.castellano, virt_palabra.virt_castellano);</div><div>                                   strcpy (palabra.ingles, virt_palabra.virt_ingles);</div>
<div>                                   palabra.cont_aciertos = virt_palabra.virt_cont_aciertos;</div><div>                                   </div><div>                                   // i podem sobreescriure la paraula que voliem</div>
<div>                                   </div><div>                                   fwrite (&palabra, sizeof(palabra), 1, fichero);</div><div>                                   // important, el cursor torna a estar darrera de la primera paraula (en primera iteracio)</div>
<div>                                                                                         </div><div>                            }      // sino es correcte...</div><div>                            </div><div>                            </div>
<div>                            else</div><div>                                {</div><div>                                </div><div>                                printf ("\nIncorrecto.");</div><div>                                </div>
<div>                            </div><div>                                   virt_palabra.virt_cont_errores = palabra.cont_errores + 1; // mateixa estrategia</div><div>                                   strcpy (virt_palabra.virt_castellano, palabra.castellano);</div>
<div>                                   strcpy (virt_palabra.virt_ingles, palabra.ingles);</div><div>                                   </div><div>                                   fseek(fichero, i*sizeof(struct t_palabra), SEEK_SET);</div>
<div>                                   </div><div>                                   strcpy (palabra.castellano, virt_palabra.virt_castellano);</div><div>                                   strcpy (palabra.ingles, virt_palabra.virt_ingles);</div>
<div>                                   palabra.cont_errores = virt_palabra.virt_cont_errores;</div><div>                                  </div><div>                                   </div><div>                                    </div>
<div>                                   fwrite (&palabra, sizeof(palabra), 1, fichero);</div><div>                                   // important, ara el cursor esta despres de la paraula treballada</div><div>                                   </div>
<div>                                }</div><div>                                    </div><div>            // hem acabat la primera iteracio</div><div>            </div><div>            </div><div>            i++; // incrementem la i, per tal danar a la propera paraula.</div>
<div>            fseek(fichero, i*sizeof(struct t_palabra), SEEK_SET);   // coloquem el cursor a la seguent posicio, es a dir, a la posicio 1, </div><div>                                                                    // es a dir, a la segona paraula. nem cap a dalt, ja que al ficher</div>
<div>                                                                    // encara hi ha paraules, i tooorneeem a fer el while.</div><div>            }</div><div>            else {</div><div>                 printf ("\nfin!");</div>
<div>                 }</div><div>            }</div><div>              </div><div>              </div><div>        fclose (fichero);</div><div>        </div><div>        </div><div>        }</div><div>    </div><div> </div>
<div>fflush(stdin);</div><div>printf("\n\nPulse Intro para finalizar...");</div><div>getchar();</div><div><br></div><div><br></div><div>            </div><div>}</div><div><br></div><br><div class="gmail_quote">El 5 de marzo de 2012 23:12, Salvador Pozo <span dir="ltr"><<a href="mailto:salvador@conclase.net">salvador@conclase.net</a>></span> escribió:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">El pasado 2012-03-05 21:30:06, Albert_Munich escribió:<br>
<br>
A> Hola, he intentado siguiendo tus indicaciones solucionar el problema, he<br>
A> creado un contador, que recorre el fichero, y ahora lee todo ordenador, a<br>
A> mas con la funcion feof nueva ya no se va hasta el infinito. el problema<br>
A> ahora esta en la primera palabra que lee y la ultima.<br>
A> la primera palabra no la lee, va directo a la segunda, y la ultima palabra<br>
A> no la repite infinitamente, xo la repite 1 vez mas, es decir, la pone dos<br>
A> veces. no se como solucionarlo, ya que el contador con i=0 indica clarament<br>
A> que lea la primera palabra, y con la funcion feof, en teoria, no tendria k<br>
A> volver a entrar en el while, por tanto, no entiendo porque repite la ultima<br>
A> palabra antes de acabar.<br>
<br>
Hola:<br>
<br>
Esta vez es más fácil. El error está aquí:<br>
----8<------<br>
<div class="im">        if(fread(&palabra, sizeof(palabra), 1, fichero)) {<br>
            fread(&palabra, sizeof(palabra), 1, fichero);<br>
</div>...<br>
----8<------<br>
<br>
El fallo es leer dos veces la palabra, con la lectura del interior del "if" es suficiente. En la primera iteración, la segunda lectura anula la lectura de la primera palabra, por eso no sale la primera.<br>
<br>
En la última iteración la segunda lectura falla, pero se mantiene la palabra leída en la primera (la del if).<br>
<br>
Puedes compactar mucho tu programa:<br>
- No necesitas la estructura t__virt_palabra para nada. Ya que lees una estructura "palabra" desde el fichero, para actualizar el fichero bastará con incrementar palabra.errores o palabra.aciertos, y volver a usar la misma "palabra" para escribirla en el fichero, en la posición en la que estaba. Esto te evita asignar valores que no cambian: las palabras y el contador que no modificas.<br>

- Evita repetir el código, por ejemplo, cuando verificas si el usuario ha acertado o no la respuesta, muchas de las sentencias son comunes tanto al if como al else, saca esas sentencias del bloque if..else.<br>
- No necesitas asignar un valor inicial a la respuesta, ya que la primera vez que se evalúa es después de leerla desde el teclado.<br>
- Evita usar la función gets, en su lugar usa fgets, por ejemplo, fgets(respuesta, 30, stdin);<br>
<div class="HOEnZb"><div class="h5"><br>
Hasta pronto.<br>
<br>
--<br>
Salvador Pozo (Administrador)<br>
mailto:<a href="mailto:salvador@conclase.net">salvador@conclase.net</a><br>
_______________________________________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br>
</div></div></blockquote></div><br></div>