2016-10-29 3 views
1
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define BS 12 

void reverse(char * buffer, int size) 
{ 
    char tmp; 
    int i; 
    for(i = 0; i < size/2; i++) 
    { 
    tmp = (char)buffer[i]; 
    buffer[i] = buffer[size - i - 1]; 
    buffer[size - i - 1] = tmp; 
    } 
} 

int compare_bin(char * buffer, char * buffer2, int size) 
{ 
    // because strncmp is only for string without \x00, so there must be a customized compare function 
    int i; 
    for(i = 0; i < size; i++) 
    { 
    if(buffer[i] != buffer2[i]) 
     return 0; 
    } 
    return 1; 
} 

int main (const int argc, const char** argv) 
{ 
    if(argc != 3) 
    exit(-1); 

    int equal = 1; 
    char * buffer = malloc(BS), * buffer2 = malloc(BS); 
    FILE * f1, * f2; 
    f1 = fopen(argv[1], "r"); 
    f2 = fopen(argv[2], "r"); 

    fseek(f1, 0, SEEK_END); 
    fseek(f2, 0, SEEK_END); 

    long i = ftell(f1), j = ftell(f2); 
    if(i != j) 
    { 
    equal = 0; 
    goto endp; 
    } 

    fseek(f2, 0, SEEK_SET); 

    int need = 0; 
    int count; 
    int f2_pos = 0; 

    do 
    { 
    i = i - BS; 
    if(i < 0) 
    { 
     need = BS - abs((int)i); 
     i = 0; 
    } 
    else 
     need = BS; 

    fseek(f1, i, SEEK_SET); 
    count = fread(buffer, need, 1, f1); 

    reverse(buffer, count * need); 
    // fwrite(buffer, count * need, 1, f2); 
    fread(buffer2, need * need, 1, f2); 

    // printf("compare...\n"); 
    // for(int i = 0; i < need * count; i++) 
    // { 
    // printf("%02hhX", buffer[i]); 
    // } 
    // printf("\n"); 
    // for (int i = 0; i < need * count; i++) 
    // { 
    // printf("%02hhX", buffer2[i]); 
    // } 
    // printf("\n"); 


    if(compare_bin(buffer, buffer2, need * count) == 0) 
    { 
     equal = 0; 
     break; 
    } 

    f2_pos += need * count; 
    fseek(f2, f2_pos, SEEK_SET); 

    if(i == 0) 
     break; 
    }while(i > 0); 

    fclose(f1); 
    fclose(f2); 
    free(buffer); 
    free(buffer2); 

    endp: 
    if(equal) 
    return 0; 
    else 
    { 
    printf("2 files not equal is reversed order\n"); 
    return 1; 
    } 

    return 0; 
} 

Also schreibe ich ein Programm, um Dateiinhalt in umgekehrter Reihenfolge zu vergleichen. Ich habe bereits \x00 in Binärdatei berücksichtigt und strncmp wird nicht verwendet. Aber es gibt immer noch Fehler. Es gibt einen Testserver, um dieses Programm zu testen. Aber ich habe keinen Zugang dazu. Dieses Programm schlägt immer auf diesem Server fehl. Es muss also einige Sonderfälle geben, damit es scheitert. Irgendeine Idee?Sonderfälle beim Vergleichen von Dateien in umgekehrter Reihenfolge finden

Es gibt andere Möglichkeiten. Zum Beispiel, MD5 zu berechnen. Aber ich möchte das beheben.

+0

Wenn Sie mit Binärdateien arbeiten, verwenden Sie nicht den Modus "", sondern den Modus "rb", um Dateien zu öffnen. –

+0

Jack, du hast diese Frage jetzt mehrmals gestellt. Kann ich vorschlagen, bevor Sie weiter gehen, lesen Sie die man-Seiten für "fread" und die ähnliche "fwrite", wie Sie zuvor darauf hingewiesen wurden, dass die "Größe" und "Anzahl" Argumente umgekehrt sind? Und nach mehreren Beiträgen hast du immer noch einen "naiven Tippfehler?" –

+0

@ WeatherVane Entschuldigung. Ich habe den ganzen Tag programmiert. Ich bin sehr müde und habe naive Fehler gemacht. Ehrlich, das ist Tippfehler. Wenn dieser Typ seine Antwort abbricht, bin ich bereit, diesen Beitrag zu löschen. –

Antwort

1

Zum ersten Iteration, wo man Daten gelesen haben Sie

fread(buffer2, need * need, 1, f2); 

Das Problem ist, dass in diesem Fall need ist 12, die die Größe des Speichers für buffer2 zugeordnet ist, aber Sie fragen 12 * 12 lesen Bytes.

Wenn die zweite Datei groß genug ist, schreiben Sie außerhalb der Grenzen in den Speicher, was zu undefiniertem Verhalten führt. Wenn die Datei nicht groß genug ist, dann werden Sie nichts lesen.

Beachten Sie auch, dass die Reihenfolge der beiden mittleren Argumente zu fread Angelegenheit. Wenn Sie die Reihenfolge ändern, schreiben Sie außerhalb der Grenzen des Puffers, wenn die Datei größer als need * need ist oder nicht. Sie sollten wirklich count byte-sized Objekt lesen (das zweite Argument sollte 1 sein und das dritte sollte count sein, was natürlich bedeutet, dass Sie auch die Reihenfolge im ersten Aufruf ändern müssen).

Kurz gesagt, Ihre zwei fread Anrufe sollten

count = fread(buffer, 1, BS, f1); 
fread(buffer2, 1, count, f2); 

PS sein. Vergessen Sie nicht die Fehlerüberprüfung.

+0

oops. thx das 'need * need' ist mein Tippfehler –

Verwandte Themen