[C++] vreemde fout bij lezen uit txt-file.

Pagina: 1
Acties:

  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
hallo,

ik gebruik de onderstaande txt-file en de volgende code.

txt-file
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
5000
Rojler      Zwe 0:06:55.320
Nozaki      Jap 0:07:09.690
Lalenkov        Rus 0:06:55.810
Kobayashi   Jap 0:07:12.560
Ushiyama        Jap 0:07:07.340
Friesinger                  Dui 0:06:59.030
Fabris      Ita 0:06:55.160
Marshall        Can 0:07:05.650
Postma      Ned 0:06:53.370
Saetre      Noo 0:06:59.980
Itokawa     Jap 0:07:01.990
Callis      Vst 0:07:11.780
Tuitert     Ned 0:06:55.670
Knoll       Can 0:07:03.070
Molicki     Can 0:06:59.910
Ervik       Noo 0:06:52.940
Parra       Vst 0:07:02.500
Ritsma      Ned 0:06:48.070
Boutiette       Vst 0:06:57.760
Zygmunt     Pol 0:06:54.460
Davis       Vst 0:07:04.840
Sjepel      Rus 0:06:58.290
Romme       Ned 0:06:42.670
Elm     Can 0:07:15.130


c++ source code
code:
1
2
3
4
5
6
7
8
9
10
11
12
while(!readFile.eof())
{
    char* nat = new char(100);      // anders wordt nat in iedere Schaatser hetzelfde
    char* naam = new char(100);     // idem maar dan voor naam
        
    readFile >> naam >> nat >> uren >> seperator >> minuten >> seperator >> seconden >> seperator >> milis;
    cout << naam << "   " << nat << uren << ":" << minuten << ":" << seconden << "." << milis << endl;

    Time ritTijd(uren,minuten,seconden,milis);
        
    uitslag.add(*(new Schaatser(naam, nat, ritTijd)));
}


als ik bij "Nozaki" in plaats van 0:07:09.690, 0:07:9.690 als tijd neerzet leest ie wel goed in. maar niet met de file zoals deze hierboven staat. verder leest ie bij alle andere schaatsers wel de juiste waarden in. dus ook als er bij 0:06:08:098 zou staan.

Verwijderd

je hebt dus voor minuten een integer gebruikt waardoor de eerste "0" verdwijnt?

  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
Verwijderd schreef op 22 February 2003 @ 12:27:
je hebt dus voor minuten een integer gebruikt waardoor de eerste "0" verdwijnt?
ja, minuten is een integer. maar daarom mag ie toch nog niet alleen het getal 0 inlezen (en bijv de 6 weglaten). (toch???)

[ Voor 13% gewijzigd door dexter07051982 op 22-02-2003 14:38 ]


Verwijderd

Misschien kun je beter ipv een txt file een binary maken waar je een array van structs in wegschrijft.

Heb helaas nu geen voorbeeld bij de hand, maar zal a.s. maandag wat source posten.

  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
Verwijderd schreef op 22 februari 2003 @ 14:43:
Misschien kun je beter ipv een txt file een binary maken waar je een array van structs in wegschrijft.

Heb helaas nu geen voorbeeld bij de hand, maar zal a.s. maandag wat source posten.
sorry, de opdracht is het lezen uit een txt-file (ben al op school geweest maar die leraar is al een maand "bezig" met het zoeken naar de fout. en heeft hem tot nu toe niet gevonden). een binary-file maken is dus geen optie.

Verwijderd

dexter07051982 schreef op 22 februari 2003 @ 12:15:
c++ source code
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
while(!readFile.eof())
{
  char* nat = new char(100);
  char* naam = new char(100);   
  readFile >> naam >> nat >> uren >> seperator >> minuten
    >> seperator >> seconden >> seperator >> milis;
  cout << naam << "   " << nat << uren << ":" << minuten
    << ":" << seconden << "." << milis << endl;

  Time ritTijd(uren,minuten,seconden,milis);
        
  uitslag.add(*(new Schaatser(naam, nat, ritTijd)));
}
Ok, afgezien van het feit dat het blijkbaar ergens misgaat (kun je misschien es de hele code online ergens zetten en hier een link posten ? Dan zal ik er es naar kijken) toch wat opmerkingen :
1. Die 'new char(100)' is wel heel ruimteverspillend :P Je gebruikt wel fstream (of something alike) blijkbaar om uit een file te lezen, dus waarom gebruik je dan niet meteen 'string' ipv die char* dingen ?
2. Ik mag hopen dat je Schaatser klasse ownership overneemt van die naam en nat char* dingen, anders lek je vrolijk geheugen :+
3. De constructie die je toepast in die uitslag.add() doet m'n haren rechtkomen hoor... en ik vrees dan ook dat je het geheugen dat je door 'new Schaatser(...)' gaat krijgen nooit meer vrijgeeft in je uitslag object. Nog een geheugenlek dus
4. Is die seperator -- het is btw separator -- een variabele ? Want in dat geval gebruik je dezelfde variable om de ':' separator aan te geven dan voor de '.' separator ?

