Avatar billede bundgaard Nybegynder
12. januar 2005 - 15:17 Der er 44 kommentarer og
3 løsninger

Fjerne uønsket "støj" i printf-sætninger

Hej igen..

Nu har jeg siddet HELE dagen og bøvlet med det her l*** og jeg kan simpelthen ikke få det til at virke :I


Jeg har en struct, som jeg skriver data ind i og gemmer ned i en fil. Det virker sådan set fint nok! I structen er name og gade, defineret som char name[255] og char gade[255]

Problemet kommer, når jeg skal skrive dataen ud igen.
Mine printfsætninger ser sådan ud;

        printf("Medlemsinfo:\n");
        printf("\tNavn = %c\n", medlemmer->name);
        printf("\tGade = %s\n", medlemmer->gade);

Men når jeg skriver ud, så skriver den 255 tegn og ikke kun det den skal skrive (altså navnet og gaden) :|

Er der nogen måde at filtrere på, så man f.eks. fjerner alle "Í" tegn, inden den skriver det ud?

Jeg håber, jeg har gjort mig selv forståelig, ellers må i endelig sige til :)
Avatar billede bundgaard Nybegynder
12. januar 2005 - 15:23 #1
Hvis det er til nogen nytte, så kan jeg nævne, at det er hexværdien CD, der ikke må forekomme.
Avatar billede chries Nybegynder
12. januar 2005 - 15:26 #2
du mangler nul terminering på dine strenge og i navn printf skal %c ændres til %s
Avatar billede bundgaard Nybegynder
12. januar 2005 - 15:29 #3
Ah ja, der skal naturligvis stå %s :) Har lige leget lidt med det.

Men hva mener du med, at jeg mangler nul terminering? Hvor skal det gøres?
Avatar billede chries Nybegynder
12. januar 2005 - 15:32 #4
kommer an på hvordan du putter data'erne i stregene.

hvis du kort modificer koden til:

medlemmer->name[5] = '\0';
medlemmer->gade[5] = '\0';
        printf("\tNavn = %c\n", medlemmer->name);
        printf("\tGade = %s\n", medlemmer->gade);

vil du sikkert se at den kun printer 6 karakter for navn og gade.
Avatar billede chries Nybegynder
12. januar 2005 - 15:32 #5
5 karakter :)
Avatar billede bundgaard Nybegynder
12. januar 2005 - 15:36 #6
hmm ja, det er jo faktisk logisk nok :)

    printf("Indtast navn: \n");
    gets(medlemmer->name);

Sådan indtaster jeg.. skal man så evt lave
    printf("Indtast navn: \n");
        strlen(gets(medlemmer->name);

Og så sætte strlen = en variabel, som man så kan smide ind i medlemmer->name[n] ='\0' f.eks.?
Avatar billede arne_v Ekspert
12. januar 2005 - 18:14 #7
Nej. Fordi strlen returnerer selv afstanden til første nul byte.

Men gets burde selv sætte den nul byte ind.

Så jeg forstår ikke helt hvorfor du ikke har den.
Avatar billede bundgaard Nybegynder
12. januar 2005 - 23:22 #8
Nej det er lidt underligt.. kan det ha noget at gøre med at jeg allokerer plads i hukommelsen?
Avatar billede stormy Nybegynder
13. januar 2005 - 06:02 #9
Det er ikke din udskrivning problemer ligger i, men enten din indlæsning - eller hvad du ellers gør med data, inden udskrivningen. Derfor bliver du nødt til at vise denne kode - eller også vil det være rent gætværk at prøve at gætte, hvad du gør galt.

Det er sikkert fordi at du har fokuseret på udskrivningen, at du har prøvet næsten alt, men ikke kan få l***** til at virke..
Avatar billede bundgaard Nybegynder
13. januar 2005 - 08:48 #10
Det kan være :)

Som sagt, så har jeg defineret structen således;

