Zum Inhalt springen

C - fputs-Problem


TemplerX

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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; 

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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; 

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...