String VON Datei mit String AUS Datei vergleichen



  • Hallo Leute!

    Ich habe eine kleine Frage..

    Unzwar habe ich eine Klasse gefunden, mit der ich den MD5 Hash einer Datei auslesen kann. Das klappt auch alles wie es soll.
    Nun hab ich ein Programm geschrieben, was den MD5 Hash von "Bla.log" errechnet/ausliest und dann in die Datei "Blub.log" schreibt.

    Nun möchte ich ein 2tes Programm schreiben, welches den MD5 Hash von "Bla.log" errechnet/ausliest und dann den Hash in der Datei "Blub.log" sucht.

    Somit kann ich sehen, ob die "Bla.log" verändert wurde.

    Wie mache ich das nun am besten?

    Den Hash errechne ich (mit der heruntergeladenen Klasse) so:

    md5wrapper md5;
    string hash = md5.getHashFromFile("Bla.log");
    

    Evtl. kennt ja jemand die Klasse, weiß nämlich leider nicht mehr wo genau ich die runtergeladen habe 😕

    Danke schonmal für die Hilfe!

    Mit freundlichen Grüßen
    Pinball

    ps: Hoffe habe es verständlich geschrieben und ich hoffe, der Threadname passt auch so einigermaßen.



  • Stichworte:
    fstream->Datei Operationen
    std::vectorstd::string -> Zum Speichern des Inhaltes deiner Hash-Datei.

    Hmm wasen noch?Sollte reichen.



  • Okay, ich sags mal noch einfacher.
    Er soll die letzte Zeile der "Blub.log" mit dem Hash der "Bla.log" vergleichen.
    Sollte beides das gleiche sein, gibt er ein "Okay" aus. Ansonsten ein "Verändert".

    Gibt es einen weg die letzte Zeile der "Blub.log" auszulesen?


  • Administrator

    Pinball schrieb:

    Gibt es einen weg die letzte Zeile der "Blub.log" auszulesen?

    Wenn du fixe Grössen in der Datei Blub.log hast, dann wäre das möglich, ansonsten nein.
    "Fixe Grössen" heisst zum Beispiel, wenn jede Zeile aus 34 Zeichen bestehen (32 für MD5 und 2 für \r\n). Dann startet die x-te Zeil beim Byte x*34. Mit std::istream::seekg kannst du dann zum enstprechenden Byte springen.

    Falls diese "Fixe Grössen" nicht vorhanden sind, musst du alles auslesen und so definieren, was die letzte Zeile ist. std::getline(std::istream&, std::string&) dürfte dir da behilflich sein.

    Referenz: http://www.cplusplus.com/reference/

    Grüssli



  • Hay, danke erstmal für deine Antwort!

    Doch doch, es sind "fixxe Grössen".
    Da ja der Hash immer gleich lang ist (32).
    Somit würde das klappen. Ich schau mal ob ichs hinkriege 😉



  • Wobei ich sagen muss, aus Erfahrung ist es besser/angenehmer die Daten temporär einzulesen und dann im Programm zu bearbeiten und nicht direkt in der Datei hin und her zu springen, auch wenn es nur "Ans-Ende" springen ist.



  • Und warum genau ist es 'besser/angenehmer'? 🙂



  • Weil du schon alleine was das suchen angeht, mit Standard-Container besser wegkommst als in der Datei rumzusuchen.Zum zweiten kannst du auch, fals es mal nötig ist, irgendwelche Aktionen(löschen,ersetzen,rausfiltern) mit Standard-Container leichter handhaben als in der Datei selber. So waren es zumindest meine Erfahrungen.



  • Okay, gut zu wissen. Aber ich kriege das sowieso nicht ganz hin.

    Ich möchte ja nur das er die allerletzte Zeile der Datei mit dem Hash meiner 'Bla.log' vergleicht.

    Er soll also nicht den Hash in der Blub.log suchen und ihn dann mit dem Hash von der Bla.log vergleichen, nein -> sondern er soll "die letzte Zeile" der Blub.log auslesen und prüfen ob das mit dem "string hash" übereinstimmt.

    Also quasi:

    if(hash == letzte_zeile_von_datei)
    {
    cout<<"Okay!";
    }
    else
    {
    cout"Verändert!";
    }
    

    Kann mir evtl. jemand ein Sample dazu geben?



  • Auch wenn es nicht ganz so ist wie du es dir vorstellst. Ließ die komplette Datei in einen std::vectorstd::string(eventuell) ein und durchsuche diesen nach deinem MD5 Hash den du vorher errechnet hast.



  • Ahhhh, jetzt klappt es! Danke für die gute Hilfe!! 😋


Anmelden zum Antworten