[ Voor 36% gewijzigd door Verwijderd op 22-02-2003 17:37 . Reden: layout was wat vernaggeld... ]


  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
1. kan wel. wij hebben op school nooit strings gehad. moesten we maar doen met charachterarrays of pointers. ik heb dus gekozen voor pointers.

2. wat bedoel je met ownerschip overnemen? geef dat ding gewoon mee en sla deze dan op in de class schaatser. (maar ben bang dat ik dat ownershipgedoe niet doe.)

3. als je die schaatser weer verwijderd uit de linked list dan verwijderd ie ook de schaatser zelf. (delete bedoel ik)

4. ja, maar dat doet er niet toe. eigen carbage collection zeg maar. doe met die : en die . verder niks.

en nog even over het online plaatsen. dat zou ik niet kunnen. (heb volgens mij nergens webruimte en zou niet weten hoe ik dat anders wel kan doen) maar als je mij je e-mail adres ff geeft dan stuur ik je de hele source + de textfiles wel ff (is niet zo heel groot).

Maar als ik ga debuggen (stap voor stap) dan gaat voor de rest alles gewoon goed op een klein dingetje na, maar dat heeft helemaal niks te maken met het inlezen van die file. dit is namelijk het enige punt waar ik gegevens laat inlezen.

maar het gaat mij nu eigenlijk niet om dat geheugenlekken. dat los ik misschien later nog wel eens op. vind dat ik er al veel te lang mee bezig ben (en dat vind het boekje wat aangeeft hoeveel tijd hiervoor staat ook). dus voor iedereen anders. je mag best neerzetten dat ik geheugen lek, maar daar ga ik eerst niet meer op reageren. help me eerst maar ff met het inlezen wat nu niet goed gaat.

[ Voor 1% gewijzigd door dexter07051982 op 22-02-2003 19:00 . Reden: hele kromme zin ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Je komt goed weg dat er nog geen slotje aanhangt, want de eerste search op "while" en "eof" is al belangrijk. Dat is niet je problem denk ik, ik denk dat het probleem is dat 09 een invalide octaal getal is.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Unicorn
  • Registratie: Maart 2000
  • Laatst online: 29-04-2024

Unicorn

rogue soeper

Die code die je daar hebt werkt iig naar behoren als je het in een klein programmaatje isoleert. Het is goed mogelijk dat je op een andere plek in je code in een verkeerd geheugengebied zit te schrijven of zo. Dat veroorzaakt vaak dit soort vage klachten.

Verwijderd

Unicorn schreef op 22 februari 2003 @ 23:43:
Het is goed mogelijk dat je op een andere plek in je code in een verkeerd geheugengebied zit te schrijven of zo. Dat veroorzaakt vaak dit soort vage klachten.
Precies, dat had ik ook in gedachten, vandaar dat ik wat opmerkingen over op z'n minste 'verdachte' code maakte :)

Verwijderd

dexter07051982 schreef op 22 February 2003 @ 18:58:
1. kan wel. wij hebben op school nooit strings gehad. moesten we maar doen met charachterarrays of pointers. ik heb dus gekozen voor pointers.
Is niets mis mee hoor :)
2. wat bedoel je met ownerschip overnemen? geef dat ding gewoon mee en sla deze dan op in de class schaatser. (maar ben bang dat ik dat ownershipgedoe niet doe.)
Wel, je maakt een Schaatser object op de manier 'new Schaatser(naam, nat, ritTijd)'. Die naam en nat die je meegeeft aan je constructor zijn echter char* dingen die je verkreeg door een new te doen (zie je code hoger). Dat betekent dat vroeg of laat iemand het geheugen dat daarmee is verkregen ook terug moet vrijgegeven worden door een delete te doen. Je doet echter new in een loop, en dus krijg je iedere keer een nieuwe waarde voor 'naam' en 'nat' waardoor je de oude kwijtraakt. Daar kun je dus al geen delete meer doen. Het enige wat je dus nog kunt doen (en hopelijk doet) is het ownership van die pointers overdragen aan je schaatser object, waarmee ik bedoel dat een schaatser object verantwoordelijk wordt om die 2 pointers te deleten wanneer dat nodig is...
3. als je die schaatser weer verwijderd uit de linked list dan verwijderd ie ook de schaatser zelf. (delete bedoel ik)
Ok, dat is dan prima :) Maar waarom ga je dan die new pointer eerst 'de-reference-en' ? Je moet in de code van de add functie op het uitslag object dan toch weer de pointer hebben (anders kan je er immers geen delete op doen). Jij gaat dus : pointer -> object (parameter van je functie) -> pointer. Geef dan gelijk een pointer door, spaart je wat moeite en tijd ;)
en nog even over het online plaatsen. dat zou ik niet kunnen. (heb volgens mij nergens webruimte en zou niet weten hoe ik dat anders wel kan doen) maar als je mij je e-mail adres ff geeft dan stuur ik je de hele source + de textfiles wel ff (is niet zo heel groot).
_piranha_ (at) pandora (dot) be

  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
