dateien auslesen_vergleichen_hier stimmt was nicht!?



  • hotspot schrieb:

    hier mal der code: wichtig sind die zeilen ab zeile 74...

    jaja.. schön dass wir so genau sehen, wo die zeile 74 ist...
    also.. dann schaun wir mal... 1 2 3 4 5 6 7 8 9 10 11 12 13 14 .... 😃 ganz schön anstrengend, wobei du die zeile mit einem kommentar markieren könntest 😉



  • habs geändert!!!

    aber AJ gab mir doch den tipp, den buffer zu initialisieren...und damit geht zumindest mal der vergleich zweier dateien problemlos!



  • initiallisieren kannst du es jedoch auch, ohne eine "0" hineinzuschreiben.
    einfach eine \0 an die erste stelle



  • erstmal vielen dak für den tipp mit dem filepointer...jetzt geht es!
    das mit dem initialiesieren hab ich aber jetzt nicht ganz geschnallt!
    wie meinst du das? wie mache ich das? ich dachte initialisieren heißt, mit nem bestimmten wert belegen...
    kannst du mir mal bitte die code-zeile verraten, die du meinst!

    danke



  • char test[]=""; // würde ein feld mit 1byte anlegen, wert: 0
    char test[]={0}; // würde auch ein feld mit 1 byte anlegen, wert: 0
    char test[]="0"; // würde ein feld mit 2 byte anlegen, wert= 48,0
    

    ... da du immer nur 1 zeichen einliest, würde ich vorschlagen, du verwendest eine der oberen 2 möglichkeiten.

    PS.: fread hängt kein \0 an; der zusätzliche speicher wird nicht benötigt
    der vergleich vergleicht nur die ersten bytes, dadurch wird die \0 halt ignoriert...

    nochwas: dein memcmp mit einem byte könntest du durch ein:
    (buffer_1==buffer_2)
    ersetzen.



  • mal abgesehen davon, dass es mehr schreibaufwand ist, was hätte das für einen vorteil?

    danke



  • (buffer_1==buffer_2)
    

    ist, soweit ich das erkennen kann etwas kürzer, und dürfte auch schneller als

    (memcmp(buffer_1, buffer_2, 1) != 0))

    ablaufen.

    und falls du das 1. meinst:

    char test[]="";
    
    char test[]="0";
    

    auch hier... mehr schreibaufwand? wohl kaum! speicherplatz? weniger benötigt. (zwar nur 2 bytes, aber ist doch schon ein anfang 😉 )

    mfG (c)h

    PS.: wenn du richtig gemeint, aber falsch bei mir angekommen ist, kannst du die vergleiche ignorieren


  • Mod

    gegen gepuffertes vergleichen ist nichts einzuwenden. aber du must dir dann nat. merken, wieviele bytes im jeweiligen lesevorgang gelesen wurden und nicht nur die totale anzahl (bez. du könntest das auch mit %1024 rekonstruieren).

    size_t read1, read2;
        do
        {
            read1 = fread( buffer1, 1, 1024, fp[ index1 ] );
            read2 = fread( buffer2, 1, 1024, fp[ index1 + 1 ] );
        }
        while( read1 && read1 == read2 && memcmp( buffer1, buffer2, read1 ) == 0 );
        cmp = read1 || read2;
    

    ein initialisieren des puffers ist hier gänzlich unnötig. falls dein algorithmus das erfordern sollte, ist wahrcheinlich ein logikfehler drin 😉



  • also wenn ich dich wäre würde ich so den code den du für 2 dateien hast, einfach in eine schleife packen die etwa so ist..

    int main(....){
    
    for(int counter=0;counter<argc;counter++){
    /*hier dein code*/
    //zu beachten:
    file_1 = argv[counter];
    file_2=argv[counter+1];
    
    //und zum schluss:
    if(nichtgleich){
    prinf("Leider nein");
    return 0;
    }
    }//ende der for
    
    prinf("identisch");
    return 0;
    }//end main
    


  • nickname (höhö, witzbold) schrieb:

    also wenn ich dich wäre würde ich ...

    ... erstmal deutsch lernen? 😃 :p



  • @chille07:

    ich meinte schon die sache mit dem buffer_1...

    aber eines verstehe ich jetzt nicht ganz!
    wenn ich

    if(x[index1] != x[index1+1] || /*(memcmp(buffer_1, buffer_2, 1) != 0 )*/(buffer_1==buffer_2) )
    			cmp = 1;
    

    mache, dann heißt das doch, er setzt cmp auf 1, wenn:

    - die anzahl der von fread eingelesenen zeichen unterschiedlich ist, d.h. die dateien also unterschiedlich lang sind, ODER
    - wenn buffer_1 GLEICH buffer_2 ist!

    aber wenn die beiden buffer gleich sind, soll er doch gerade NICHT cmp auf 1 setzen! oder sollte dein ausdruck mit den buffern woanders hin? sorry, aber ich glaub ich stehe heute morgen noch ein wenig auf dem schlauch!

    danke



  • *g* na dann.. (ich hab übersehen dass du auf ungleich abfragst)
    also:

    if(x[index1] != x[index1+1] || /*(memcmp(buffer_1, buffer_2, 1) != 0 )*/(buffer_1!=buffer_2) )
                cmp = 1;
    

    ist doch auch kein großes problem aus dem == ein != zu machen, oder?

    mfG (c)h



  • auch das hatte ich schon probiert, da testet er wieder falsch!!!
    also lasse ich es, so wie es ist!
    trotzdem danke!



  • [

    memcmp(buffer_1, buffer_2, 1) != 0 )==(buffer_1!=buffer_2)
    

    sind diese aussagen nicht äquivalent?

    mfG (c)h



  • anscheinend nicht, jedenfalls vergleicht er so falsch!



  • @ hotspot
    schau dir source von diff an http://ftp.gnu.org/pub/gnu/diffutils/diffutils-2.8.1.tar.gz
    steht aber unter gpl
    Hier steht sicher alles drin was mit datein vergleich zu tun hat drin! 😃

    mfg


Anmelden zum Antworten