if (file.find("<"+type+">", pos) == -1 && file.find("<"+type+">", pos) < pos2)

kannaum

Mitglied
Ich hoffe der Titel passt so, denn ich dachte mir was ist beschreibender als das Problem selbst.
Hier mein Poblemcode:
Code:
string file = open_file("buecher.txt");
    int pos = file.find(name+"\">", 0);
    int pos2 = file.find("</buch titel=\""+name+"\">", pos);
    if (file.find("<"+type+">", pos) == -1 && file.find("<"+type+">", pos) < pos2) {
        save(name2, type, content2);
        return false;
    }
open_file und save sind jeweils 2 Funktionen von mir die alleine korrekt funktionieren.
Die Fehlermeldung sieht so aus:
comparison between signed and unsigned integer expression

Mein Code sollte folgendes machen:
Es soll geschaut werden ob <type> schon vorhanden ist und hinter einem anderen bestimmten Tag steht.
Wenn das zutrifft wird durch save ein neues Tag mit Inhalt erstellt.

Ich habe sozusagen eine XML-Nachmache geschrieben (ich weiß, sinnlos).

HIer eifnach noch der ganze Code der Funktion:
Code:
bool Api::update(QString name2, string type, QString content2) {
    string name = name2.toAscii().data();
    string content = content2.toAscii().data();
    string file = open_file("buecher.txt");
    int pos = file.find(name+"\">", 0);
    int pos2 = file.find("</buch titel=\""+name+"\">", pos);
    if (file.find("<"+type+">", pos) == -1 && file.find("<"+type+">", pos) < pos2) {
        save(name2, type, content2);
        return false;
    } else {
    int pos3 = file.find("<"+type+">", 0);
    int laenge = type.length();
    pos3 += laenge;
    pos3 += 2;
    int pos4 = file.find("</"+type+">", pos3);
    file.erase(pos3, pos4);
    file.insert(pos3, content);
    return true;
}
}

Und der AUfbau der Datei buecher.txt:
<buecher>
<buch titel="Qt 4.6">
<autor>
Jürgen WOlf
</autor>
<genre>
Sachbuch
</genre>
<erscheinungsdatum>
2010
</erscheinungsdatum>
</buch titel="Qt 4.6">
<buch titel="C++ von A bis Z">
<autor>
Jürgen Wolf
</autor>
<verlag>Galileo Computing</verlag>
</buch titel="C++ von A bis Z">
</buecher>

mfg
 
comparison between signed and unsigned integer expression

Diese Fehlermeldung besagt, dass du zwei Zahlen (Integer) vergleichst, wobei eins davon signed ist und der andere unsigned. (Jeder Integer ist automatisch signed, wenn du nicht unsigned davor stellst.)

Eigentlich ist es aber bei den meisten Compilern nur eine Warnung, das heißt es wird ignoriert.
Bei einigen Compilern gibt es aber die Option, Warnungen nicht zu ignorieren, also das dann doch nicht kompiliert wird.
 
Hi.

std::string.find gibt übrigens einen std::string::size_type zurück.

Und wenn nichts gefunden wird, gibt die Methode std::string::npos zurück und nicht -1.

Gruß
 
Probier mal folgendes:
C++:
if (int(file.find("<"+type+">", pos)) == -1 && file.find("<"+type+">", pos) < pos2) {
        save(name2, type, content2);
        return false;
    }
 
Probier mal folgendes:
C++:
if (int(file.find("<"+type+">", pos)) == -1 && file.find("<"+type+">", pos) < pos2) {
        save(name2, type, content2);
        return false;
    }

Bitte nochmal den Post von deepthroat lesen! Warum (statt zu casten) für die pos-Variablen denn nicht gleich den richtigen Datentyp, nämlich size_t (der übrigens unsigned int ist), verwenden? Außerdem ist der Vergleich mit -1 falsch - Es muss auf std::string::npos getestet werden:
C++:
if( file.find("<"+type+">", pos)) == std::string::npos && ... ) { ... }
Gruß
MCoder
 
Bitte nochmal den Post von deepthroat lesen! Warum (statt zu casten) für die pos-Variablen denn nicht gleich den richtigen Datentyp, nämlich size_t (der übrigens unsigned int ist), verwenden? Außerdem ist der Vergleich mit -1 falsch - Es muss auf std::string::npos getestet werden:
C++:
if( file.find("<"+type+">", pos)) == std::string::npos && ... ) { ... }
Gruß
MCoder

Sorry. Ich wollte nur den Fehler beheben.
Aber deine Lösung ist wohl besser ;)
 
Zurück