Avatar billede mollmannj Nybegynder
23. oktober 2002 - 14:32 Der er 3 kommentarer og
2 løsninger

skriv en struct til en fil

hvordan skriver man en struct til en fil?
eks:

struct varer
{
  pris
  navn[20]
};

struct varer bukser;
bukser.pris= 200;
strcpy("diesel", bukser.navn);

Det jeg mener er, hvordan for man skrevet værdierne "200", og "diesel", ned på en fil???
Avatar billede arne_v Ekspert
23. oktober 2002 - 14:34 #1
Vil du skrive binært  eller tekst ?

PS: Jeg tror den strcpy skal vende omvendt !
Avatar billede arne_v Ekspert
23. oktober 2002 - 14:35 #2
Du kan skrive structs ud binært med fwrite.

Du kan skrive de enkelte elementer i structen ud som tekst
med almindelig fprintf.
Avatar billede mollmannj Nybegynder
23. oktober 2002 - 14:46 #3
skal nok have skåret det lidt mere ud i pap, et eksembel f.eks
og tror nok jeg vil skrive tekst
Avatar billede arne_v Ekspert
23. oktober 2002 - 14:50 #4
FILE *fp;
fp = fopen("en.fil", "w");
fprintf(fp,"%d %s\n",bukser.pris,bukser.navn);
fclose(fp);

vil udskrive (med dien data):
200 diesel
Avatar billede soepro Nybegynder
23. oktober 2002 - 14:50 #5
Der er flere eksempler - prøv at kigge på tidligere svar: http://www.eksperten.dk/find.phtml?words=skrive+l%E6se+fil+tekst&catid=4

Følgende eksempel læser/gemmer en highscore liste (dvs. navn + point):
F.eks.

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

const int true  = 1;
const int false = 0;

typedef struct
{
  char          Name[11];
  unsigned long Score;
} defHighScore;

const int maxHighScores = 100;
defHighScore highScores[maxHighScores]; 

int readFile(char *fileName)
{
  FILE        *highFile;

  /* Læs high-scores fra fil - hvis der ingen er, lav nogle tomme. */
  if ((highFile = fopen(fileName, "r+b")) == NULL)
  {
    cprintf("High-score filen \'%s\' kunne ikke læses/dannes.\r\n",
            fileName);
    return false;
  };
  for (int idx = 0; idx < maxHighScores; idx++)
  {
    if (fread(&highScore[idx], sizeof(highScore[idx]), 1, highFile) != 1)
    { /* Sidste post læst - lav resten tomme. */
      for (;idx < maxHighScores; idx++)
      {
        sprintf(highScore[idx].Name, "");
        highScore[idx].Score = 0;
      };
    }; /* Hvis score ikke kunne læses.
  }; // Indtil alle high-scores er læst.

  fclose(highFile);
  return true;
} // readFile

int writeFile(char *fileName)
{
  FILE        *highFile;

  /* Læs high-scores fra fil - hvis der ingen er, lav nogle tomme. */
  if ((highFile = fopen(fileName, "w+b")) == NULL)
  {
    cprintf("High-score filen \'%s\' kunne ikke skrives/dannes.\r\n",
            fileName);
    return false;
  };
  for (int idx = 0; idx < maxHighScores; idx++)
  {
    if (fwrite(&highScore[idx], sizeof(highScore[idx]), 1, highFile) != 1)
    { /* Ikke alle poster kunne skrives. */
      fclose(highFile);
      cprintf("Ikke alle poster kunne skrives. (Post nr. %d)",
              idx + 1);
      return false;
    }; /* Hvis score ikke kunne læses.
  }; // Indtil alle high-scores er læst.

  fclose(highFile);
  return true;
} // writeFile

int main(int argc, char *argv[])
{
  if (argc < 2)
  {
    cprintf("FEJL: Angiv navnet på high-score filen.\r\n");
    return -1;
  }

  /* Læs highscores fra filen. */
  if (!readFile(argv[1]))
    return -1;

  /* Vis high scores. */
  cprintf("%-20s %8s\r\n", "Spiller", "Score");
  for (int idx = 0; idx < maxHighScores; idx++)
  {
    if (strncmp(highScore[idx].Name, "", sizeof(highScore[idx].Name)-1) != 0)
    {
      cprintf("%-20s %8lu\r\n", highScore[idx].Name, highScore[idx].Score);
    }
    else
      idx = maxHighScore;
  };

  /* Noget kode til at ændre på highscores. */

  /* Skriv de nye high-scores. */
  if (!writeFile(argv[1]))
    return -1;

  return 0;
} // Main
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