Pagina 1 van 1

c++ hulp bij loop.

Geplaatst: 27 feb 2014, 19:02
door Heronic
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 




Re: c++ hulp bij loop.

Geplaatst: 27 feb 2014, 19:33
door ITnetadmin
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 ]

Re: c++ hulp bij loop.

Geplaatst: 27 feb 2014, 20:00
door Heronic
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.

Re: c++ hulp bij loop.

Geplaatst: 27 feb 2014, 20:57
door 7zp

Re: c++ hulp bij loop.

Geplaatst: 27 feb 2014, 21:23
door Heronic
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.

Re: c++ hulp bij loop.

Geplaatst: 27 feb 2014, 21:52
door 7zp
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.

Re: c++ hulp bij loop.

Geplaatst: 27 feb 2014, 22:37
door Heronic
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

Re: c++ hulp bij loop.

Geplaatst: 27 feb 2014, 23:21
door 7zp
dus werkt het nu? met mijn oplossing? :D
edit:
had jouw edit niet gezien in vorige post :roll:

Re: c++ hulp bij loop.

Geplaatst: 28 feb 2014, 00:01
door Heronic
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.