einfach zu implementierende diff klasse für c++ mit .net gesucht



  • Hi! (ich hoffe, das ist das richtige forum)

    wie das topic schon sagt, ich suche eine einfach zu implementierende diff-klasse/funktion für c++ mit .net. hab mich jetzt schon 3 tage totgegoogelt, finde immer nur sachen für c# oder vb, oder sachen, die tief in irgendwelchen projekten drinstecken. bin leider nicht so der überflieger, dass ich mir das selber basteln könnte.

    vielen dank schonmal für eure antworten.

    p.s.: diff=vergleich von 2 text-dateien/chararrays und ausgabe der unterschiede



  • Zeig mal was Du bis jetz probiert hast...



  • mein letzter ansatz war, mir die longest common subsequence ausgeben zu lassen,
    und das ergebnis vom 2. file zu subtrahieren. aber dabei kommt nur mist raus.
    hier das snipplet:

    puf1=prevfile;
    puf2=actfile;
    cd = LCS(puf1,puf2);
    sprintf(changedummy,"%s",cd);
    //gleiches vom original subtrahieren
    int n = strlen(puf2);
    int m = strlen(changedummy);
    int	q = 0, r = 0;
    for(int p=0;p < n;p++) {
    if (actfile[p] != changedummy[q]) {
    	changelog[r] = actfile[p];
    	r++;
    	}
    else {
    	q++;
    }
    
    }
    

    p.s.:der lcs algorithmus funktioniert, meiner überprüfungen nach, einwandfrei..
    p.p.s:ich brauche wirklich nur die reinen unterschiede, nichts ausgefuchstes mit zeilenangaben o.ä.



  • Für diesen Code ist das das falsche Forum: Ansi C wäre besser.



  • Ich würde das auf die schnelle so machen:
    1. beide dateien einlesen und in einem geeigneten container (z.B. in iso C++ std::vector<unsigned char> od. in C ein unsigned char[] od. in .NET ein System.Byte[]) bereithalten .
    2. Zeichenweise vergleichen und die Unterschiede sammeln und in geeigneter weise in einen container ablegen.
    3. Ausgabe der gesammelten differenzen. z.B. Bildschirm od. Datei.

    Benötigst Du eigentlich diese Funktionalität in deinen eigenen Code od. versuchst Du ein Tool zu bauen, welches das kann (weil das würde es natürlich schon geben)....



  • hm ok, kanns dann ein mod bitte verschieben?



  • es geht um den inhalt von html-dateien. wenn ich "rein" zeichenweise vergleiche:

    1. file: <html><head><aenderung><a ...
    2. file: <html><head><a href><...
    ---------------------------^^
    sieht man schon gleich, an welcher stelle es haken wird.



  • wiegesagt, rein zeichenweise würde bei meinem beispiel etwas derartiges ergeben:
    1. file: <html><head><aenderung><a ...
    2. file: <html><head><a href><...
    ergebnis: enderung><a ... und alles was danach kommt
    rauskommen sollte aber <aenderung>

    ich weiß, dass es solche tools gibt, benötige es im eigenen code.



  • ja, dann darfst du nicht zeichenweise vergleichen, sondern element weise...
    ich habe im hinterkopf, dass es sowas für xml schon gibt.

    Ansonsten das XML Notepad kann das:
    http://www.microsoft.com/downloads/details.aspx?familyid=72d6aa49-787d-4118-ba5f-4f30fe913628&displaylang=en
    (Ist ein .NET Programm und du könntest es reverse Engineeren mit dem Reflector)



  • Ansonsten:
    Einlesen, splitten in Elemente und dann die Elemente vergleichen.



  • bevor ich mich ins reverse engineering stürze 😉
    lass uns doch mal kurz bei meinem eigentlichen (und letzen in diesem programm) problem bleiben:

    ich habe 2 char-arrays oder von mir aus auch String^s, mit fast identischem inhalt. ich möchte den einen string von dem anderen "subtrahieren". wieso klappt das nicht, bzw, was wäre ein guter weg, DASS es klappt?



  • vielleicht sollte ich meine frage in obiger form umformuliert nochmal neu im ansi-c stellen... was sagen die mods dazu?



  • lass die frage doch hier.. die wird dann schon verschoben.

    Was möchtest du denn dass hier herauskommt?
    1. file: <html><hasdfad><a href><...
    2. file: <html><head><a href><...

    soll dabei <hasdfad> rauskommen?



  • also ich habe ja bereits die lcs davon, die so aussehn würde:
    <html><a href><...

    würde nun gerne file1 minus lcs und file2 minus lcs machen, ideales ergebnis:
    file1: <hasdfad>
    file2: <head>



  • wie gesagt, dann würde ich die dateien einlesen, in elemente splitten (speratoren sind < und >) und dann die elemente vergleichen.

    1. file: <html><hasdfad><a href><...
    2. file: <html><head><a href><...
    lcs str: <html><h

    lcs str ist der substring von character 0 bis lcs.
    habe ich das korrekt verstanden?



  • nein, (oder ich habe dich jetzt falsch verstanden) lcs = longest common subsequence, ist das, was in beiden dateien gleich ist. also:
    string1 = "der hund rennt sehr gerne schnell"
    string2 = "der hund beisst sehr oft"
    lcs = "der hund sehr"

    string1-lcs = "rennt gerne schnell"
    string2-lcs = "beisst oft"

    das subtrahieren müßte eigentlich mit der for-schleife, die ich anfangs geschrieben habe, funktionieren, da die lcs ja "geordnet" ist. da es nicht funktioniert, tippe ich eher auf eine art typecast-problem, o.ä.



  • oder ich zähle falsch



  • ja, ok, dann halt von hinten her:

    1. file: <html><hasdfad><a href><...
    2. file: <html><head><a href><...
    1. lcs: asdfad><a href><...

    ??



  • ne, der lcs wäre in dem fall wieder:
    lcs: <html><a href><...

    lcs schmeisst genau das raus, was NICHT in beiden dateien drin ist, und behält den rest. und genau das muß ich "invertieren"



  • oder du meintest 1.string-lcs, das wäre in deinem beispiel <hasdfad> und das gewünschte ergebniss


Anmelden zum Antworten