Problem mit string-Vergleich



  • Ich möchte eine Textdatei zeilenweise einlesen und jede Zeile dann mit einem Wort vergleichen. Leider will es aber nicht funktionieren. Kann mir jemand weiterhelfen?

    void LoadLevel(LPCSTR MAP_NAME)
    {
    
    	char Puffer[256];	//Puffer für Zeilenaufnahme
    	FILE *MapDatei;	//Zeiger auf den .lvl File
    	MapDatei = fopen(MAP_NAME,"r"); //öffnet die Datei
    
    	while(!feof(MapDatei))
    	{
    		fgets(Puffer,255,MapDatei);
    
    			if(strcmp (Puffer, "ZuSuchendesWort") == 0)
    			{
    			MessageBox(0,"Gefunden","Suche",MB_OK);
    			}
    			else
    			{
    			MessageBox(0,NichtGefunden,"Suche",MB_OK);
    			}
    
    	}
    
    	fclose(MapDatei);	
    }
    


  • Böses Aua!
    Nimm std::string und vergleich dort dann mit ==. 🙂

    #include <string>
    using std::string;
    
    string x = "abcdefg"
    
    if (x == "abcdefg")   // ergibt true
        ;
    


  • Das funktioniert leider auch nicht. Wenn ich das Wort mit dem string aus der eingelesenen Zeile vergleiche, gibt es immer ein false.



  • Du kannst keinen Buffer mit ner konstanten Zeichenfolge oder einem anderen Buffer vergleichen. Dabei vergleichst du nur die Adressen und das Ergebnis ist Implementierungsabhängig.
    Du musst einen std::string konstruieren und den kannst du dann mit nem Buffer oder etwas anderem, aus dem sich ein string konstruieren lässt, vergleichen.



  • Wieso lässt du nicht mal nen Debugger drüberlaufen und schaust dir an was nach fgets() in Puffer steht. Ausserdem wäre deine Frage entsprechend deinem Code im C Forum wohl besser aufgehoben.



  • Hallo,

    Optimizer schrieb:

    Du kannst keinen Buffer mit ner konstanten Zeichenfolge oder einem anderen Buffer vergleichen. Dabei vergleichst du nur die Adressen und das Ergebnis ist Implementierungsabhängig.

    Es werden hier korrekt Zeichenfolgen verglichen, keine Zeiger.

    @5(0rP :

    du mußt bedenken, daß fgets auch das '\n'-Zeichen einliest, das du in deinem Vergleichsstring sicher nicht hast.

    MfG



  • was ist mit strcmp ?



  • [EDIT]Übereilig frage Falsch verstanden :p [/EDIT]



  • Probe-Nutzer schrieb:

    Hallo,

    Optimizer schrieb:

    Du kannst keinen Buffer mit ner konstanten Zeichenfolge oder einem anderen Buffer vergleichen. Dabei vergleichst du nur die Adressen und das Ergebnis ist Implementierungsabhängig.

    Es werden hier korrekt Zeichenfolgen verglichen, keine Zeiger.

    @5(0rP :

    du mußt bedenken, daß fgets auch das '\n'-Zeichen einliest, das du in deinem Vergleichsstring sicher nicht hast.

    MfG

    Ich hab ihm ja gesagt, er soll std::string und == verwenden. Wie er das gemacht hat, hat er nicht gepostet, deshalb hab ich mal vermutet, er hat sowas wie buffer == "uoisgdf" ausprobiert, weil er immer false kriegt.



  • Ja, ich habe die ausgelesene Zeile in den Buffer kopiert und dann mit == verglichen. Das ging nicht. (mit std::string)



  • Hallo,

    bitte poste doch einfach mal deinen Code. Irgendwie hört sich das alles zu kompliziert an.....



  • Hallo,

    da wir uns im Standard-C++ befinden, poste ich einfach mal eine Möglichkeit, wie man sie mit der Sprache eher implementieren würde:

    #include <iostream>
    #include <string>
    #include <fstream>
    using namespace std;
    
    int main()
    {
    ifstream file("datei.txt");
    
    string line;
    while(!file.eof())
    {
    getline(file, line);
    if(line == "string")
    [...]
    }
    
    return 0;
    }
    

    Sollte klappen.

    PS: Was für ein Rückgabewert ist das bei getline? Ich las oft, basic_istream, doch nichts Genaueres, worum handelt es sich in diesem Fall dabei? Ist das einfach das, was man als 1. Parameter übergeben hat?



  • Der erste Parameter ist der Stream aus dem es liest,
    könnte also auch cin sein während der zweite Parameter
    die Variable ist in der der Inhalt gespeichert wird.



  • Mis2com schrieb:

    PS: Was für ein Rückgabewert ist das bei getline? Ich las oft, basic_istream, doch nichts Genaueres, worum handelt es sich in diesem Fall dabei? Ist das einfach das, was man als 1. Parameter übergeben hat?

    Jo,
    damit kann man
    for(string line; getline(stream, line); )
    {
    bla();
    }
    machen



  • Ja genau, ich wollte das getline auch erst als while-Argument angeben...
    Aber wenn es der erste Parameter ist, ist das doch nie 0, auch wenn der Stream zu Ende ist, oder?



  • Mis2com schrieb:

    Aber wenn es der erste Parameter ist, ist das doch nie 0, auch wenn der Stream zu Ende ist, oder?

    statt if(!file.is_open())
    kannst du ja auch if(!file) schreiben.

    wenn du file also als bool ausdruck behandelst, returnt es die status - und der ist immer true, es sei denn ein fehler ist aufgetreten (fail bit gesetzt), dann ist es false.



  • ahso, ich verstehe, eof ist ein fail bit?


Anmelden zum Antworten