C) Varför min fwrite() skriver ingenting?

Permalänk

C) Varför min fwrite() skriver ingenting?

Hej
Just nu skriver jag en kod som läser in värde från struct och och sparar dem i en .dat fil

här är min kod

#include <stdio.h> #include <stdlib.h> typedef struct deltagareInformation{ char forNamn[10]; char efterNamn[20]; char klubb[20]; }deltagareInformation; FILE *oppnaFil(char fil[]); FILE *skrivaFil(char fil[], struct deltagareInformation *deltagare); int main(int argc, const char *argv[]){ FILE *fp; char filNamn[]="ANMAL.dat"; deltagareInformation deltagare; fp=oppnaFil(filNamn); fseek(fp,0,SEEK_END); printf("\nAnge ditt förnamn"); gets(deltagare.forNamn); printf("\nAnge ditt efterNamn"); scanf("%i",&deltagare.efterNamn); printf("\nAnge ditt klubbnamn"); gets(deltagare.klubb); fp=skrivaFil(filNamn,&deltagare); fclose(fp); } FILE *oppnaFil(char namn[]){ FILE *fp1; if((fp1=fopen(namn,"r+b"))==NULL){ if((fp1=fopen(namn,"w+b"))==NULL){ printf("fel\n"); exit(1); } } return fp1; } FILE *skrivaFil(char fil[], struct deltagareInformation *deltagare){ FILE *fp; printf("Namnet är %s",deltagare->forNamn); fwrite(deltagare,sizeof(deltagareInformation),1,fp); } jag ser printf i *skrivaFil fungerar helt ok utan problem, men fwrite skriver ingenting. När jag öppnar ANMAL.dat, ser jag ingenting

Permalänk
Medlem

Du måste skicka med fp som inparameter till skrivaFil, annars kommer den att ha ett obestämt värde när du gör fwrite och då kommer du i bästa fall skriva till bitrymden i värsta fall få en krasch.

Permalänk
Medlem

Reviderad kod (kan finnas andra fel, jag provkompilerade inte)

#include <stdio.h> #include <stdlib.h> typedef struct deltagareInformation{ char forNamn[10]; char efterNamn[20]; char klubb[20]; }deltagareInformation; FILE *oppnaFil(char fil[]); void skrivaFil(FILE *fp, struct deltagareInformation *deltagare); int main(int argc, const char *argv[]){ FILE *fp; char filNamn[]="ANMAL.dat"; deltagareInformation deltagare; fp=oppnaFil(filNamn); fseek(fp,0,SEEK_END); printf("\nAnge ditt förnamn"); gets(deltagare.forNamn); printf("\nAnge ditt efterNamn"); scanf("%i",&deltagare.efterNamn); printf("\nAnge ditt klubbnamn"); gets(deltagare.klubb); fp=skrivaFil(filNamn,&deltagare); fclose(fp); } FILE *oppnaFil(char namn[]){ FILE *fp1; if((fp1=fopen(namn,"r+b"))==NULL){ if((fp1=fopen(namn,"w+b"))==NULL){ printf("fel\n"); exit(1); } } return fp1; } void skrivaFil(FILE *fp, struct deltagareInformation *deltagare){ printf("Namnet är %s",deltagare->forNamn); fwrite(deltagare,sizeof(deltagareInformation),1,fp); }

Permalänk
Medlem

Har inte läst koden så noga, men avsluta med ett anrop till fsync() också

Permalänk
Skrivet av ehsnils:

Du måste skicka med fp som inparameter till skrivaFil, annars kommer den att ha ett obestämt värde när du gör fwrite och då kommer du i bästa fall skriva till bitrymden i värsta fall få en krasch.

Tack
Jag gjorde flera ändringar men det fortfarande fungerar inte.

Ändrade prototypen så

FILE *skrivaFil(char fil[], struct deltagareInformation *deltagare, FILE *fp);

Jag har lagt fp som skrivaFil()s tredje argument

fp=skrivaFil(filNamn,&deltagare,fp);

skrivaFil()

FILE *skrivaFil(char fil[], struct deltagareInformation *deltagare,FILE *fp){ printf("Namnet är %s",deltagare->forNamn); fwrite(deltagare,sizeof(deltagareInformation),1,fp); }

här är mitt nytt fullständig kod

