[C] Struct/fgets/fscanf/array vraag

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste Allemaal,

Voor school ben ik een opdracht aan het maken in C waar ik niet helemaal uitkom en ik hoop dat iemand me kan helpen.

Het probleem is als volgt. Je hebt een tekstbestand met namen en nummers
-----
Pietje<enter>
10<enter>
Jan<enter>
11<enter>
Jozef<enter>
12
-----

Het idee is om de tekstfile uit te lezen en in een structarray van 'personen te gooien'

code:
1
2
3
4
typedef struct persoon { 
          int nummer; 
          char naam[30];
} Persoon;


Wat ik nu heb is dit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Persoon * leesfile(char *filename, int *pn){
     Persoon * array;
      FILE * fp;
      if ((fp = fopen(filename, "r")) == NULL) {
        printf("Kan file %s niet openen\n", filename);
        return NULL;
      }
      char nm[30];
      int nmr;
      int teller = 0;
      Persoon temp[40];
      
      while(!feof(fp)){
        fgets(nm, 120, fp);
        fscanf(fp,"%d",&nmr);
                
        printf("%d: ", nmr); // test of hij correct leest
        printf("%s\n", nm); // test of hij correct leest
        temp[teller].naam = nm;
        temp[teller].nummer = nmr;
               
        teller++;        
      } 
                   
}


Het punt is dat hij ten eerste rare resultaten teruggeeft bij het lezen, dit ziet er namelijk als volgt uit:
"
10: Pietje

10:

11: Jan

11:

12: Josef

12:
"
Ik begrijp dat de while er 6x door heen gaat, maar ik snap niet hoe ik het voor elkaar kan krijgen om er maar 3x doorheen te gaan, zodat de resultaten wel correct zijn. Daarnaast snap ik de lege regels niet.

Verder krijg ik nog een error: incompatible types in assignment
Bij deze regel: temp[teller].naam = nm;

Verder dacht ik de array temp gewoon te returnen.

Kan iemand me helpen?

Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
fscanf leest geen enter zo te zien, dit resulteert in een volgende ronde while voor die enter, waarbij fscanf geen getal kan lezen en de waarde van nmr niet overschrijft. Ik weet niet of fgets leest incl enter, ik denk het wel gezien het telkens een regel + lege regel is en je print met een \n. Mijn kennis van dit gedeelte van C is wel wat weggezakt overigens.

Voor het laatste moet je strcpy gebruiken.

Je reserveert voor nm 30 bytes, fgets vertel je om maximaal 120 bytes te lezen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Shadowman schreef op maandag 08 maart 2010 @ 11:37:
fscanf leest geen enter zo te zien, dit resulteert in een volgende ronde while voor die enter, waarbij fscanf geen getal kan lezen en de waarde van nmr niet overschrijft. Ik weet niet of fgets leest incl enter, ik denk het wel gezien het telkens een regel + lege regel is en je print met een \n. Mijn kennis van dit gedeelte van C is wel wat weggezakt overigens.

Voor het laatste moet je strcpy gebruiken.

Je reserveert voor nm 30 bytes, fgets vertel je om maximaal 120 bytes te lezen.
Mja zoiets dacht ik ook, maar ik weet niet hoe ik het voor elkaar krijg om dan toch niet die while in te gaan.

strcpy, logisch, dom, bedankt!

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:51
Shadowman heeft helemaal gelijk. scanf() slaat wel whitespace aan het begin over, maar laat die aan het einde van de regel staan. fgets() leest een regel tot aan (en inclusief) het regeleinde.

Er zijn twee mogelijke oplossingen. Je kunt een fgets() doen ná de scanf() om van het regeleinde af te komen. Anderzijds is het gebruikelijk om als je regelgebaseerde invoer leest, het bestand simpelweg met alléén fgets() regel voor regel in te lezen. De regels met een getal er op moet je dan nog parsen met atoi() of sscanf() of op een andere manier.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Soultaker schreef op maandag 08 maart 2010 @ 11:48:
Shadowman heeft helemaal gelijk. scanf() slaat wel whitespace aan het begin over, maar laat die aan het einde van de regel staan. fgets() leest een regel tot aan (en inclusief) het regeleinde.

Er zijn twee mogelijke oplossingen. Je kunt een fgets() doen ná de scanf() om van het regeleinde af te komen. Anderzijds is het gebruikelijk om als je regelgebaseerde invoer leest, het bestand simpelweg met alléén fgets() regel voor regel in te lezen. De regels met een getal er op moet je dan nog parsen met atoi() of sscanf() of op een andere manier.
Veel dank, ik zal vanaf nu fgets gebruiken en ht daarna parsen.

code:
1
2
3
        fgets(nm, 30, fp);
        fgets(string_nmr, 30, fp);
        sscanf(string_nmr, "%d" , &nmr);

Werkte.

Kan op slot!

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:56

Creepy

Tactical Espionage Splatterer

Het algemeen beleid #topiceinde
Opgelost betekent niet dat het topic daarna op slot moet.
;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1