struct medlemmer
{
    char name[255];
    char gade[255];
    char post[8];
    char by[255];
    char tlf[20];
    char mobil[20];
    char email[255];
    int number;
};

Når jeg skal skrive ind i structen, gør jeg det således;

    printf("Indtast navn: \n");
    gets(medlemmer->name);

Og så fremdeles.

Spørgsmålet er om det er når jeg skriver ned i filen og henter det ud fra filen igen, problemet opstår?
Sådan her skriver jeg ned i filen;

    fp = fopen("c:\\tekstfil.txt", "a");   
    fwrite(medlemmer, sizeof(struct medlemmer), 1, fp);       
    fclose(fp);   

Og sådan her skriver jeg det ud

    fp = fopen("c:\\yeah666.txt", "r");
    while( fread(medlemmer, sizeof(struct medlemmer), 1, fp) ==1 )
    {
    n++;
    }
    fclose(fp);
    for(j = 0; j < n; j++)
        {
        printf("Medlemsinfo:\n");
        printf("\tNavn = %s\n", medlemmer[j].name);

Og så videre.. :) Det gør at den skriver alle medlemmer ud, men ja.. skærmen bliver fyldt med underlige tegn :(

Jeg skal nok hæve pointene, hvis jeg ellers kan hitte ud af det :D
Avatar billede bundgaard Nybegynder
13. januar 2005 - 08:52 #11
Det skal måske lige nævnes, at hvis jeg skriver medlemmer->name ud, så ser det fint ud. Det er først når jeg skriver medlemmer[j].name ud, at det går galt.. men det bliver jeg jo nødt til, for at skrive alt indhold af arrayet ud :(
Avatar billede bundgaard Nybegynder
13. januar 2005 - 08:58 #12
Hov, der skal naturligvis stå det samme filnavn :) Det gør der nu også i programmet.
Avatar billede arne_v Ekspert
13. januar 2005 - 09:00 #13
Prøv lige og erstat de fread kald med nogle fgets kald !
Avatar billede arne_v Ekspert
13. januar 2005 - 09:00 #14
som hovedregel:

tekst linier => fgets

binære data => fread
Avatar billede arne_v Ekspert
13. januar 2005 - 09:01 #15
vrøvl - din struct er jo netop binære data - sorry - glem det
Avatar billede chries Nybegynder
13. januar 2005 - 09:03 #16
du skal nopk skrive filerne i binary mode med fread.

    fp = fopen("c:\\tekstfil.txt", "ab"); 
    fwrite(medlemmer, sizeof(struct medlemmer), 1, fp);
Avatar billede arne_v Ekspert
13. januar 2005 - 09:03 #17
Men hvordan er variablem medlemme erklæret ?

(ikke det samme som hvordan typen medlemmer er erklæret)
Avatar billede bundgaard Nybegynder
13. januar 2005 - 09:03 #18
while( fgets(&*medlemmer, sizeof(medlemmer[n]), 1, fp) ==1 ) < hvis jeg gør det sådan der, så går programmet ned :/
Avatar billede chries Nybegynder
13. januar 2005 - 09:03 #19
fp = fopen("c:\\yeah666.txt", "rb");
Avatar billede bundgaard Nybegynder
13. januar 2005 - 09:04 #20
Jeg tror ikke helt jeg er med Arne. Jeg erklærer vel kun variablerne én gang, og det er inde i structen, ikke?

chries > det er forsøgt :/
Avatar billede chries Nybegynder
13. januar 2005 - 09:05 #21
du skal nok også læse og skrive til og fra samme fil ?
yeah666.txt / tekstfil.txt ?
Avatar billede bundgaard Nybegynder
13. januar 2005 - 09:06 #22
Hvis jeg bruger "ab" og "rb", skriver den følgende ud;

Navn =
Gade = ===5
Postnummer = ===5

Hvor 5 er det data jeg indtastede sidst.. :/
Avatar billede arne_v Ekspert
13. januar 2005 - 09:06 #23
struct medlemmer
{
...
};

er klærer en type ikke en variabel.

Hvordan er variablem medlemmer erklæret ?
Avatar billede bundgaard Nybegynder
13. januar 2005 - 09:07 #24
Det gør jeg også, havde bare lige leget lidt :)
Avatar billede bundgaard Nybegynder
13. januar 2005 - 09:07 #25
struct medlemmer *medlemmer = (struct medlemmer*)malloc(sizeof(struct medlemmer));

