c++ hulp bij loop.

Plaats reactie
Gebruikersavatar
Heronic
Elite Poster
Elite Poster
Berichten: 2736
Lid geworden op: 20 okt 2003, 16:41
Locatie: Bij mijn vrouw
Uitgedeelde bedankjes: 427 keer
Bedankt: 210 keer

Bedoeling :

Alle bestanden regel per regel doorzoeken op een lijst aan referenties.
Per gevonden referentie de referentie en verbruik weergeven.

Verschillende problemen.

1. De laatst ingevoerde entry in de database word niet gezocht. (vast iets mis met de query in een vector te stoppen, code niet included hieronder.)
2. De eerste eerste match in het eerste bestand word gevonden, de rest niet meer. Al word deze wel nog gezocht.

Vast iets met de loop maar ik zit me er ondertussen blind op te staren.

PS : buiten de for loop (met een vaste zoekwaarde, vind hij de vaste waarde wel in beide bestanden.)

Code: Selecteer alles

void MainWindow::Zoekmatch(std::string bestand){




    std::string regel;


// Bestand openen om in te lezen
    std::ifstream file; //(bestand.c_str());
    file.open (bestand.c_str());
    ui->textBrowserLog->append("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
    ui->textBrowserLog->append(tr("INGELEZEN BESTAND : %1").arg(bestand.c_str()));


    if(file.is_open()){
// Bestand doorzoeken op referenties
    for(int i=0; i < zoektermen.size(); i++){
    search = zoektermen[i];
    ui->textBrowserLog->append(tr("GEZOCHT : %1").arg(search.c_str()));

    while(getline(file, regel)) {


        //******************************* ZOEK WAAR SEARCH VOORKOMT EN DOE: *******************************
    if (regel.find(search, 0) != std::string::npos) {

            //******************************* CONTROLEER WELKE REGEL MET SEARCH BEGINT: *******************************
            std::istringstream iss(regel);
            std::string sub1;
            iss >> sub1;

            if(sub1==search){
            //******************************* Regel met search gevonden, steek alles in een vector (lijn): *******************************
            ui->textBrowserLog->append(tr("GEVONDEN : %1").arg(search.c_str()));
            std::istringstream iss(regel);
            do
            {
            std::string sub;
            iss >> sub;
            lijn.push_back(sub);
            } while (iss);

            //******************************* Controleer of ralkleur gekend is : *******************************

            if(is_number(lijn.at( 1 ))==true){
            ralkleur=lijn.at( 1 );
            if(lijn.at( 2 ) == "ST" || lijn.at( 2 ) == "LC" || lijn.at( 2 ) == "M"){
            std::string ralxt = lijn.at( 2 );
            ralkleur.append(" ");
            ralkleur.append(ralxt);
            }
            ui->textBrowserLog->append(tr("RALKLEUR : %1").arg(ralkleur.c_str()));
            }
            //******************************* Zoek verbruik : *******************************
            for (unsigned n=3; n<lijn.size(); n++) {
            if(is_number(lijn.at( n ))==true){
            ui->textBrowserLog->append(tr("VERBRUIK : %1").arg(lijn.at(n).c_str()));
            }

            }
            lijn.clear();
            }
        }
    }


    } //for
    file.close();
}// if file open
} //einde 



“Insanity is my only means of relaxation "
My excuse? Being dunk. Whats yours?
ITnetadmin
Elite Poster
Elite Poster
Berichten: 8445
Lid geworden op: 28 jan 2012, 18:22
Uitgedeelde bedankjes: 164 keer
Bedankt: 618 keer

Heb je ergens console output, plaats dan output text bij elke functie, dan kan je je script "zien" werken. Dat is meestal mijn manier als ik echt niet zie waar het mis loopt.

[Afbeelding Post made via mobile device ]
Gebruikersavatar
Heronic
Elite Poster
Elite Poster
Berichten: 2736
Lid geworden op: 20 okt 2003, 16:41
Locatie: Bij mijn vrouw
Uitgedeelde bedankjes: 427 keer
Bedankt: 210 keer

Ik zie

Code: Selecteer alles

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
INGELEZEN BESTAND : C:\testfiles\test1.txt
GEZOCHT : ref1
GEVONDEN : ref1
RALKLEUR : 9007 ST
VERBRUIK : 12
GEZOCHT : ref2
GEZOCHT : ref3
GEZOCHT : ref4
GEZOCHT : ref5
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
INGELEZEN BESTAND : C:\testfiles\test2.txt
GEZOCHT : ref1
GEZOCHT : ref2
GEZOCHT : ref3
GEZOCHT : ref4
GEZOCHT : ref5
Maw de loop rond zoekmatch word goed uitgevoerd.
De loop van zoeken referentie word goed uitgevoerd.
Ergens rond die while is iets mis.

de while word niet herhaald!

Bij de eerste keer gaat hij regel per regel af (getline).
Daarna start hij niet meer opnieuw.
“Insanity is my only means of relaxation "
My excuse? Being dunk. Whats yours?
Gebruikersavatar
7zp
Plus Member
Plus Member
Berichten: 104
Lid geworden op: 01 jul 2008, 00:49
Uitgedeelde bedankjes: 7 keer
Bedankt: 8 keer

Gebruikersavatar
Heronic
Elite Poster
Elite Poster
Berichten: 2736
Lid geworden op: 20 okt 2003, 16:41
Locatie: Bij mijn vrouw
Uitgedeelde bedankjes: 427 keer
Bedankt: 210 keer

Dus voor zover ik het begrepen heb :
als mijn while alsvolgt in elkaar zit :

Code: Selecteer alles

while(getline(file, regel)) {
}
Zou dit de oplossing zijn :

Code: Selecteer alles

file.ignore();
Want het haalt in elk geval niks uit. Zie ook niet onmiddelijk waarom omdat file het bestand is.
Waar zit cin in dit geval?

getline uit bestand en steek ze in string.

EDIT : bracht mij wel op het idee om de

Code: Selecteer alles

file.close(); 
file.open();
in de loop rond de while te stoppen. Ik vermoed niet de properste oplossing maar het werkt nu wel. Bedankt om in de cin richting te wijzen.
“Insanity is my only means of relaxation "
My excuse? Being dunk. Whats yours?
Gebruikersavatar
7zp
Plus Member
Plus Member
Berichten: 104
Lid geworden op: 01 jul 2008, 00:49
Uitgedeelde bedankjes: 7 keer
Bedankt: 8 keer

ben zelf geen held in c/++, maar probeer eens op een andere manier het probleem te benaderen;

ipv eenmaal het bestand te openen, telkens opnieuw het bestand fopen-en in je for(int i=0; i < zoektermen.size(); i++) scope.
Gebruikersavatar
Heronic
Elite Poster
Elite Poster
Berichten: 2736
Lid geworden op: 20 okt 2003, 16:41
Locatie: Bij mijn vrouw
Uitgedeelde bedankjes: 427 keer
Bedankt: 210 keer

Dat is in feite wat ik doe met open en close, telkens :

open bestand
for loop open
----opdracht
bestand sluiten
bestand openen
for loop einde
bestand sluiten

zo werkt het blijkbaar wel
“Insanity is my only means of relaxation "
My excuse? Being dunk. Whats yours?
Gebruikersavatar
7zp
Plus Member
Plus Member
Berichten: 104
Lid geworden op: 01 jul 2008, 00:49
Uitgedeelde bedankjes: 7 keer
Bedankt: 8 keer

dus werkt het nu? met mijn oplossing? :D
edit:
had jouw edit niet gezien in vorige post :roll:
Gebruikersavatar
Heronic
Elite Poster
Elite Poster
Berichten: 2736
Lid geworden op: 20 okt 2003, 16:41
Locatie: Bij mijn vrouw
Uitgedeelde bedankjes: 427 keer
Bedankt: 210 keer

Wel door die verwijzing naar die post icm cin en hoe die blijft doorlezen in een loop dacht ik dat dit bij een bestand ook het geval kon zijn.
Ik kan geen ignore doen maar wel sluiten en opnieuw openen lost het op gelijkaardige manier o.
Dus onrechtstreeks zette je me wel op het juiste pad ja.
“Insanity is my only means of relaxation "
My excuse? Being dunk. Whats yours?
Plaats reactie

Terug naar “Development”