Guardar variables en ficheros C

Iniciado por nyper01, 16 Diciembre 2013, 00:19 AM

0 Miembros y 1 Visitante están viendo este tema.

nyper01

Hola, probablemente me recordéis del anterior post "Ayuda con struct en C". he creado esto en un tema aparte por que ya había dado por cerrado el otro (gracias a Amchacon por la ayuda), pero si debería haberlo añadido al anterior tema, lo siento.

Tengo ya el programa casi acabado pero tengo una ultima duda sobre los ficheros, que se me están resistiendo  :(  

partimos de este código:
Citar

#include <stdio.h>
#include <stdlib.h>
   
   struct jugadas
    {
       int f;
       int c;
    }jugadas;


int main(int argc, char *argv[]) {

//[...] codigo intermedio [...]
}

int funcion(int c, int f)
{
int fa;
int ca;
       FILE *fjugadas;
       fjugadas=fopen("ia.txt","r+");
       if(fjugadas!=NULL)
       {
      while(!feof(fjugadas))
        {
         if(fread(&jugadas,sizeof(jugadas),1,fjugadas))
          {
            fa=jugadas.f;
            ca=jugadas.c;
          }
        }
       }
// y aqui es donde viene mi duda (ver abajo)

fclose(fjugadas);

}

Vale, ahora que estamos situados, mi duda es como puedo hacer para que ahora que he almacenado los datos del fichero en las variables "fa" y "ca", sobrescribir el fichero con los valores de "f" y "c" para que la próxima vez que llame a esta función los valores del fichero que pasen a "fa" y "ca" sean los que ahora mando como "f" y "c". Espero haberme explicado bien.

He intentado de numerosas formas pero no consigo sobrescribir con el contenido de las variables.
Probablemente este totalmente errado pero ¿no seria algo tal que así?
Citar
int fputc(int fa, FILE *fjugadas);
o
Citar
fprintf (jugadas.f, "%d",&f);

Muchas gracias por la ayuda de antemano

xiruko

Si en el fichero solamente tienes esas dos variables y quieres modificarlas las dos podrías usar la función rewind(). Lo que consigues con esta función es situar en el inicio el cursor asociado al fichero, por lo que la próxima vez que escribas en él sobrescribirás lo que haya, en lugar de añadirlo al final.

Si tuvieras muchas variables y solo quisieras modificar unas cuantas, deberás jugar con las funciones fsetpos(), fgetpos() y fseek() para ir moviendo el cursor del fichero hacia donde quieras leer y/o escribir.

Saludos.

nyper01

Gracias por la respuesta, pero no me has solucionado nada. igual es que no te he entendido.
Segun tengo entendido con abrir el fichero como
Citarfjugadas=fopen("ia.txt","r+");
con la "r+" de "lectura y escritura" ya me destruye todo lo que hubiera anteriormente escrito (si no es asi, con w+ si que debería hacérmelo, ¿no?)

Mi verdadera duda esta en como hacer que me almacene el valor de la variable, es que no consigo hacer que me escriba nada.
En otro lado del programa pido al usuario que me escriba algo y eso si que me lo almacena en otro fichero, pero ¿como almaceno algo que no me han escrito?, el valor de una variable INT para ser mas exacto.

De todas formas, muchas gracias por tu tiempo, valoro mucho a la gente que ayuda así    :D

xiruko

CitarGracias por la respuesta, pero no me has solucionado nada. igual es que no te he entendido.

Sin ofender, pero yo añadiría a eso las ganas que te lo den todo hecho. Si te miras el ejemplo que hay en en enlace de la función fgetpos() lo entenderás. Entiendo que es mucho trabajo copiar y pegar el código, compilarlo, y correrlo tú mismo para hacer la prueba, así que te dejo el código y la salida aquí:

#include <stdio.h>

int main()
{
  char nombre[11] = "datos4.dat",
       mensaje[81]="Esto es nua rpueba usando fgetpos y fsetpos.";
  FILE *fichero;
  fpos_t posicion=0, comienzo;

  fichero = fopen( nombre, "w+" );
  printf( "Fichero: %s -> ", nombre );
  if( fichero )
    printf( "creado (ABIERTO)\n" );
  else
  {
    printf( "Error (NO ABIERTO)\n" );
    return 1;
  }

  fgetpos( fichero, &comienzo );
  printf( "Posicion del fichero: %d\n", posicion );

  fprintf( fichero, mensaje );
  printf( "\nEscrito: \"%s\"\n", mensaje );

  fgetpos( fichero, &posicion );
  printf( "Posicion del fichero: %d\n", posicion );

  fsetpos( fichero, &comienzo );
  fprintf( fichero, "%s", "Esto es una prueba" );
  printf( "Corregiendo errores...Escrito: \"Esto es una prueba\"\n" );

  fgetpos( fichero, &posicion );
  printf( "Posicion del fichero: %d\n", posicion );

  rewind( fichero );
  printf( "\"Rebobinando\" el fichero -> Vuelta al comienzo\n" );
  fgetpos( fichero, &posicion );
  printf( "Posicion del fichero: %d\n", posicion );

  printf( "\nLeyendo del fichero \"%s\"\n", nombre );
  fgets( mensaje, 81, fichero );
  printf( "\"%s\"\n\n", mensaje );

  fgetpos( fichero, &posicion );
  printf( "Posicion del fichero: %d\n", posicion );

  if( !fclose(fichero) )
    printf( "Fichero cerrado\n" );
  else
  {
    printf( "Error: fichero NO CERRADO\n" );
    return 1;
  }

  return 0;
}


Y su salida:
:~$ ./fichero
Fichero: datos4.dat -> creado (ABIERTO)
Posicion del fichero: 0

Escrito: "Esto es nua rpueba usando fgetpos y fsetpos."
Posicion del fichero: 44
Corregiendo errores...Escrito: "Esto es una prueba"
Posicion del fichero: 18
"Rebobinando" el fichero -> Vuelta al comienzo
Posicion del fichero: 0

Leyendo del fichero "datos4.dat"
"Esto es una prueba usando fgetpos y fsetpos."

Posicion del fichero: 44
Fichero cerrado


Y qué sacamos de todo esto? Tú cuando abres un fichero el cursor asociado a él estaría en la posición 0. Si con fgets(), o la función que sea, lees 10 carácteres (por ejemplo, los correspondientes a tus variables), entonces el cursor avanzará a la posición 10. Si luego quieres sobrescribir las variables que tenías, deberás hacer retroceder el cursor, con rewind(), con fsetpos() o con fseek() (no será porque no tengas opciones), para así cuando escribas las variables éstas sobrescriban a las que habían.

CitarMi verdadera duda esta en como hacer que me almacene el valor de la variable, es que no consigo hacer que me escriba nada.
fprintf()

Un saludo.

nyper01

#4
En primer lugar no me había fijado que eran hipervinculos los nombre de las funciones.
Y en segundo lugar, ya he dicho que soy un estudiante de primero, que aun no se mucho sobre programación, así que no es afán por que me lo den todo hecho, si no que, si solo me das el nombre de la función y este me lleva a complejas explicaciones que meten otras que no conozco, por mucho que intento entenderla no lo consigo.
Ni si quiera se por ejemplo que tipo de fichero es un ".dat" ni que diferencia tiene almacenar los datos en un fichero de este tipo en vez de un ".txt"
Por eso, había escrito el código que yo tenia, para ver si alguien podía recomendarme la forma mas sencilla de hacerlo con unas lineas similares a las mias, que son las que me han enseñado por ahora, y con las que me siento seguro al conocerlas.
Gracias por  ofrecerme el código hecho con un montón de cosas que no entiendo, pero yo lo único que buscaba es un pequeño empujón o retoque a lo que yo había puesto para así poder aprender y entender por que son así las cosas.

De todas formas a base de hace pruebas ya he logrado sacarlo, cambiando la extension del fichero y alguna cosa mas. Muchas gracias

xiruko

CitarNi si quiera se por ejemplo que tipo de fichero es un ".dat" ni que diferencia tiene almacenar los datos en un fichero de este tipo en vez de un ".txt"

Te propongo algo: cambia la extensión de tu archivo por ".miextension", o por ".quepasasipongoestoasi", y prueba a correr el programa.

CitarGracias por  ofrecerme el código hecho con un montón de cosas que no entiendo, pero yo lo único que buscaba es un pequeño empujón o retoque a lo que yo había puesto para así poder aprender y entender por que son así las cosas.

Qué hay mejor para entender las cosas que leerte la teoría a la vez que miras ejemplos? Tú tenías una duda y te di las herramientas necesarias para solventarla. Vale, no te di código, me daba pereza, pero es que había código de sobras en los enlaces.

CitarDe todas formas a base de hace pruebas ya he logrado sacarlo, cambiando la extension del fichero y alguna cosa mas.

Me alegro, esa es la actitud.

Un saludo.