dateien auslesen_vergleichen_hier stimmt was nicht!?
-
chille07 schrieb:
du solltest den speicherbereich nur vergleichen, wenn beide bereiche gleich groß sind.
mfG (c)h
das macht er doch schon.
-
@AJ:
danke, das hat geholfen...jetzt macht erwenigstens schon mal einen teil von dem, was er soll!ich habe aber noch ein anderes problem:
ich möchte ja auch mehr als 2 dateien miteinander vergleichen können...
obwohl ich gleiche dateien erzeigt habe (3 *.txt) und in den debug-einstellungen mit eingebunden habe, erkennt er die gleichheit nicht!beim debuggen habe ich folgendes festgestellt:
er liest die ersten beiden dateien richtig ein...
er vergleicht die ersten beiden dateien richtig...beim zweiten durchlauf der äussersten for-schleife (ab zeile 74) wird NICHT in den buffer_1 geschrieben, aber in den buffer_2...
--> damit haben beide unterschiedliche länge, und die abbruchbedingung ist erfüllt!hab ich noch nen denkfehler, oder warum macht er das nicht?
wäre schön, wenn mir noch jemand helfen könnte.vielen dank schonmal!
hier mal der code: wichtig sind die zeilen ab zeile 74...
#include <stdio.h> #include <conio.h> #include <windows.h> //#include "my_color_console.h" //maximal 10 dateien vergleichbar #define max_dat 10 //ausgabe für gleiche dateien void gleich(void) { printf("\n\nDie Dateien sind "); // SetColor(FG_R | FG_Int); printf("gleich.\n"); // SetColor(FG_R | FG_G | FG_B | FG_Int); } //ausgabe für ungleiche dateien void ungleich(int a) { printf("\n\nDie Dateien sind "); // SetColor(FG_R | FG_Int); printf("nicht gleich.\n"); // SetColor(FG_R | FG_G | FG_B | FG_Int); printf("\nAbbruch der testung nach %d bytes.", a); } //main() int main(int argc, char *argv[]) { /* argv[0] enthält programmname (== compare_files.exe) argv[1] enthält dateiname_1 argv[2] enthält dateiname_2 ... */ //variablendefinition int x[max_dat], filesize[max_dat], index0, index1, cmp = 0, anzahl = 0; HANDLE hfile[max_dat]; FILE *fp[max_dat]; //SetColor(FG_R | FG_G | FG_B | FG_Int); anzahl = (argc-1); printf("anzahl der uebergebenen dateien: %d\n", anzahl); //gibt den pfad aller übergebenen dateien an for(index1 = 0; index1 < anzahl; index1++) { printf("\npfad von datei %.2d: %s", (index1+1), argv[index1+1]); } printf("\n"); //ermittelt die dateigröße in bytes for(index1 = 0; index1 < anzahl; index1++) { hfile[index1] = CreateFile(argv[index1+1], GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); filesize[index1] = GetFileSize(hfile[index1], NULL); printf("\ndateigroesse von datei %.2d: %d bytes", (index1+1), filesize[index1]); } //öffnet alle überegebenen dateien for(index1 = 0; index1 < anzahl; index1++) { fp[index1] = fopen(argv[index1+1],"rb"); } //***************** also hier ist zeile 72 ********************************** // liest alle übergebenen dateien zeichenweise ein und vergleicht sie for(index1 = 0; index1 < anzahl-1; index1++) { char buffer_1[] = "0"; char buffer_2[] = "0"; //länge auf null setzen for (index0 = 0; index0 < anzahl; ++index0) { x[index0]=0; } do { x[index1] += fread(buffer_1, 1, 1, fp[index1]); x[index1+1] += fread(buffer_2, 1, 1, fp[index1+1]); if(x[index1] != x[index1+1] || (memcmp(buffer_1, buffer_2, 1) != 0)) cmp = 1; } while(!feof(fp[index1]) && !feof(fp[index1+1]) && cmp == 0); } int a = x[0]; //ausgabe des vergleiches (cmp == 1) ? ungleich(a) : gleich(); //schließt alle übergebenen dateien wieder for(index1 = 0; index1 < anzahl; index1++) { fclose(fp[index1]); } printf("\n\nPress any key to exit!"); getch(); return 0; }
-
du solltest den dateipointer am beginn der forschleife an die anfangsposition setzen.
fseek(FILE*,0,SEEK_SET);
und die vorbelegung von
char buffer_1[] = "0";
würde ich weglassen.
mfG (c)h
-
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
-
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
-
ich meinte schon die sache mit dem buffer_1...
aber eines verstehe ich jetzt nicht ganz!
wenn ichif(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