c ficheros

MaNeLeT

buenas, tengo ese codigo y en teoria los campos nom, nick y edat me los tiene que guardar en un archvo (jugadors.txt). Una vez compilado no me deja introducir la edad no se porque motivo y los datos nick y nom, se guardan pero de este tipo:

Manelet =C:\WINDOWS\syst« \ m x = x = NO_HOST_Manel Garcia HR54VMDManelet =C:\WINDOWS\syst«

donde las palabras en negrita son los datos que deberia guardar y lo otro no se que es.
Otra pregunta seria saber como puedo meterle un salto de linia despues de insertar cada dato.
Y en que falla el fscanf para que no me deje meter la edad.

seguire investigando, muchas gracias.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct registre_jugadors {
int edat;
char nom[20];
char nick[20];
struct registre_jugadors *seg;
}TipusJugador;


TipusJugador *inici;

TipusJugador* InserirPrimer(TipusJugador *inici)
{
TipusJugador *NouJugador;
FILE fitxer_jugadors;
// obrim el fitxer
fitxer_jugadors = fopen("jugadors.txt","w+");
// creem la memoria dinamica per registrar el jugador
NouJugador = (TipusJugador
)malloc(sizeof(TipusJugador));


 if(fitxer_jugadors==NULL)
 printf("ERROR\n"); //no es pot escriure al fitxer
 else
 {
 // demanem dades   
 fflush (stdin); // buidem el buffer del teclat
 printf("\tNICKNAME:\n");
 printf("\t---------\n");
 gets(NouJugador->nick);
 fwrite(&NouJugador->nick,sizeof(TipusJugador),1,fitxer_jugadors);
 printf("\tNOM:\n");
 printf("\t----\n");
 gets(NouJugador->nom);
 fwrite(&NouJugador->nom,sizeof(TipusJugador),1,fitxer_jugadors);
 printf("\tEDAT:\n");
 printf("\t-----\n");
 fscanf(fitxer_jugadors,"%d",&NouJugador->edat); 
 }
 fclose (fitxer_jugadors); // tanquem el fitxer
 
 NouJugador->seg = inici;
 inici = NouJugador;  
 
 return NouJugador;

}

int main()
{
printf("\t\t\t\t--------------------\n");
printf("\t\t\t\tRegistre de Jugadors\n");
printf("\t\t\t\t--------------------\n");
int op;

do
{
      InserirPrimer(inici);
      printf("Vols registrar un altre jugador? (1=si / 0=no)\n");
      scanf("%d",&op);
}
while(op!=0 || op!=0);

}

LOc0

Tienes un poco de cacao en general... Así para empezar prueba a leer TODOS los campos de la estructura y luego la escribes entera al fichero.

if(fitxer_jugadors==NULL)
printf("ERROR\n"); //no es pot escriure al fitxer
else
{
// demanem dades
fflush (stdin); // buidem el buffer del teclat
printf("\tNICKNAME:\n");
printf("\t---------\n");
gets(NouJugador->nick);

printf("\tNOM:\n");
printf("\t----\n");
gets(NouJugador->nom);

printf("\tEDAT:\n");
printf("\t-----\n");
scanf("%d", &NouJugador->edat);

fwrite(NouJugador,sizeof(TipusJugador),1,fitxer_jugadors);

}

Salu2 ;)

PD: No te olvides de liberar la memoria dinámica.

maRc

En lugar de utilizar gets, utiliza scanf, y en lugar de utilizar fwrite, utiliza fprintf.

javithelong

No me gusta el catalan, pero bueno, haré una excepción:

Tu código:
fwrite(&NouJugador->nick, sizeof(TipusJugador), 1, fitxer_jugadors);

Estas escribiendo con fwrite una cantidad de bytes igual al tamaño de TipusJugador, cuando en realidad intentas escribir un string, mejor asi:

fwrite(&NouJugador->nick, strlen(NouJugador->nick), 1, fitxer_jugadors);

De todas maneras, lo han dicho antes, mejor rellena la estructura entera, y luego la escribes al fichero con tu línea:

fwrite(&NouJugador, sizeof(TipusJugador), 1, fitxer_jugadors);

Y luego la lees con fread de igual manera, no falla

No soy partidario de resolveros estas dudas tan sencillas, pero vamos, allá vosotros. Cuando más se aprende es pegándote con un código, y no poniendolo en MV a que algun kedao mas friki que yo que se, o informático por vocacion (u.u) te lo arregle

Na mas, saludos

Usuarios habituales

  • javithelong
  • maRc
  • LOc0
  • MaNeLeT