Einfaches verschlüsseln



  • Moin, Moin,
    zZ arbeite ich an einem kleinen Programm, das Textdateien verschlüsseln soll. dieses kann schon Buchstabe für Buchstabe eine Datei abschreiben, beim verändern der einzelnen Buchstaben haperts dabei. {Es ist ein alter Crypt-Algorithmus, den Ceasar schon vereinfacht verwendet hat.a=b;b=c...// bei mir wird integerwert des buchstaben um einen modifikator-summanden verändert}
    In der Testfunktion klappts schon, aber filecp() weigert sich mit einem modifikator zu schreiben

    der fehler könnte bei der parameterübergabe liegen, aber ich kann ihn nicht finden

    //mycrypt.cpp
    #include <stdio.h>
    #include <conio.h>     // getch
    #include <string.h>
    #include <ctype.h>
    #define END int q;scanf("%d",&q);return 1;//wartet auf eine abfrage vor dem schliessen
    FILE *orig, *target;
    void selectfiles(int r=0);
    int filecp(int *, int=0);
    char choose(const char *);
    
    long filesize (FILE *f) {
      long pos, laenge;
    
      pos = ftell (f);          // aktuelle Position des Dateizeigers
      fseek (f, 0L, SEEK_END);  // positioniert ans Ende der Datei
      laenge = ftell (f);
      fseek (f, pos, SEEK_SET); // setzt den Dateizeiger zurück
      return laenge;
    }
    
    inline char convert(int mod, char *c)
    {
             *c=*c+mod;
          return *c;
    }
    
    int test()
    {
    printf("testfunktion: ");
         int mod;
          char c;
    printf("\nchar: ");
          scanf("%c",&c);
    printf("\nmod: ");
           scanf("%d",&mod);
           printf("\nmodchar: %c\n",convert(mod,&c));
           END;
    }
    
    int main()
    {     
          char mode=choose("ABCDTO");
          int lng=0;
          switch(mode)
          {
          case 'A':{selectfiles();lng=filecp(&lng,0);}break;
          case 'B':{selectfiles();printf("\nmodifier: ");int a;scanf("%d",&a);lng=filecp(&lng,a);}break;
          case 'C':{selectfiles(1);lng=filecp(&lng,0);}break;
          case 'D':{selectfiles(1);printf("\nmodifier: ");int a;scanf("%d",&a);lng=filecp(&lng,a);}break;
          case 'T':test();
          case 'O': return 1;
          }
          printf("\n\nEs wurden %d von %d Zeichen geschrieben.",lng,filesize(orig));
          fclose(orig);
          fclose(target);
          END;
    }
    
    void selectfiles(int r)
    {
    char origname[24],cpname[24];
    while(!orig)
    {
                printf("Was: "); 
                scanf("%s",&origname); 
                printf("lesen...\n");
                if(!r)
                {
                      if(orig = fopen(origname,"rt"))printf("jope, gibs\n");
                      else printf("ooops,open-prob\n");
                }
                else
                {
                    if (orig = fopen(origname,"rb"))printf("jope, gibs\n");
                    else printf("ooops,open-prob\n");
                }
    }
    while(!target)
    {
                  printf("Wohin: "); 
                  scanf("%s",&cpname);
                  printf("schreiben...\n");
                  if(!r)
                  {
                        if(target=fopen(cpname,"w+b"))printf("new created");
                        else printf("schreibe-fehler, gibs schon?");
                  }
                  else
                  {
                       if(target=fopen(cpname,"w+t"))printf("new created");
                       else printf("schreibe-fehler, gibs schon?");
                  }
    }
    }
    int filecp(int *counter,int mod)
    {
    char puffer;
            while(puffer!=EOF)
            {
            puffer=fgetc(orig);
            printf("%c",convert(mod,&puffer));
            char crypt=convert(mod,&puffer);
            fputc(crypt,target);
            ++*counter;
            }
    return *counter;
    }
    
    char choose(const char *aw)
     {
      printf("Mode?\n\nA pure Copy\nB char+mod\n\n\n");
      printf("back2text\n\nC pure Copy\nD char+mod\n\n\n");
      printf("T test\nO aus\n\n");
      char z;
      do {
        z =  toupper (getch ());
        if (z == '\0')   
          getch ();      // nächstes Zeichen aus dem Tastaturpuffer holen
      }
      while (strchr (aw, z) == NULL);
    return z;
    }
    

    falls ich trotz blickes in die faq das falsche unterforum ausgewählt habe entschuldige ich mich



  • Jo, falsches Forum!
    Schleife in filecp() wird nicht ausgeführt
    In C kenn ich mich aber überhaupt nicht aus, vielleicht ist es besser so?

    int filecp(int *counter,int mod)
    {
            char puffer;
            do
            {
            puffer=fgetc(orig);
            if(puffer == EOF)
                    break;        
            //printf("%c",convert(mod,&puffer)); Sonst wir auch bei mod = 1 eine 'Verschluesselung' von 2 Stellen vorgenommen
            char crypt=convert(mod,&puffer);
            fputc(crypt,target);
            ++(*counter);
            }while(isalpha(puffer));
    return *counter;
    }
    

    Caipi



  • jo, danke für die hilfe, seit die überprüfung nicht mehr vor dem einlesen steht läufts besser.
    1. um keine doppelte verschlüsselung zu bekommen gebe jetzt direkt crypt aus
    2. da ich auch leerzeichen punkte etc verarbeiten möchte darf die bedingung sich nicht auf buchstaben beschränken => ...while(1);

    und zuletzt, was macht den nun meinen code nun nicht zu c++, auch wenn ich ihn wegen den vordefinierten parametern am anfang schon nicht mehr unter c verwenden kann?

    MfG Tyrannodogg



  • und zuletzt, was macht den nun meinen code nun nicht zu c++, auch wenn ich ihn wegen den vordefinierten parametern am anfang schon nicht mehr unter c verwenden kann?

    Tja... Eigentlich alles. 😉

    C-Header und -Funktionen (Input/Output, Dateizugriffe...)

    Caipi



  • ok ok, das werd ich mir dann noch anlesen, wie dass in reinem c++ aussieht...
    kannst du mir da ein tut empfehlen, dass einem schnell die unterschiede erklärt?

    und zum algorithmus:
    kann man irgendwie anders als durch einschränkungen beim modifikator verhindern, dass fputc() nicht zufällig inmitten des dokuments char(EOF) schreibt, was den integerwert von -1 hat?



  • Fuer den Anfang schaue mal unter:
    www.swiss-anime.ch
    unter manual/OOP hat es ein gutes webmanual von c zu c++

    oder unter www.c-plusplus.net 😃



  • danke für den tipp mit dem tut,

    so ich hab jetzt alle c-funtionen durch c++ funktionen ersetzt, allerdings funktionieren filesize(){ist immer -1} und filecp(&lng,a){schreibt nicht}, also das kopieren mit einem modifikator, nicht mehr. es wäre nett wenn da noch jemand einen blick drauf wirft

    //mycrypt.cpp
    #include <conio.h>     // getch
    #include <string.h>
    #include <ctype.h>
    #include <iostream.h> 
    #include <fstream.h>
    #define END int q;cin>>q;return 1;//wartet auf eine abfrage vor dem schliessen
    ifstream orig;
    ofstream target;
    void selectfiles(int r=0);
    int filecp(int *, int=0);
    char choose(const char *);
    
    long filesize () 
    {
      long pos, laenge;
      pos = orig.tellg();    
      orig.seekg(ios::end);
      laenge = orig.tellg();
      orig.seekg(pos); 
      return laenge;
    } 
    
    inline char convert(int mod, char *c)
    {
             *c=*c+mod;
          return *c;
    }
    
    int test()
    {
    cout<< "testfunktion: ";
         int mod;
          char c;
    cout<<"\nchar: ";
         cin>>c;
    cout<<"\nmod: ";
           cin>>mod;
           cout<<"\nmodchar: "<<convert(mod,&c)<<"\n";
           END;
    }
    
    int main()
    {     
          char mode=choose("ABCDTO");
          int lng=0;
          switch(mode)
          {
          case 'A':{selectfiles();lng=filecp(&lng,0);}break;
          case 'B':{selectfiles();cout<<"\nmodifier: ";int a;cin>>a;lng=filecp(&lng,a);}break;
          case 'C':{selectfiles(1);lng=filecp(&lng,0);}break;
          case 'D':{selectfiles(1);cout<<"\nmodifier: ";int a;cin>>a;lng=filecp(&lng,a);}break; 
          case 'T':test();
          case 'O': return 1;
          }
          long size=filesize();
          cout<<"\n\nEs wurden "<<lng<<" von "<<size<<" Zeichen geschrieben.";
          orig.close();
          target.close();
          END;
    }
    
    void selectfiles(int r)
    {
    char origname[24],cpname[24];
    
    while(1)
    {
                cout<<"\nWas: "; 
                cin>>origname; 
                cout<<"\nlesen...  :";
                if(!r)orig.open(origname);
                else orig.open(origname,ifstream::binary);
                if(orig.is_open()){cout<<"jope, gibs\n";break;}
                else cout<<"ooops,open-prob\n";
    }           
    while(1)
    {
                  cout<<"\nWohin: "; 
                  cin>>cpname;
                  cout<<"\nschreiben... :";
                  if(!r)target.open(cpname,ofstream::binary);
                  else target.open(cpname);
                  if(target.is_open()){cout<<"new created\n\n";break;}
                  else cout<<"schreibe-fehler, gibs schon?";
    }
    }
    
    int filecp(int *counter,int mod)
    {
            char puffer;
            do
            {
            puffer=orig.get();
            if(puffer == EOF)
                    break;        
            char crypt=convert(mod,&puffer);
            cout<<crypt;
            target.put(crypt);
            ++(*counter);
            }while(1);
    return *counter;
    }
    
    char choose(const char *aw)
     {
      cout<<"Mode?\n\nA pure Copy\nB char+mod\n\n\n";
      cout<<"back2text\n\nC pure Copy\nD char+mod\n\n\n";
      cout<<"T test\nO aus\n\n";
      char z;
      do {
        z =  toupper (getch ());
        if (z == '\0')   
          getch ();      // nächstes Zeichen aus dem Tastaturpuffer holen
      }
      while (strchr (aw, z) == NULL);
    return z;
    }
    


  • Nach dem aktuellen C++-Standard sind diese Header veraltet.
    Sie sollten so aussehen:

    // Nach aktuellem Standard C++-Standard-Header  ohne .h und im namespace std;
    #include <conio.h>     // Kein Standard-Header, deswegen bleibt das .h
    #include <string>
    #include <cctype> 
    #include <iostream>
    #include <fstream>
    
    using namespace std; // Im namespace std. (Weil die Funktionen und Objekte der Standard-Header im namespace std deklariert sind.)
    

    Caipi



  • schön, wieder was gelernt, danke
    sowohl die warnungen sind weg(vorher lies sich das programm sich nicht ohne sie kompilieren) als auch die schreibblockade von filecp(). bleibt jetzt nur noch filesize(), aber ich glaube, das kann ich auch alleine lösen, wenn ich ein bischen rumbastel
    mfg tyrannodogg


Anmelden zum Antworten