[C++] getline fail.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Koekje
  • Registratie: Oktober 2003
  • Niet online

Koekje

GoT-lurker

Topicstarter
Ik heb een randomly generated ints (1,0) csv file size: dMaxXY*dMaxXY. In deze file zitten "turtles" units die over deze "omgeving "bewegen. Wat compleet mis gaat is het lezen uit de CSV file. Ik wil de value waar de turtle zit gebruiken om de turtle te laten checken naar eten op de bijbehorende locatie 1 of 0. en afhankelijk van die value laten eten( = write 0) of niets laten doen. Turtle's hebben een double x,y value, die ik heb gecast naar een int om te werken i.c.m de omgeving die in de csv staat. (1e deel). Echter bij myfile.getline() gaat het compleet mis, en ik weet even niet meer wat. Bij het reporten van de "line" in de cout geeft hij rare values aan.

Mijn aanpak is de complete omgeving wil ik in de string laden (lekker inefficiënt, weet ik maar ik heb opgegeven om de omgeving per line te laden). Eigenlijk het enige wat ik wil weten is wat er mis gaat met mijn getline-functie. En misschien een suggestie voor een alternatieve oplossing, iets met vectoren, want daar heb ik wat meer ervaring mee. :P

Het onderstaande is een deel van mijn code:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//eat; *(if at food, food = 0 and + counter
    for (int idx = 0; idx != iAmountOfTurtle; ++idx)
    {
        char line[99999];
    // reports turtle loc, and checks for food
        int y =(int)turtleYCor.at(idx);  
        int x =(int)turtleXCor.at(idx);
        myfile.getline (line, (dMaxXY*dMaxXY),',');

    cout <<"turtle number: "<< idx <<" food at turtle loc: " << line[y] <<  " xcor: "  << x + 1 <<" ycor: "<< y + 1 << endl;
    // 1 = food, 0 = no_food
    if (line[y + 1] = 1) 
    {
    //  todo add: write at vectorlocation [idx] location a "0" a.k.a. eat for turtle # idx
    turtleFoodEaten[idx] += 1;
    }
    
    //else 
    }


Alvast bedankt!

Is het handig als ik de complete source post? Er staan overal comments bij, maar toch denk ik dat de leesbaarheid niet erg hoog is. :X

[ Voor 4% gewijzigd door BtM909 op 08-02-2012 12:13 ]

There are 10 types of people in this world. Those who understand binary, and another 9 who don't give a s**t.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Koekje schreef op maandag 06 februari 2012 @ 18:33:
Is het handig als ik de complete source post?
Driewerf neen. Enkel relevante(!) stukjes code. Je moet je code zo ver gestript hebben dat 't je probleem reproduceert en verder niets. Dat hoor je overigens sowieso voor jezelf al te doen als je ergens niet uit komt om zo te voorkomen dat er zaken meespelen waar je misschien geen erg in hebt.

Sterker nog: je post nu al meer dan nodig; je zou kunnen volstaan met:
C++:
1
2
myfile.getline (line, (dMaxXY*dMaxXY),',');
cout << "somethinghere" << endl;

Maar dan mis ik wel nog (o.a.) de initialisatie van myfile en een eventuele implementatie van getline.

Ik ben niet erg soepel in C++ maar ik zie even niet wat (dMaxXY*dMaxXY) precies moeten doen (en waarom je ze niet afdrukt wellicht), wat waarin gelezen wordt enzo dus daar kan ik je zo niet mee helpen.

Heb je hier iets aan?