Den du tænker på Arne?
Avatar billede arne_v Ekspert
13. januar 2005 - 09:09 #26
Ja.

Jeg forstår ikke helt hvorfor du læse alle medlemmerne ind i samme variabel og
udskriver hvad der er i buffer efter sidste foejlede kald n gange.
Avatar billede arne_v Ekspert
13. januar 2005 - 09:10 #27
Hvis du har ændret i structen, så huske at slette alle gamle records i filen.
Avatar billede bundgaard Nybegynder
13. januar 2005 - 09:11 #28
Nææe.. det kan du ha ret i..

Måske man skulle starte helt forfra med det program her :I Synes det bliver mere og mere uoverskueligt heh
Avatar billede bundgaard Nybegynder
13. januar 2005 - 09:59 #29
Lige et helt generelt spørgsmål.

Hvis man har en struct og man vil printe alt indholdet ud, så ville det mest oplagte være at gøre det via struct[n].variabel ikke?

Hvordan gør man, hvis man skal bruge struct->variabel?
Avatar billede arne_v Ekspert
13. januar 2005 - 10:07 #30
var.felt

hvis du har en struct

var->felt

hvis du har en pointer til struct

var[i].felt

hvis du har en pointer til mange struct eller et array af struct
Avatar billede bundgaard Nybegynder
13. januar 2005 - 10:11 #31
Jamen, det er jeg godt med på

ved [n] kan man jo tælle op, så den printer alle medlemmer ud.

Det kan jeg ikke lige lure, hvordan man gør med ->
Avatar billede arne_v Ekspert
13. januar 2005 - 10:45 #32
Det bedste er ikke at gøre det !

:-)

men ellers:

(var+i)->felt

hvis du har en pointer til mange struct
Avatar billede bundgaard Nybegynder
13. januar 2005 - 10:49 #33
Ah ja, det var en mulighed :)

Nu må jeg se.. jeg slettede al koden og startede forfra. Jeg gi'r lige hægtede lister en chance til.. folk siger jo det er smart :D
Avatar billede bundgaard Nybegynder
13. januar 2005 - 11:06 #34
Nu bliver jeg lige nødt til at spørge igen:

struct medlem
{
    char name[255];
    char gade[255];
    char post[255];
    char by[255];
    char tlf[255];
    char mobil[255];
    char email[255];
    int medlem;
    struct medlem *ptrnext;
};

struct medlem *ptrfirst = NULL;



void listfromfile(void)
{
    struct medlem *ptrthis;
    FILE *fp;
    ptrthis = ptrfirst;
    if( (fp = fopen("c:\\yeah666.txt", "r")) == NULL)
    {
        printf("Filen findes ej\n");
        exit(1);
    }
    while(fread(&ptrthis, sizeof(ptrthis), 1, fp) ==1)
    {
        printf("\nNavn: %s\n", ptrthis->name);
        printf("\nGade: %s\n", ptrthis->gade);
        ptrthis = ptrthis->ptrnext;
    }

}


Programmet går ned når jeg når til funktionen "listfromfile".. Hvorfor?
Avatar billede arne_v Ekspert
13. januar 2005 - 11:12 #35
kommer ptrthis nogensinde til at pege på noget ?
Avatar billede bundgaard Nybegynder
13. januar 2005 - 11:14 #36
hmm..

egentlig peger den vel på NULL? eller hvordan?
Avatar billede bundgaard Nybegynder
13. januar 2005 - 11:18 #37
det gør den.. :/

