#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.
Wenn Sie mit Binärdateien arbeiten, verwenden Sie nicht den Modus "", sondern den Modus "rb", um Dateien zu öffnen. –
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?" –
@ 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. –