B
@SeppJ
Habe deinem Tipp gefolgt:
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <map>
#include <string>
#include <algorithm>
// Liste der bekannten Substring
const std::map<int, std::vector<std::string>> mTeilstrings = {
{1, {"[8A]", "[UKE]"}},
{2, {"[Dings da]", "[DingsBums]"}},
{3, {"[GF]", "[MOD]", "[MOD3]", "[MOD6]"}},
{4, {"[Weiss]", "[Rot]", "[Orange-Blau]"}}
};
int main() {
std::ifstream ifsDatei("Zu_Sortieren.txt");
std::string strZeile;
std::string strTeilstring;
bool Gefunden=true; // für Fehler "unbekannter Substring"
bool GruppenDuplikat; // für "Gruppenduplikat"-Fehler
if (ifsDatei.is_open()) { // Datei öffnen
while (std::getline(ifsDatei, strZeile)) { // Datei zeilenweiser eilesen
std::stringstream strstrmZeile(strZeile); // Stringstream zum Aufteilen
std::map<int, std::string> mSortierteString; // Container für sortierten String
GruppenDuplikat = false;
std::cout << strZeile << " -> ";
while(std::getline(strstrmZeile, strTeilstring, ']') && (Gefunden || !GruppenDuplikat)) { // Aufteilung in Substrings
strTeilstring += ']';
Gefunden = false;
for (auto const& [keyPosition, vTeilstrings] : mTeilstrings) { // Suche nach dem Substring in der Liste
auto it = std::find(vTeilstrings.begin(), vTeilstrings.end(), strTeilstring); // Suche nach dem Substring in der Gruppe
if (it != vTeilstrings.end()) {
Gefunden = true;
if (!mSortierteString.count(keyPosition)) { // falls kein Substring aus der gleichen Gruppe bereits im Container
mSortierteString.insert({keyPosition, strTeilstring}); // füge dem Container zu
}
else {
GruppenDuplikat=true;
std::cout << "Fehler: Gruppenmitglied bereits vorhanden! " << strTeilstring << " & " << mSortierteString[keyPosition] << std::endl;
break;
}
}
}
if ( !Gefunden ) { // falls ein unbekannter Substring
std::cout << "Fehler: unbekannter Substring " << strTeilstring << "!";
}
}
if (Gefunden && ! GruppenDuplikat ) // Ausgabe fehlerfreien sortierten String
for (const auto& [schluessel, wert] : mSortierteString) {
std::cout << wert;
}
std::cout << std::endl;
}
ifsDatei.close(); // Datei schließen
} else {
std::cerr << "Datei konnte nicht geöffnet werden." << std::endl;
return 1;
}
return 0;
}
Zu_Sortieren.txt
[8A][Dings da][Orange-Blau]
[MOD][Weiss][UKE]
[GF][MOD3][Dings da]
[MOD][Black][UKE]
[GF][MOD3][Dings da][GF][MOD3][Dings da]
Funktioniert noch nicht zufriedenstellend.
Was ich zum Verrecken nicht hinkriege, ist die Umschreibung der for-Schleife:
for (auto const& [keyPosition, vTeilstrings] : mTeilstrings) { // Suche nach dem Substring in der Liste
in eine while-Schleife, damit ich die Schleife nach dem ersten Fehler unterbrechen kann.
while(Iterator!=mTeilstring.end() && (Gefunden || !GruppenDuplikat)) {
...
}
Ich verstehe es einfach nicht (auch Googlen hiflt nicht ), wie kriege ich den keyPosition-Wert heraus.
Die etwas holprige Ausgabe sieht zur Zeit folgendermassen aus:
[8A][Dings da][Orange-Blau] -> [8A][Dings da][Orange-Blau]
[MOD][Weiss][UKE] -> [UKE][MOD][Weiss]
[GF][MOD3][Dings da] -> Fehler: Gruppenmitglied bereits vorhanden! [MOD3] & [GF]
[MOD][Black][UKE] -> Fehler: unbekannter Substring [Black] [UKE][MOD]
[GF][MOD3][Dings da][GF][MOD3][Dings da] -> Fehler: Gruppenmitglied bereits vorhanden! [MOD3] & [GF]
Fehler: Gruppenmitglied bereits vorhanden! [GF] & [GF]
Fehler: Gruppenmitglied bereits vorhanden! [MOD3] & [GF]
Fehler: Gruppenmitglied bereits vorhanden! [Dings da] & [Dings da]
Vielen Dank im Voraus!