MSalters schreef op 22 February 2003 @ 19:48:
Je komt goed weg dat er nog geen slotje aanhangt, want de eerste search op "while" en "eof" is al belangrijk. Dat is niet je problem denk ik, ik denk dat het probleem is dat 09 een invalide octaal getal is.
Waarom zouden jullie er een slotje op plaatsen? wat heb ik dan verkeerd gedaan?
en waarom zal die dat als octaal getal willen lezen?

[ Voor 10% gewijzigd door dexter07051982 op 23-02-2003 13:59 . Reden: incomplete ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

dexter07051982 schreef op 23 February 2003 @ 13:48:
Waarom zouden jullie er een slotje op plaatsen? wat heb ik dan verkeerd gedaan?
en waarom zal die dat als octaal getal willen lezen?
Leading zero in een numerieke string impliceert octaal, net als de prefix 0x hexadecimaal impliceert.

Slotje snap ik ook niet echt :Y)

Professionele website nodig?


  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
ah kijk dan ligt het daar waarschijnlijk aan. zal het proberen. als dat het is kan ik ze denk ik het beste eerst als char inlezen en dan omzetten naar een int. of is er nog een betere manier?

  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
het lag inderdaad wel aan die 0 voor het getal. (dus het octaal willen inlezen.)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Slotje zou zijn omdat er tenminste een fout inzit die je in de search kunt vinden, namelijk de while ( .eof() ). De consequentie is dat het lezen van de laatste regel fout gaat.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Unicorn
  • Registratie: Maart 2000
  • Laatst online: 29-04-2024

Unicorn

rogue soeper

dexter07051982 schreef op 23 February 2003 @ 17:51:
het lag inderdaad wel aan die 0 voor het getal. (dus het octaal willen inlezen.)
Weet je dat heel zeker? Als je het in een klein programmaatje kunt aantonen wil ik het wel zien, want dan verschillen onze >> operators in gedrag. :P

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22-08 01:56
MSalters schreef op 22 February 2003 @ 19:48:
Dat is niet je problem denk ik, ik denk dat het probleem is dat 09 een invalide octaal getal is.
Ik respecteer je frequente zinnige bijdragen op /14, maar dit is grote onzin! Als je niet speciale moeite doet om de boel anders te configureren, leest de iostream operator >> gewoon decimale getallen in, net zoals << decimale getallen wegschrijft.

Invoer als 0123 wordt dus gewoon als het decimale getal 123 (honderd-drie-en-twintig) ingelezen. Je kunt daar niet eens "0x7B" voor invullen, en dan gewoon met >> uitlezen, al zou je het willen.

  • ProgrammerX
  • Registratie: Juli 2002
  • Laatst online: 26-02-2021
Verwijderd schreef op 23 februari 2003 @ 00:18:
_piranha_ (at) pandora (dot) be
Bang voor programma's die websites doorzoeken voor emailadressen om te spammen ? ;)

[ Voor 4% gewijzigd door ProgrammerX op 24-02-2003 09:50 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

dexter07051982 schreef op 22 February 2003 @ 12:15:
code:
1
    char* nat = new char(100);      // anders wordt nat in iedere


uhm, zou je daar niet eens new char[100] van maken?
(en ben ik nou de enige die dat ziet :?)

nu alloceer je namelijk maar 1 char, die geinitializeert wordt met waarde 100

[ Voor 14% gewijzigd door .oisyn op 24-02-2003 10:17 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

.oisyn schreef op 24 February 2003 @ 10:17:
uhm, zou je daar niet eens new char[100] van maken?
(en ben ik nou de enige die dat ziet :?)

nu alloceer je namelijk maar 1 char, die geinitializeert wordt met waarde 100
Mmm had ik wel gezien toen ik topic voor het eerst zag maar dacht dat het al was gemeld toen ik later pas zelf reageerde :X

Professionele website nodig?


  • Unicorn
  • Registratie: Maart 2000
  • Laatst online: 29-04-2024

Unicorn

rogue soeper

.oisyn schreef op 24 februari 2003 @ 10:17:
(en ben ik nou de enige die dat ziet :?)
...Ja... Drie keer strak overheen gelezen. |:( |:(
(Misschien is het de gewenning van vector<char> foo (100) ...)

Zit er dik in dat je >> operator ook weer naar behoren werkt en je je zelfgemaakte atoi() weg kunt knikkeren. :)
Pagina: 1