[ Voor 94% gewijzigd door RobIII op 06-02-2012 23:35 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • SupremeRick
  • Registratie: Mei 2010
  • Laatst online: 11-09 10:02

SupremeRick

Muse Fan

cout op regel 10 niet even naar count veranderen?

PC: CPU: i9-10900KF @ 4.8GHZ | GFX: MSI Gaming X GTX1080Ti | RAM: GSKILL TridentZ 4x16GB @ 3600MHz | SSD: 2TB | HDD: 1TB | Mobo: Asus Strix Z470-e | Case: Corsair 500D SE | Cooler: Corsair H150i


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
SupremeRick schreef op maandag 06 februari 2012 @ 23:14:
cout op regel 10 niet even naar count veranderen?
TS bedoelt wel degelijk cout en niet count.

[ Voor 8% gewijzigd door RobIII op 06-02-2012 23:15 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • SupremeRick
  • Registratie: Mei 2010
  • Laatst online: 11-09 10:02

SupremeRick

Muse Fan

hmm k

PC: CPU: i9-10900KF @ 4.8GHZ | GFX: MSI Gaming X GTX1080Ti | RAM: GSKILL TridentZ 4x16GB @ 3600MHz | SSD: 2TB | HDD: 1TB | Mobo: Asus Strix Z470-e | Case: Corsair 500D SE | Cooler: Corsair H150i


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15:26
Wat is myfile voor een ding en wat zou die getline moeten doen?

[edit]
Als je idd istream.getline(...) bedoelt, ben ik bang dat het ding niet doet wat jij verwacht:
delim
The delimiting character. The operation of extracting successive characters is stopped when this character is read.
In any case ga je er van uit dat line[ y ] iets is, wat natuurlijk helemaal niet zo hoeft te zijn.

@Struikrover
Als het een istream is, dat blijkt niet uit de context.

[ Voor 77% gewijzigd door farlane op 06-02-2012 23:46 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • Struikrover
  • Registratie: Juni 2005
  • Laatst online: 20-09 12:08
myfile is waarschijnlijk zijn CSV-bestand, en getline extraheert input naar de char line[]: http://www.cplusplus.com/reference/iostream/istream/getline/

Desondanks is me de bedoeling van TS zijn code niet erg duidelijk, het is vrij rommelig geschreven....

Overigens is char line[9999] wel heel lelijk. Doe dan gewoon char line[dMaxXY*dMaxXY], want dat is toch de maximale grootte die de lines character array moet hebben? Wellicht lost het je probleem ook op :P

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:14
Er is ook een getline() variant die direct in een std::string inleest; dat scheelt je weer mogelijke buffer overflows (ten koste van een kleine performance penalty).

Aangenomen dat het bestandsformaat bestaat uit twee coordinaten per regel, gescheiden door een komma, dan kun je inderdaad getline() ge/misbruiken om te tokenizen, aangenomen dat de invoer aan de specificaties voldoet. Je kunt ook handig istringstreams gebruiken om getallen te parsen (aangenomen dat je 't niet erg vind dat extra garbage op het einde genegeerd wordt):

C++:
1
2
3
4
5
6
7
string token;
double x, y;
if ( getline(myfile, token, ',')  && istringstream(token) >> x &&
     getline(myfile, token, '\n') && istringstream(token) >> y )
{
    // doe iets met x en y
}


Dit is geen super-efficiënte manier om IO te doen (aangezien je steeds tijdelijke strings en istringstreams moet maken) maar het is eenvoudig en veilig en in de meeste situaties snel genoeg.

Een alternatief is om terug te vallen op de efficiëntere en voor dit soort situaties meer geschikte C API:
C:
1
2
3
4
5
double x, y;
if (fscanf(myfile, "%lf,%lf", &x, &y) == 2)
{
    /* doe iets met x en y */
}

(Dan moet myfile natuurlijk een C FILE* zijn in plaats van een std::istream.)

Acties:
  • 0 Henk 'm!

  • Dars123
  • Registratie: Juni 2008
  • Laatst online: 23-11-2022
Je kan ook gewoon nullen en enen achter elkaar in één lange rij zonder komma's in een bestand zetten en die in één keer inlezen in een buffer. Maakt het inlezen een stuk eenvoudiger en sneller.

(Als alles goed werkt kan je een binair bestand gebruiken en hoef je niet steeds tekst naar getallen te converteren.)

Acties:
  • 0 Henk 'm!

  • Koekje
  • Registratie: Oktober 2003
  • Niet online

Koekje

GoT-lurker

Topicstarter
Ik heb de code herschreven zodat er minder file IO nodig is, alleen de broodnodige parameters worden gemonitord. Dit scheelt echt enorm met de code (hoeveelheid & snelheid). Ik ga nog even wat tutorials volgen m.b.t. het schrijven naar files en het selectief ophalen van data. Erg bedankt voor de suggesties. Vooral die van Soultaker & de 1e reply waren erg nuttig. Ik vermoed dat de foutmelding te maken heeft met de initialisatie van "myfile" maar waar wat precies heb ik nog niet uitgezocht.

Volgende keer zal ik wat meer aandacht besteden aan de TS. :>

There are 10 types of people in this world. Those who understand binary, and another 9 who don't give a s**t.

Pagina: 1