Avatar billede dna8018 Nybegynder
11. september 2002 - 10:04 Der er 4 kommentarer

Gem flere strukturer til en tekst fil og læse tilbage fra den fil

Hej,
Jeg bruger builder c++.
Er der nogle som kan hjælpe mig med at at gemme flere strukturer til en tekst fil son under, og bagefter hente den fil tilbage til de følgende strukturer igen, jeg giver 100 points for den.

*Struktur1*
"Lars" 25 233 2323 2323 232
"Lene" 20 343 4545 4543 343
*Struktur2*
0001 0002 0013 0004 0987
2323 2323 5454 5455 5656
*Struktur3*
abcd 23bd 45ab 89cf
abca 23b3 45a6 89cf
abcf 23bd 45a8 89cf

MVH

DNA
Avatar billede lasse_buck Nybegynder
11. september 2002 - 11:10 #1
Lav din egen filestream klasse mystream indeholdende en streng-buffer.
Definer klassens streaming operatorer (<< og >>) for de simple typer (int, string...)
Definer klassens streaming operatorer for de andre klasser, som skal streames (dine strukturer). Her streamer du de enkelte felter manuelt vha. af de operatorer som du definerede før.

Jeg håber, at du kan bruge forklaringen, da jeg ikke har tid til at finde kode-eksempler lige nu.
Avatar billede dna8018 Nybegynder
11. september 2002 - 11:16 #2
Hej,

Tak for råd, men jeg mangler nogle kendskaber til at lave den, hvis du vil give mig mere info. så jeg tror jeg kan lave den selv.
Avatar billede soepro Nybegynder
16. september 2002 - 08:48 #3
Hvis du skal kunne genkende de forskellige strukturer i forbindelse med læsningen fra filen, skal de alle have en eller anden ID du kan checke på. Hvad med at lave følgende klasser:

class baseClass
{
  public:
  int classType;
  bool readFromFile(FILE *);
  bool writeToFile(FILE *);
  baseClass(int type) { classType = type; };
  baseClass(void) { baseClass(-1); };
}
class struct1 : baseClass
{
  public:
  struct
  {
    char name[20];
    int  age, t1, t2, t3, t4;
  } data;
  bool readFromFile(FILE *);
  bool writeToFile(FILE *);
  struct1(char *s, int a, int n1, int n2, int n3, int n4) : baseClass( /*type */ 1)
  {
    strncpy(data.name, s, sizeof(data.name)-1);
    data.age = a; data.t1 = n1; data.t2 = n2; data.t3 = n3; data.t4 = n4;
  };
};
class struct2 : baseClass
{
  public:
  struct
  {
    int t1, t2, t3, t4, t5;
  } data;
  bool readFromFile(FILE *);
  bool writeToFile(FILE *);
  struct2(int n1, int n2, int n3, int n4, int n5) : baseClass(/* type */ 2)
  {
    data.t1 = n1; data.t2 = n2; data.t3 = n3; data.t4 = n4; data.t5 = n5;
  };
};

hvor readFromFile() metoden så var tilpasset den enkelte klasse:

bool struct1::readFomFile(FILE *inpFile)
{
  // classType *ER* allerede læst - ellers kunne vi jo ikke vide at
  // det var denne type klasse.
  if (fread(this->data, sizeof(this->data), 1, inpFile) != 1)
    return false;
  return true;
} // readFromFile

tilsvarende for writeToFile():

bool struct1::writeToFile(FILE *outFile)
{
  // Skriv både aktuelle klasse type (tildelt ved instatiering af variablen
  // se constructor ovenfor.
  if (fwrite(this->classType, sizeof(this->classType), 1, outFile) != 1
  ||  write(this->data, sizeof(this->data), 1, outFile)            != 1)
    return false;
  return true;
} // writeToFile

Du kan du så læse/skrive til/fra en fil sådan her:

#include <stdio.h>
int main(void)
{
  FILE      *structFile;
  baseClass  vBase;
  struct1    vS1[2];
  int        nbrS1;
  struct2    vS2[4];
  int        nbrS2;
 
  if ((structFile = fopen("C:\\structs.fil", "r+b")) == NULL)
  { // Struktur fil ikke fundet - afslut med fejl.
    return -1;
  };

  // Læs de forskellige strukturer.
  nbrS1 = 0;
  nbrS2 = 0;
  while (!structFile->eof)
  {
    if (fread(&vBase, sizeof(vBase), 1, structFile) != 1)
    { // FEJL
      fclose(structFile);
      return -1;
    };

    // Vælg klasse i henhold til just læse type.
    switch (vBase.classType)
    {
      case 2 : // struct2
              if (!vS2[nbrS2].readFromFile(structFile))
                return -1;
              nbrS2++;
              break;
      case 1 : // struct1
              if (!vS1[nbrS1].readFromFile(structFile))
                return -1;
              nbrS1++;
              break;
      default: // UKENDT klassetype, kun -1 er så tilladt. (Den indeholder
              // kun baseClass - alle andre varianter kender vi ikke.)
              if (vBase.classType != -1)
                return -1;
              break;
    }; // Swicth on type
  }; // Until EOF

  // Behandl dine forskelluge strukturer.
  :
  :

  // Skriv dem tilbage til filen. (Flyt først pointer tilbage til starten.)
  if (fseek(structFile, 0, SEEK_SET) != 0)
  {
    fclose(structFile);
    return -1;
  }

  for (int idx = 0; idx < nbrS1; idx++)
    if (!vS1[idx].writeToFile(structFile))
    { // FEJL
      fclose(structFile);
      return -1;
    };

  for (int idx = 0; idx < nbrS2; idx++)
    if (!vS2[idx].writeToFile(structFile))
    { // FEJL
      fclose(structFile);
      return -1;
    };

  // Luk filen og afslut normalt.
  fclose(structFile);
  return 0;
}
Avatar billede dna8018 Nybegynder
16. september 2002 - 09:09 #4
Hej Soepro,

Jeg skal nok prøve your kode lige i dag, du får besked når jeg har prøvet.

MVH
DNA8018
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