2016-09-10 4 views
0

Ich arbeite an einem Programm, um eine Liste aus einer großen QStringList zu erstellen. Im Grunde wird nach einer String-Übereinstimmung eine While-Schleife beginnen, die nächsten Strings zu einer Liste hinzuzufügen. Dieser Teil funktioniert gut. Das einzige Problem, das ich habe, ist, dass das Programm unerwartet beendet wird, weil ich nicht weiß, wie ich den EOF-Mechanismus hinzufügen sollte.Setzen Sie eine While-Schleife fort, bis EOF (Qt)

-Update mit einer detaillierteren Code

Sorry für die nicht mit genug Details über meinen Code bereitstellt. So sieht mein Code jetzt aus. Also, nach dem ersten Mal die Zeichenfolge "PACKAGE TYPE" erkannt wird, verwende ich die Funktion storeLines() Funktion, um die nächsten Strings in einer von drei Listen abhängig zu speichern. Und dies wird bis zum nächsten "PACKAGE TYPE" -Match oder EOF fortgesetzt. Die einzige Sache, die jetzt nicht richtig funktioniert, ist, wenn der Iterator auf der letzten Schnur der QStringList ist. Es erkennt irgendwie nicht, dass der nächste ist inputline.end()

void storeLines(QString department, QStringList::iterator current_line, QStringList::iterator endline){ 
while(QString::compare(*(current_line + 1),"PACKAGE TYPE") && (++current_line != endline)){ //this is not working 
    if(!QString::compare(department, "MDA")) mda_list.push_back(*current_line); 
    else if(!QString::compare(department, "SDA")) sda_list.push_back(*current_line); 
    else mix_list.push_back(*current_line); 
    } 
} 

void void MainWindow::on_pushButton_clicked(){ 
    QString input = ui->listinput->toPlainText().toLatin1(); 
    QStringList inputline = input.split("\n", QString::SkipEmptyParts); 

    for(QStringList::iterator pkg_header(inputline.begin()); pkg_header != inputline.end(); ++pkg_header){ 
     if(!QString::compare(*pkg_header,"PACKAGE TYPE")){ 
      ++pkg_header; 
      if(!QString::compare(*pkg_header,"Department-mda:")) storeLines("MDA", pkg_header, inputline.end()); 
      else if(!QString::compare(*pkg_header,"Department-sda:")) storeLines("SDA", pkg_header, inputline.end()); 
      else storeLines("MIX", pkg_header, inputline.end()); 
     } 
    } 
} 

Vielen Dank im Voraus!

+0

Sie wissen also, wie man die Stoppbedingung für die 'for' -Schleife schreibt, aber nicht für die' while' Schleife? Sie sollten den gleichen Check natürlich an beiden Orten verwenden. –

+0

@IgorTandetnik Ich habe den Code vereinfacht. In Wirklichkeit ist die "while" -Schleife in einer anderen Funktion ausgeführt. Ich habe versucht, 'inline.end()' als Parameter hinzuzufügen, aber das schien nicht zu funktionieren. – Mrchacha

+0

Nun, du müsstest es funktionieren lassen. Vergleichen Sie, um den Iterator * zu beenden * ist, wie Sie das Ende des Bereichs erkennen. Ihre Versuche, mit "NULL" zu vergleichen, sind Unsinn. –

Antwort

0

Ihre offensichtliche Absicht besteht darin, die Zeichenfolge "PACKAGE TYPE" in der vorhandenen Liste zu suchen und dann die verbleibenden Elemente in der Liste in eine neue Liste zu kopieren.

Wenn das der Fall ist, warum nicht genau das tun?

for(QStringList::iterator current_line(inputline.begin()); current_line != inputline.end(); ++current_line){ 
    if(!QString::compare(*current_line,"PACKAGE TYPE"){ 
     list.insert(list.end(), ++current_line, inputline.end()); 
     break; 
    } 
} 
+0

Es tut uns leid, dass Sie das Problem nicht verstanden haben. Ich habe den Code mit einer ausführlicheren Beschreibung aktualisiert. Die Sache ist, dass ich den EOF und einen eventuellen nächsten "PACKAGE TYPE" -Match im Auge behalten muss. – Mrchacha

+0

Es gibt keine solche Sache namens "EOF". "EOF" bedeutet "Dateiende", wenn der Inhalt gelesen wird.Es gibt keine Dateien hier. Sie können immer noch nicht genau erklären, was Sie wollen. –

+0

Okay, also ich möchte herausfinden, wie ich überprüfen kann, ob 'current_line' auf der letzten Zeichenkette der QStringList steht. Ich habe eine QStringList, wo es mehrere Abschnitte gibt, wobei jeder Abschnitt mit der Zeichenfolge "PACKAGE TYPE" beginnt. Die nächste Zeichenfolge definiert, zu welcher Abteilung das Paket gehört. es kann in mda, sda oder in der mischabteilung sein. Und dann möchte ich die folgenden Strings bis zum nächsten Abschnitt "PACKAGE TYPE" oder dem Ende von QStringList in den Abteilungslisten speichern. – Mrchacha

1

Sie schreiben einen Parser - es ist oft am einfachsten, es zu schreiben, wie Sie in der Regel einen schreiben würden, durch die Staaten explizit zu machen und in der Folge über jedes Element des Eingangsstroms laufen. Sie werden auf diese Weise keine Iterator-Fehler hintereinander machen.

Dieser Code entspricht der Absicht in Ihrer Frage und macht es offensichtlich, dass Sie einen Fall verpasst haben: Wenn Sie eine Abteilung erwarten, reagieren Sie nicht auf die PACKAGE TYPE, die vorhanden ist. Sie könnten einen Fehler signalisieren oder im Zustand DEPARTMENT bleiben, aber ich nehme an, Sie sollten damit umgehen und es nicht einfach ignorieren.

QStringList mda_list, sda_list, mix_list; 

void parse(const QString & input) { 
    enum { 
     TYPE, 
     DEPARTMENT, 
     ITEMS 
    } state = TYPE; 
    auto list = &mix_list; 
    auto const kPackageType = QStringLiteral("PACKAGE TYPE"); 

    for (auto const element : input.split("\n", QString::SkipEmptyParts)) { 
     switch (state) { 
     case TYPE: 
      if (element == kPackageType) 
       state = DEPARTMENT; 
      break; 
     case DEPARTMENT: 
      if (element == QStringLiteral("Department-mda:")) 
       list = &mda_list; 
      else if (element == QStringLiteral("Department-sda:")) 
       list = &sda_list; 
      state = ITEMS; 
      break; 
     case ITEMS: 
      if (element == kPackageType) 
       state = DEPARTMENT; 
      else 
       *list << element; 
      break; 
     } 
    } 
} 

Die Verwendung von QStringLiteral gibt Ihnen Kompilierung-gebauten String-Instanzen gegen vergleichen. Der Code würde genauso gut funktionieren, wenn Sie die QStringLiteral(...) Wrapper entfernen, allerdings wegen der unvermeidlichen vorzeitigen Pessimierung.

Verwandte Themen