Avatar billede sprox Nybegynder
17. juni 2005 - 11:17 Der er 8 kommentarer og
2 løsninger

problem med fwrite

Hey

Jeg forsøger at gemme noget data med fwrite. Jeg bruger følgende kode:

#define FIL "c:/fil.txt"

char buffer[100]; // heri er det data jeg gerne vil gemme

FILE *fp;
fp = fopen(FIL, "w");
fwrite(buffer, sizeof(buffer), 1, fp);
fclose(fp);

// samme data vil jeg så gerne hente igen, med følgende kode
char buffer[100];

FILE *fp;
fp = fopen(FIL, "r");
fread(buffer, sizeof(buffer), 1, fp);
fclose(fp);

Det virker også fint.

Men lige så snart jeg prøver med pointere så går det galt.

Altså:

char *buffer = new char[100]; // heri er det data jeg gerne vil gemme

FILE *fp;
fp = fopen(FIL, "w");
fwrite(&buffer, sizeof(buffer), 1, fp);
fclose(fp);

// samme data vil jeg så gerne hente igen, med følgende kode
char *buffer[100];

FILE *fp;
fp = fopen(FIL, "r");
fread(&buffer, sizeof(buffer), 1, fp);
fclose(fp);


Det kan sagtens compile uden fejl. men det virker ikke. Nogen gode råd?
Avatar billede arne_v Ekspert
17. juni 2005 - 11:20 #1
fwrite(&buffer, sizeof(buffer), 1, fp);

->

fwrite(buffer, 100, 1, fp);

når buffer er en pointer
Avatar billede sprox Nybegynder
17. juni 2005 - 11:38 #2
tak, prøver lige
Avatar billede sprox Nybegynder
17. juni 2005 - 11:44 #3
giver en windows: "Har en fundet en fejl og må afsluttes.

Min kode ser sådan her ud:

    bool skriv = true;
    if(skriv){
              cout << endl << "skriver.." << endl;
              FILE *fp;
              fp = fopen(FIL, "w");
              fwrite(vol0_buf, vol0.GetSerializeLength(), 1, fp);
              fclose(fp);
              }

// læs

      FILE *fp;
      char *buffer = new char[100];
      fp = fopen(FIL, "r");
      fread(&buffer, sizeof(buffer), 1, fp);
      fclose(fp);
Avatar billede arne_v Ekspert
17. juni 2005 - 11:54 #4
fread(&buffer, sizeof(buffer), 1, fp);

skal jo også rettes til

fread(buffer, 100, 1, fp);
Avatar billede segmose Nybegynder
17. juni 2005 - 11:55 #5
Hvad giver dette, lav selv manglende rutine:

    bool skriv = true;
    if(skriv){
              cout << endl << "skriver.." << vol0.GetSerializeLength() << endl;
              FILE *fp;
              fp = fopen(FIL, "w");
              if (!fp) DieInDisgrace();
              fwrite(vol0_buf, vol0.GetSerializeLength(), 1, fp);
              fclose(fp);
              }
Avatar billede sprox Nybegynder
17. juni 2005 - 16:40 #6
GetSerializeLength() retunerer 71, så strengen er ikke tom :)
kan også sagtens deserialize vol0_buf direkte, hvis ik jeg gemmer den først. tak for jeres svar, kigger på det i morgen :)
Avatar billede sprox Nybegynder
17. juni 2005 - 16:46 #7
hmm det er åbenbart først ved deserialize-function det går ned. Men det mærkelige er at hvis jeg gør følgende, så virker det fint:

TFilm vol0(0, "Langt fra las vegas vol. 0", 2001, "Casper C.", "Comedy", "Dansk", 5, "...");

char *vol0_buf = new char[vol0.GetSerializeLength()];
vol0.Serialize(vol0_buf);   
TFilm n = TFilm::Deserialize(vol0_buf);

cout << n.GetTitle();

dette virker fint, så må det vel være skriv/hent der fejler noget?
Avatar billede sprox Nybegynder
18. juni 2005 - 11:38 #8
ingen forslag? sætter gerne flere points til hvis det er
Avatar billede sprox Nybegynder
18. juni 2005 - 17:40 #9
problem løst. Ændrede

--> fopen(buf, 71, 1, "r+b");

var løsningen :)

jer der har hjulpet, smid et svar
Avatar billede arne_v Ekspert
19. juni 2005 - 00:18 #10
.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester