2017-01-25 3 views
1
while(getline(data, word, '\n')){//seperates by line 
    ss<<word; // output1: Chicken, for sale, 60 
       // output2: Microwave, wanted, 100 (and so on) 

    while(getline(ss, word, ',')){//seperates by individual words + space 
     // output1: Chicken 
     // output2: for sale 
     // output3: 60 
     if(word[0]==' '){ //removes space in 2 and 3 
      word.erase(0,1); 
     } 

     if(wordindex==0){ 
      board[i].object=word; 
      wordindex++; 
     } 
     else if(wordindex==1){ 
      board[i].type=word; 
      wordindex++; 
     } 
     else if(wordindex==2){ 
      board[i].price=word; 
      wordindex=0; //resets index to 0 for next line 
      i++; //moves to next struct in array 
     } 
    } 
} 

Die zweite getline-Schleife läuft nur einmal für den ersten Eingang: chicken, for sale, and 60 und erreicht nicht die zweite. Ich denke, Word-Index ist immer auf 0 eingestellt, so sollte es kein Problem sein. Auch die erste getline() gibt alle Daten vollständig aus, so etwas verursacht die zweite getline() verwirrt werden. Ich kann einfach nicht sehen, was es ist.Bug: Warum wird diese Schleife nur einmal durchlaufen?

+0

Sie können die Debugging-Software, die mit ziemlicher Sicherheit mit Ihrer Entwicklungsumgebung kam herauszufinden, brutal wirksam zu sein, was hier schief ging. – user4581301

+0

Außerdem hat ein anderer Benutzer früher eine Frage mit einem ähnlichen Analyseproblem gestellt. Es stellte sich heraus, dass es einfacher war, mit '>>' auf die Leerzeichen zu setzen und die Kommas zu beschneiden. Zum einen hat es die ganze Zahl eine ganze Zahl behalten. http://StackOverflow.com/a/41840993/4581301 – user4581301

+0

Meine Analyse ist ziemlich einfach, wie es wirklich ist. – grilam14

Antwort

3

Hier

ss<<word; 

OP wieder verwendet einen String, die bis zum Ende auf einer vorherigen Iteration gelesen worden sein, den Strom in einem schlechten Zustand zu versetzen, wo es nicht mehr zu oder von gelesen werden kann. Dies kann durch Zugabe

ss.clear(); 

am Ende der Schleife keine schlechten Fahnen entfernen gelöst werden, sondern durch ständiges Schreiben mor Daten in die string wird es weiter wächst mehr und mehr Speicher saugte es sei denn abgepumpt mit etwas wie

ss.str(std::string()); 

, um seinen internen Puffer auf eine leere Zeichenfolge zurückzusetzen. Es wäre vielleicht besser, einfach eine neue stringstream jede Iteration nur für Code Klarheit zu erstellen, wenn die zusätzlichen Kosten der Konstruktion und Zerstörung der Parsing-Geschwindigkeit kein Problem ist.

Hier ist ein einfacher Ansatz für die innere Parsing-Schleife:

std::stringstream ss(word); 
while(i<MAX_ARRAY_SIZE && // prevent overflow 
     getline(ss, board[i].object, ',') && 
     getline(ss, board[i].type, ',') && 
     getline(ss, board[i].price, ',')){ // read all three parameters directly into object 
    //sanitize 
    if(board[i].type[0]==' '){ 
     board[i].type.erase(0,1); 
    } 

    if(board[i].price[0]==' '){ 
     board[i].price.erase(0,1); 
    } 
    i++; // next, please 
} 
+0

Erstellen eines neuen String-Stream zu Beginn der ersten Schleife löste das Problem. Jetzt habe ich einen Segmentierungsfehlerfehler, aber das ist etwas, womit ich umgehen kann. – grilam14

+0

@ grilam14 überprüfen Sie, dass Sie das Array nicht überschritten haben. Habe gerade ein Beispiel für einen schnellen Hack hinzugefügt. – user4581301

Verwandte Themen