[C] Structs en van toetsenbord lezen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik zit met een probleempje waar ik niet helemaal uitkom.

Het is als volgt: Van het toetsenbord wil ik een aantal regels lezen en in een struct gooien. De worden als volgt ingevoerd:

1234<enter>
abcd<enter>
111222333444<enter>
5678<enter>
efgh<enter>
555666777888<enter>
etc.
#<enter>

Ze moeten in een array van structs komen:

code:
1
2
3
4
5
typedef struct demostruct {
 char part[6];
 short half;
 long total;
} DemoStruct


Ik was als volgt aan de gang met mijn functie lees_file

code:
1
2
3
4
5
6
7
8
9
DemoStruct * lees_in(){
  char c;
  DemoStruct temp[40];
  int teller = 0;
 
  printf("Vul de benodigde informatie in en sluit af met een#:\n");
  while( ( ch = getchar()) != '#'){
  }
}

Ik zat al te denken om bij te houden welke line je zit om zo vervolgens de characters weg te schrijven (eerst naar temp[0].part. Daarna een soort check tot er weer een \n komt waarop je wegschrijft naar .half en dat herhalen met .total. Alleen ik geloof dat dit efficienter moet kunnen. Bestaat er manier waarop ik makkelijker die regels van het scherm kan lezen en bij kan houden op welke regel ik zit?

Alvast bedankt

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:51
Kun je met de tips uit je eerdere topic niet iets bedenken? ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Soultaker schreef op maandag 08 maart 2010 @ 14:46:
Kun je met de tips uit je eerdere topic niet iets bedenken? ;)
Geen concrete oplossingen, probleem is hier dat met getchar je enkele chars terugkrijgt. En ik op een of andere manier een construtie nodig heb waarbij ik die omzet in regels.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:51
Misschien een idee om dan regel voor regel uit te lezen met fgets() zoals de vorige keer?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Soultaker schreef op maandag 08 maart 2010 @ 15:02:
Misschien een idee om dan regel voor regel uit te lezen met fgets() zoals de vorige keer?
Maar hoe zorg je dan dat hij stopt met lezen als er een # wordt ingetoetst?

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:51
Je kunt toch gewoon kijken of een ingevoerde regel # bevat?

@hieronder:
de laatste regel zal meestal nog een regeleinde bevatten. ;)

[ Voor 39% gewijzigd door Soultaker op 08-03-2010 15:31 ]


Acties:
  • 0 Henk 'm!

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 15-07 15:35

leuk_he

1. Controleer de kabel!

Verwijderd schreef op maandag 08 maart 2010 @ 15:11:
[...]


Maar hoe zorg je dan dat hij stopt met lezen als er een # wordt ingetoetst?
code:
1
2
3
if (strcmp(Gelezenregel,"#")==0) {
   /* regel met een # gevonden, stop */ 
   break; /* of exitvar = 0 zetten en in loop op exitvar testen */


besef dat je buffered leest he? dus je code werkt pas na een enter. Besef ook dat een string in C met een 0 char wordt afgelsoten, dus als je 123456 in part zet heb je een buffer overflow.

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

de fouten die je maakt:
1) als een beginner met C werken (daar ga ik maar vanuit gezien je vraag)
kan je geen C++ gebruiken, en std::string en std::cin gebruiken, dat is een stuk makkelijker
2) een fixed-size buffer gebruiken voor user-input (typefout = crash)

daarnaast, je stelt zelf al voor om temp[0] te gebruiken om in te lezen, en zodra je een \n tegenkomt naar de volgende regel te gaan. dat lijkt me een werkbare oplossing:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//pseudocode
void lees()
{
  char c;
  demostruct data[40];
  int regel = 0;
  int kolom = 0;
 
  while(c = getch())
  {
    switch(c)
    {
      case '#': return;  //of doe iets met je data
      case '\n': regel++; kolom = 0; break;
      default: /*check je indices*/ data[regel].part[kolom] = c; kolom++;
    }
  }
}

-niks-


Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 13:19

Reptile209

- gers -

MLM schreef op maandag 08 maart 2010 @ 19:23:
de fouten die je maakt:
1) als een beginner met C werken (daar ga ik maar vanuit gezien je vraag)
kan je geen C++ gebruiken, en std::string en std::cin gebruiken, dat is een stuk makkelijker
[...]
offtopic:
Dit zou ik niet echt 'fout' noemen. Okee, je legt de lat hoog, maar onmogelijk is het zeker niet. Sterker nog: volgens mij doet Dikkuh het voor school, dus hij is niet de enige die 'als beginner met C werkt'. Wat wel een fout is, is dat zijn studiemateriaal blijkbaar niet lekker op zijn nivo aansluit... blame school :).

Zo scherp als een voetbal!

Pagina: 1