Avatar billede bundgaard Nybegynder
11. januar 2005 - 11:08 Der er 12 kommentarer og
1 løsning

Hægtede lister (igen)

Hej, så er jeg her igen :D

Hehe. Mit problem denne gang er som følger;

Jeg har oprettet en struct, der ser sådan ud

struct medlemmer {
    char navn[20];
    char gade[20];
    char postnummer[8];
    char by[20];
    char tlf[20];
    char mobil[20];
    char email[20];
    int medlemsnr;
    struct medlemmer *ptrnext;
    };

Og oprettet en instans her:    
struct medlemmer *ptrfirst = NULL;

Jeg kan godt skrive data op i structen via gets(ptrthis->navn) (f.eks.). Men hvordan opretter jeg en ny instans, så jeg kan oprette endnu et medlem? Og hvordan får jeg structen skrevet ned i en fil på disken uden alt det overflødige data*?

Overflødige data = Alt det der følger med når man laver en char streng[20] og strengen kun fylder 14 chars.. så bliver de resterende 6 chars jo fyldt med random lort :(

Så nede i min fil ser det sådan ud:

A::D: ÍÍÍÍÍÍÍÍÍÍÍÍÍÍ:F:F:F: ÍÍÍÍÍÍÍÍÍÍÍÍ:F ÍÍÍÍÍ:F ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ:F ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ:F ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ:F ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ    Hvor "A::D:" og ":F::F:" bare er noget data jeg har skrevet for at teste..
Avatar billede soreno Praktikant
11. januar 2005 - 12:06 #1
Må vi se den kode som skriver til filen ?

Hvorfor bruge en fixed size til array ?
F.eks. kunne man i stedet for gøre noget ala:
newMedlem(.., char *navn, ..)
{
  [..]
  medlem->navn = (char*) alloc(strlen(navn))
  strcpy(medlem->navn, navn);
  [..]
}
Avatar billede bundgaard Nybegynder
11. januar 2005 - 12:36 #2
if(fwrite(ptrfirst, sizeof(struct medlemmer), n, fp) != n)
    {
    printf("kan ikke skrive til filen :>\n");
    fclose(fp);
    }

Det er den kode, der skriver i filen :)

Men det du laver der, er det selve structen?

Man skal jo erklære sit array i starten, og der vil den kun gøre det, hvis man skriver en fixed size :|
Avatar billede soreno Praktikant
11. januar 2005 - 13:01 #3
Du har alt det "overflødige data" fordi du har sagt at struct'en skal indeholde fixed size arrays (og du ikke bruger hele arrayet).

Men er det et problemet at filen indeholder det som den gør ?
  - så kan du evt., når du initialiserer et medlem, skrive 0 i de dele af arrayet du ikke bruger.
Avatar billede bundgaard Nybegynder
11. januar 2005 - 13:03 #4
Ja, det må vi ikke :) Problemet er jo også når vi henter dataen ud igen og printer den ud.

Men hvordan opretter man en struct med variable størrelser på et array?
Avatar billede soreno Praktikant
11. januar 2005 - 13:10 #5
Du retter:
char navn[20];

til:
char *navn;

og bruger kode (12:06:59) til at allokere den mængde memory du skal bruge.


Jeg kan ikke helt se hvorfor det er et problem at loade data igen (og printe det) ?
Avatar billede bundgaard Nybegynder
11. januar 2005 - 13:11 #6
Fordi:

Når man skriver det ind i en fil, kommer der som sagt til at være en masse underlige tegn. Når man henter data ind fra filen igen og printer det ud, vil de underlige tegn være der ;)

Men jeg prøver mig lidt frem med den kode der! Så vender jeg lige tilbage :D
Avatar billede soreno Praktikant
11. januar 2005 - 13:16 #7
Hvordan printer i struct'en (hvilken funktion bruges til print) ?
Avatar billede bundgaard Nybegynder
11. januar 2005 - 13:20 #8
Lige nu har vi ikke rigtig noget, men det bliver formentlig en fread() der looper :)

Og jeg kan altså ikke hitte ud af det kode du har skrevet :/
Avatar billede soreno Praktikant
11. januar 2005 - 13:27 #9
Eksempel:

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

struct Test
{
    char name[20];
    int number;
};

void writeStruct(struct Test *test)
{
    FILE *file;
    file = fopen("data/struct.txt", "w");
    fwrite(test, sizeof(struct Test), 1, file);
    fclose(file);
}

struct Test* readStruct()
{
    struct Test *temp = (struct Test*)malloc(sizeof(struct Test));
    FILE *file;
    file = fopen("data/struct.txt", "r");
    fread(temp, sizeof(struct Test), 1, file);
    fclose(file);
    return temp;
}

void printStruct(struct Test *test)
{
    printf("struct:\n");
    printf("\tchar name[20] = %s\n", test->name);
    printf("\tint number = %d\n", test->number);
}

int main()
{
    struct Test *test = (struct Test*)malloc(sizeof(struct Test));
    strcpy(test->name, "Hello world");
    test->number = 12345;

    printStruct(test);
    writeStruct(test);

    free(test);

    test = readStruct();
    printStruct(test);

    return 0;
}

Filen indeholder:
00000000: 4865 6c6c 6f20 776f 726c 6400 0000 0000  Hello world.....
00000010: 0000 0000 3930 0000                      ....90..

Output af program:
$ ./read_write.exe
struct:
        char name[20] = Hello world
        int number = 12345
struct:
        char name[20] = Hello world
        int number = 12345
Avatar billede bundgaard Nybegynder
11. januar 2005 - 13:30 #10
Heh.. programmet går ned her :P

Dog når den at udskrive inden.. Så jeg siger mange tak og må jo igang med at kigge på det :O
Avatar billede bundgaard Nybegynder
11. januar 2005 - 13:51 #11
Så, nu virker det =)

Mange tak.. du kender vel rutinen efterhånden ;)
Avatar billede soreno Praktikant
11. januar 2005 - 13:55 #12
Ok.
Avatar billede bundgaard Nybegynder
11. januar 2005 - 13:56 #13
Jeg takker.
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