Hva skal jeg så gøre?
Avatar billede arne_v Ekspert
13. januar 2005 - 11:20 #38
Du skal jo nok have malloc'et noget  og sat den til at pege på det ...
Avatar billede bundgaard Nybegynder
13. januar 2005 - 11:25 #39
void listfromfile(void)
{
    struct medlem *ptrthis;
    FILE *fp;
    ptrthis = malloc(sizeof(struct medlem));
    if( (fp = fopen("c:\\yeah666.txt", "r")) == NULL)
    {
        printf("Filen findes ej\n");
        exit(1);
    }
    if(ptrthis == NULL)
    {
        printf("NULL\n");
        exit(1);
    }
    while(fread(&ptrthis, sizeof(ptrthis), 1, fp) ==1)
    {
        printf("\nNavn: %s\n", ptrthis->name);
        printf("\nGade: %s\n", ptrthis->gade);
        ptrthis = ptrthis->ptrnext;
    }
}

Programmet dør også der.. Du må undskylde de mange spørgsmål, men jeg har aldrig modtaget undervisning i hægtede lister, så det er helt fremmed grund for mig det :/
Avatar billede segmose Nybegynder
13. januar 2005 - 11:46 #40
Prøv at sammemligne nedenstående med din:

while(ptrthis && /* ikke null pointer */
      fread(ptrthis /* er pointer i forvejen */, sizeof(*ptrthis /* deref */), 1, fp) ==1) {
  printf("\nNavn: %s\n", ptrthis->name);
  printf("\nGade: %s\n", ptrthis->gade);
  /* hægtet liste med nye elementer indsat først. UTESTET */
  ptrthis->ptrnext = ptrfirst;
  ptrfirst = ptrthis; /*ptrthis = ptrthis->ptrnext;*/
  ptrthis = malloc(sizeof(struct medlem));
}
Avatar billede bundgaard Nybegynder
13. januar 2005 - 11:57 #41
Nu dør den da ikke.. men omvendt skriver den heller ikke noget ud :I
Avatar billede bundgaard Nybegynder
13. januar 2005 - 12:08 #42
while(fread(ptrthis, sizeof(*ptrthis), 1, fp) ==1)
    {
        printf("\nNavn: %s\n", ptrthis->name);
        printf("\nGade: %s\n", ptrthis->gade);
        ptrthis = ptrthis->ptrnext;
    }

Sådan ser den ud pt..
Avatar billede arne_v Ekspert
13. januar 2005 - 18:38 #43
Umiddelbart ser det meget forkert ud.

Første gang læser du ind i en buffer

Anden gang læser du ind i noget som det du har læst fra disk peger på
(hvilket formentligt er enten uallokeret eller allokeret af noget andet)
Avatar billede arne_v Ekspert
13. januar 2005 - 18:38 #44
Og et svar fra mig også
Avatar billede segmose Nybegynder
14. januar 2005 - 08:50 #45
// læser record in fra fil, fint nok.
while(fread(ptrthis, sizeof(*ptrthis), 1, fp) ==1) {
  // udskriver indholdet af recorden også ok.
  printf("\nNavn: %s\n", ptrthis->name);
  printf("\nGade: %s\n", ptrthis->gade);
  // bruger den pointer der er læst ind fra disken, ikke OK! ptrthis vil enten pege på noget andet allokeret data hvorved det bliver korrupt eller på noget uallokeret, i hvilket tilfælde den næste allokering ødelægger de netop indlæste data, hvis du ikke bare får en pointer fejl med det samme.
  ptrthis = ptrthis->ptrnext;
}
Avatar billede bundgaard Nybegynder
17. januar 2005 - 10:08 #46
Hej igen

Undskyld den lange svartid, men jeg har haft en travl weekend :)

Kan i lokkes til at fortælle mig, hvor fejlen ligger, og hvordan den skal rettes? Jeg kan simpelthen ikke gennemskue det :(
Avatar billede bundgaard Nybegynder
31. januar 2005 - 09:05 #47
Jeg lukker.
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