#include <stdio.h> #include <stdlib.h> typedef struct deltagareInformation{ char forNamn[10]; char efterNamn[20]; char klubb[20]; }deltagareInformation; FILE *oppnaFil(char fil[]); FILE *skrivaFil(char fil[], struct deltagareInformation *deltagare, FILE *fp); int main(int argc, const char *argv[]){ FILE *fp; char filNamn[]="ANMAL.dat"; deltagareInformation deltagare; fp=oppnaFil(filNamn); fseek(fp,0,SEEK_END); printf("\nAnge ditt förnamn"); gets(deltagare.forNamn); printf("\nAnge ditt efterNamn"); scanf("%i",&deltagare.efterNamn); printf("\nAnge ditt klubbnamn"); gets(deltagare.klubb); fp=skrivaFil(filNamn,&deltagare,fp); fclose(fp); } FILE *oppnaFil(char namn[]){ FILE *fp1; if((fp1=fopen(namn,"r+b"))==NULL){ if((fp1=fopen(namn,"w+b"))==NULL){ printf("fel\n"); exit(1); } } return fp1; } FILE *skrivaFil(char fil[], struct deltagareInformation *deltagare,FILE *fp){ printf("Namnet är %s",deltagare->forNamn); fwrite(deltagare,sizeof(deltagareInformation),1,fp); }

Som sagt det fortfarande fungerar inte. Har jag glömt någonting?

Permalänk
Medlem

Borttaget. Felaktigt.

Permalänk
Medlem

Jag skruvade på koden till följande i kompilator, testkörde och fick önskat resulat:

#include <stdio.h> #include <stdlib.h> typedef struct deltagareInformation { char forNamn[10]; char efterNamn[20]; char klubb[20]; }deltagareInformation; FILE *oppnaFil(char fil[]); void skrivaFil(FILE *fp, struct deltagareInformation *deltagare); int main(int argc, const char *argv[]) { FILE *fp; char filNamn[] = "ANMAL.dat"; deltagareInformation deltagare; fp = oppnaFil(filNamn); fseek(fp, 0, SEEK_END); printf("\nAnge ditt förnamn"); fgets(deltagare.forNamn, 9, stdin); printf("\nAnge ditt efterNamn"); fgets(deltagare.efterNamn, 19, stdin); printf("\nAnge ditt klubbnamn"); fgets(deltagare.klubb, 19, stdin); skrivaFil(fp, &deltagare); fclose(fp); } FILE *oppnaFil(char namn[]) { FILE *fp1; if ((fp1 = fopen(namn, "r+b")) == NULL) { if ((fp1 = fopen(namn, "w+b")) == NULL) { printf("fel\n"); exit(1); } } return fp1; } void skrivaFil(FILE *fp, struct deltagareInformation *deltagare) { printf("Namnet är %s", deltagare->forNamn); fwrite(deltagare, sizeof(deltagareInformation), 1, fp); fflush(fp); }

Tänk på att utfilen är en binärfil.

fflush() är inte kritiskt eftersom det görs en fclose() som också säkrar att filen skrivs.

Permalänk
Skrivet av ehsnils:

Jag skruvade på koden till följande i kompilator, testkörde och fick önskat resulat:

#include <stdio.h> #include <stdlib.h> typedef struct deltagareInformation { char forNamn[10]; char efterNamn[20]; char klubb[20]; }deltagareInformation; FILE *oppnaFil(char fil[]); void skrivaFil(FILE *fp, struct deltagareInformation *deltagare); int main(int argc, const char *argv[]) { FILE *fp; char filNamn[] = "ANMAL.dat"; deltagareInformation deltagare; fp = oppnaFil(filNamn); fseek(fp, 0, SEEK_END); printf("\nAnge ditt förnamn"); fgets(deltagare.forNamn, 9, stdin); printf("\nAnge ditt efterNamn"); fgets(deltagare.efterNamn, 19, stdin); printf("\nAnge ditt klubbnamn"); fgets(deltagare.klubb, 19, stdin); skrivaFil(fp, &deltagare); fclose(fp); } FILE *oppnaFil(char namn[]) { FILE *fp1; if ((fp1 = fopen(namn, "r+b")) == NULL) { if ((fp1 = fopen(namn, "w+b")) == NULL) { printf("fel\n"); exit(1); } } return fp1; } void skrivaFil(FILE *fp, struct deltagareInformation *deltagare) { printf("Namnet är %s", deltagare->forNamn); fwrite(deltagare, sizeof(deltagareInformation), 1, fp); fflush(fp); }

Tänk på att utfilen är en binärfil.

fflush() är inte kritiskt eftersom det görs en fclose() som också säkrar att filen skrivs.

Taaaack! fflush/fclose i skrivaFil() var nyckel!!!

Permalänk
Medlem

Vill du slippa "skräptecken" så skall du även innan du läser in data lägga till följande rad;

memset(&deltagare, 0, sizeof(deltagareInformation));

Och tänk på att fgets även tar med radbrytningen när du trycker "enter".

fgets är att föredra framför gets eftersom annars kan du få en "buffer overrun" när någon matar in något som är längre än det du dimensionerat för.