TemplerX Geschrieben 4. September 2007 Teilen Geschrieben 4. September 2007 Hi, ich habe heute versucht ein Programm zu schreiben, indem ich meine mir alle Dateien in einem Verzeichnis ausgeben lassen kann (inkl. Pfad). Danach wollte ich sie über md5sum.exe miteinander vergleichen. Letzteres lief auch schoneinmal aber dann wollte ich mehr Es funktioniert (soweit ich das bisher beurteilen kann alles ausser die beiden fputs. Aber warum verstehe ich nicht. Wäre froh, wenn mir jemand helfen könnte. Hier der QT. if (argc==3) { strcpy (QPfadA,argv[1]); strcpy (QPfadB,argv[2]); strcpy (ZSP, DirAusl); strcat (ZSP, QPfadA); strcat (ZSP, " > ZSP1.txt"); system(ZSP); strcpy (CSP,DirCh); strcat (CSP,QPfadA); strcpy (ZSP,DirAusl); strcat (ZSP,QPfadA); ZSPF=(fopen("ZSP1.txt", "rw")); while(fgets(PfadA,256,ZSPF)) { chomp(PfadA); strcat (CSP,"\\"); strcat (CSP,PfadA); printf("2\n"); pruef=system(CSP); printf("%s\n\n",CSP); if (pruef==0) { strcat (ZSP,"\\"); strcat (ZSP,PfadA); strcat (ZSP, " > Ord.txt"); system (ZSP); printf("%s\n",ZSP); ZSPOrd=(fopen("Ord.txt", "rw")); while(fgets(PfadB,256,ZSPOrd)) { chomp(PfadB); printf("\n%s Hier ist PfadB\n",PfadB); strcpy (PfadC,PfadA); strcat (PfadC,"\\"); strcat (PfadC, PfadB); printf("\n%s Hier ist PfadC\n",PfadC); fputs(PfadC,ZSPF); } fclose(ZSPOrd); } if (pruef==1) { ZSPDat=(fopen("Dat.txt", "rw")); fputs(PfadA,ZSPDat); fclose(ZSPDat); printf("1 %s\n",PfadA); } strcpy (CSP,DirCh); strcat (CSP,QPfadA); strcpy (ZSP,DirAusl); strcat (ZSP,QPfadA); } fclose(ZSPF); } MfG Sebastian Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carstenj Geschrieben 4. September 2007 Teilen Geschrieben 4. September 2007 Hi, also erstens: Geht nicht reicht nicht - Was genau funktioniert nicht wie gewollt? Zweitens: Da du so extrem viel mit strcpy und strcat rumhantierst, sind Fehler eigentlich vorprogrammiert. Wahrscheinlich werden irgendwo irgendwelche Grenzen nicht eingehalten. Damit du dieses Problem zumindest minimieren kannst, nutze stattdessen strncpy und strncat: strncat(3): concatenate two strings - Linux man page strncpy(3): copy string - Linux man page Achja, und evtl. mal ein kompilierbares Beispiel posten, denn dein QT ist schon sehr unübersichtlich und schlecht formatiert. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TemplerX Geschrieben 4. September 2007 Autor Teilen Geschrieben 4. September 2007 Hi, sorry für die Formatierung aber leider nimmt er alle Leerzeichen usw. raus. Um das Problem nochmal zu spezifizieren, die fputs()-Anweiseungen werden einfach übergangen, also nicht ausgeführft. Vorgegeben hierfür ist eine Dat.txt, eine Ord.txt und eine ZSP1.txt. Wo ist denn das Problem mit strcat und strcpy ? Ist leider nur mein Schul-C und jetzt brauchte ich ein Programm und versuchte es aus meinen Erinnerungen und mit einigen Online-Hilfen bauen. MfG Templer #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <io.h> #include <sys\stat.h> #define TPL fflush(stdin); void chomp(char *str) { size_t p=strlen(str); str[p-1]='\0'; } int main(int argc, char *argv[]) { FILE *ZSPF, *ZSPDat, *ZSPOrd, *ZSPT; char DirAusl[10] = "dir /b "; char DirCh[10] = "cd "; char QPfadA[256]; char QPfadB[265]; char PfadA[256]; char PfadB[256]; char PfadC[256]; char ZSP[290]; char CSP[290]; int txt1=0; int txt2=0; int pruef=0, OrdVorh=0; int i,zaehl=0; char a[33] = {0}; char b[33] = {0}; char a1[33] = {0}; char b1[33] = {0}; char MD5QPfadA[300] = "md5sum.exe "; char MD5QPfadB[300] = "md5sum.exe "; int c=0; TPL; if (argc==3) { strcpy (QPfadA,argv[1]); strcpy (QPfadB,argv[2]); strcpy (ZSP, DirAusl); strcat (ZSP, QPfadA); strcat (ZSP, " > ZSP1.txt"); system(ZSP); strcpy (CSP,DirCh); strcat (CSP,QPfadA); strcpy (ZSP,DirAusl); strcat (ZSP,QPfadA); ZSPF=(fopen("ZSP1.txt", "rw")); while(fgets(PfadA,256,ZSPF)) { chomp(PfadA); strcat (CSP,"\\"); strcat (CSP,PfadA); printf("2\n"); pruef=system(CSP); printf("%s\n\n",CSP); if (pruef==0) { strcat (ZSP,"\\"); strcat (ZSP,PfadA); strcat (ZSP, " > Ord.txt"); system (ZSP); printf("%s\n",ZSP); ZSPOrd=(fopen("Ord.txt", "rw")); while(fgets(PfadB,256,ZSPOrd)) { chomp(PfadB); printf("\n%s Hier ist PfadB\n",PfadB); strcpy (PfadC,PfadA); strcat (PfadC,"\\"); strcat (PfadC, PfadB); printf("\n%s Hier ist PfadC\n",PfadC); fputs(PfadC,ZSPF); } fclose(ZSPOrd); } if (pruef==1) { ZSPDat=(fopen("Dat.txt", "rw")); fputs(PfadA,ZSPDat); fclose(ZSPDat); printf("1 %s\n",PfadA); } strcpy (CSP,DirCh); strcat (CSP,QPfadA); strcpy (ZSP,DirAusl); strcat (ZSP,QPfadA); } fclose(ZSPF); } else { printf("Zu wenig oder zu viele Parameter!\n md5v.exe Datei1 Datei2"); } return 0; } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carstenj Geschrieben 4. September 2007 Teilen Geschrieben 4. September 2007 Hi, mal überprüft, welchen Wert "pruef" tatsächlich hat? Weil 0 oder 1 ist es offensichtlich nicht. BTW: #define TPL fflush(stdin); ist undefiniert: C/C++ Forum :: fflush(stdin); ?? Wo ist denn das Problem mit strcat und strcpy ? Das Problem ist, dass so viele Zeichen kopiert werden, bis ein \0 gefunden wird, selbst wenn nicht so viel Platz reserviert wurde. D.h. im ungünstigsten Fall wird in unreservierten Speicherbereich geschrieben, was undefiniertes Verhalten erzeugt. Undefiniertes Verhalten ist schlimm, weil es funktionieren kann, aber eben nicht muss. Solche Fehler sind immer schwer zu finden, da man sie oftmals gar nicht gezielt nachstellen kann. Daher würde ich eben die n-Varianten bevorzugen, weil man da angeben soll, wie viele Zeichen kopiert bzw. zusammengefügt werden. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TemplerX Geschrieben 4. September 2007 Autor Teilen Geschrieben 4. September 2007 Hi, genau das ist mein Problem, denn diese Ausgabe "printf("\n%s Hier ist PfadB\n",PfadB);" bzw. die darauf folgende habe ich eingefügt um zu sehen, bis wohin ich komme. Beide werden auch korrekt ausgegeben nur der fputs() wird jeweils nicht ausgeführt. Ich habe heute schon eine ganze Weile überlegt, komme aber einfach nicht weiter... btw. ich arbeite mit DEV C++ (schreibe aber ein C-Prog) in Version 4.9.9.2. MfG Templer Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 5. September 2007 Teilen Geschrieben 5. September 2007 Was soll das "rw" bei fopen bewirken? Die erlaubten Mode-Strings findest du z.B. hier: fopen. Es wäre auch von Vorteil, wenn du deinen Programm zumindest rudimentäre Fehlerbehandlung spendieren würdest. fputs beispielsweise hat einen Rückgabewert, den du prüfen kannst. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TemplerX Geschrieben 5. September 2007 Autor Teilen Geschrieben 5. September 2007 Hi, bei rw dachte ich es wäre das Selbe wie r+. Allerdings half das nicht Ich arbeite ja die ZSP1.txt (mit fgets() ) durch und versuche dann in einer der unteren Schleifen mit fputs() "gleichzeitig" etwas anzuhängen. Verursacht das vllt. den Fehler ? Der Rückgabe wert von "fputs(PfadC,ZSPF);" ist 0 also auch in Ordnung. Es wird aber nicht ausgeführt. Nun habe ich aber anscheinend noch ein weiteres Problem, ich gebe mir meine erste Ordnerstruktur über Umlenkung in ZSP1.txt aus. Hier schreibt er alle rein (Test2, Test3, Text1.txt, Text2.txt, Text3.txt) aber er arbeitet nur die beiden Folder sowie Text3.txt in der Schleife ab. Mfg Templer #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <io.h> #include <sys\stat.h> #define TPL fflush(stdin); void chomp(char *str) { size_t p=strlen(str); /* '\n' mit '\0' überschreiben */ str[p-1]='\0'; } int main(int argc, char *argv[]) { FILE *ZSPF, *ZSPDat, *ZSPOrd, *ZSPT; char DirAusl[10] = "dir /b "; char DirCh[10] = "cd "; char QPfadA[256]; char QPfadB[265]; char PfadA[256]; char PfadB[256]; char PfadC[256]; char ZSP[290]; char CSP[290]; int txt1=0; int txt2=0; int pruef=0, OrdVorh=0; int i,zaehl=0; char a[33] = {0}; char b[33] = {0}; char a1[33] = {0}; char b1[33] = {0}; char MD5QPfadA[300] = "md5sum.exe "; char MD5QPfadB[300] = "md5sum.exe "; int c=0; TPL; if (argc==3) { system("echo. > Ord.txt"); system("echo. > Dat.txt"); strcpy (QPfadA,argv[1]); strcpy (QPfadB,argv[2]); strcpy (ZSP, DirAusl); strcat (ZSP, QPfadA); strcat (ZSP, " > ZSP1.txt"); system(ZSP); strcpy (CSP,DirCh); strcat (CSP,QPfadA); strcpy (ZSP,DirAusl); strcat (ZSP,QPfadA); ZSPF=(fopen("ZSP1.txt", "r+")); while(fgets(PfadA,256,ZSPF)) { chomp(PfadA); strcat (CSP,"\\"); strcat (CSP,PfadA); printf("2\n"); pruef=system(CSP); printf("%s\n\n",CSP); if (pruef==0) { strcat (ZSP,"\\"); strcat (ZSP,PfadA); strcat (ZSP, " > Ord.txt"); system (ZSP); printf("%s\n",ZSP); ZSPOrd=(fopen("Ord.txt", "r+")); while(fgets(PfadB,256,ZSPOrd)) { chomp(PfadB); //printf("\n%s Hier ist PfadB\n",PfadB); strcpy (PfadC,PfadA); strcat (PfadC,"\\"); strcat (PfadC, PfadB); //printf("\n%s Hier ist PfadC\n",PfadC); [COLOR="Red"][B]fputs(PfadC,ZSPF);[/B][/COLOR] } fclose(ZSPOrd); } [COLOR="red"][I] if (pruef==1) { ZSPDat=(fopen("Dat.txt", "r+")); strcat(PfadA, "\n"); [B]fputs(PfadA,ZSPDat);[/B] printf("1 %s\n",PfadA); chomp(PfadA); fclose(ZSPDat); }[/I][/COLOR] strcpy (CSP,DirCh); strcat (CSP,QPfadA); strcpy (ZSP,DirAusl); strcat (ZSP,QPfadA); } fclose(ZSPF); } else { printf("Zu wenig oder zu viele Parameter!\n md5v.exe Datei1 Datei2"); } return 0; } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 5. September 2007 Teilen Geschrieben 5. September 2007 Ich arbeite ja die ZSP1.txt (mit fgets() ) durch und versuche dann in einer der unteren Schleifen mit fputs() "gleichzeitig" etwas anzuhängen. Wenn du anhängen willst, solltest du "a+" benutzen. Sonst schreibst du an den Anfang der Datei. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TemplerX Geschrieben 5. September 2007 Autor Teilen Geschrieben 5. September 2007 Hi, habe ich auch schon versucht... Das einzige Problem scheint zu sein, dass "fputs(PfadC,ZSPF);" nicht funktioniert. Das verursacht dann noch einige weitere Fehler. Z.B. überspringt er deswegen Zeilen in der ZSP1.txt. Daher nochmal meine Frage: Ich arbeite ja die ZSP1.txt (mit fgets() ) durch und versuche dann in einer der unteren Schleifen mit fputs() "gleichzeitig" etwas anzuhängen. Verursacht das vllt. den Fehler ? Oder ist das kein Problem ? Ich kann auch einmal versuchen alles hier hochzuladen, damit man das kompilieren kann (inkl. der selben U-Ordner-Struktur usw. Mfg Templer Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 5. September 2007 Teilen Geschrieben 5. September 2007 Ich arbeite ja die ZSP1.txt (mit fgets() ) durch und versuche dann in einer der unteren Schleifen mit fputs() "gleichzeitig" etwas anzuhängen. Verursacht das vllt. den Fehler ? Das scheint der Fall zu sein. Ich mache nicht genug mit C, dass ich das mit Sicherheit sagen könnte, aber es wäre wohl besser, wenn du das aufteilst. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carstenj Geschrieben 5. September 2007 Teilen Geschrieben 5. September 2007 Hi, also bei mir funktioniert das: while(fgets(PfadB,256,ZSPOrd)) { chomp(PfadB); //printf("\n%s Hier ist PfadB\n",PfadB); strcpy (PfadC,PfadA); strcat (PfadC,"\\"); strcat (PfadC, PfadB); //printf("\n%s Hier ist PfadC\n",PfadC); fputs(PfadC,ZSPF); } Das Puts schreibt in die Datei den Pfad. Das Problem war das fehlende a+. Allerdings hängt es das denn eben bei jedem Schleifendurchlauf an. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TemplerX Geschrieben 5. September 2007 Autor Teilen Geschrieben 5. September 2007 Hmm bei mir hängt er da leider nichts an... was heißt er hängt sich auf, stürzt bei dir das Programm ab ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carstenj Geschrieben 5. September 2007 Teilen Geschrieben 5. September 2007 Noe, ich meinte er hängt den PfadC bei jeden Schleifendurchlauf an die Datei an. Ändere doch einfach mal den die Zeile fputs(PfadC,ZSPF); in fputs("TESTEINTRAG",ZSPF); und guck, ob das funktioniert. Oder pack die puts zweil ganz an den Anfang deiner Schleife um zu gucken, ob es da funktioniert. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TemplerX Geschrieben 5. September 2007 Autor Teilen Geschrieben 5. September 2007 So sollte es auch sein, er sollte die einzelnen Zeilen an aus ZSPOrd and ZSPF anhängen, aber das wird bei mir nichts. Auch auf die anderen beiden Weisen nicht. Habe allerdings gerade gehört, dass sich die Aufgabe erledigt hat. Trotzdem vielen Dank Mfg Templer Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carstenj Geschrieben 5. September 2007 Teilen Geschrieben 5. September 2007 Hi, Habe allerdings gerade gehört, dass sich die Aufgabe erledigt hat. der Strebsame sollte sich aber trotzdem dafür interessieren, wieso das nicht funktioniert.... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.