tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Bratkartoffel
ERLEDIGT
JA
ANTWORTEN
8
ZUGRIFFE
788
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Punish Punish ist offline Grünschnabel
    Registriert seit
    May 2010
    Beiträge
    4
    Guten Morgen,

    Ich möchte gerne einen Caesar Verschlüsselung nur mit Buchstaben schreiben.
    Soweit so gut. Nun habe ich den Code schon. Allerdings soll das ganze als *.txt Datei ausgegeben werden, wo auch schon mein Problem ist.

    Die Ausgabe mit cout klappt. <- d.h. der Code funktioniert!
    Die Ausgaebe als *.txt klappt nicht <- Was ist da falsch ?

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    
    #include <iostream>
    #include <string>
     
    using namespace std;
     
     
      FILE *hostdatei; 
      string text = "Hello agian";
        
        
    string CaesarCipher(string str, int gap)
    {
        char lower_last = 'z' - gap;
        char upper_last = 'Z' - gap;
        
        for (unsigned int i = 0; i < str.length(); i++)
        {
            if ((str[i] >= 'a' && str[i] <= lower_last) || (str[i] >= 'A' && str[i] <= upper_last))
                str[i] += gap; 
            else if (str[i] >= lower_last && str[i] <= 'z')
                str[i] = 'a' + str[i]-lower_last-1;
            else if (str[i] >= upper_last && str[i] <= 'Z')
                str[i] = 'A' + str[i]-upper_last-1;
        }
        return str;
    }
     
     
     
     
    int main()
    {
      int gap = 4;
     
      string encrypted = CaesarCipher(text, gap);
      
      hostdatei = fopen("C:\\encode.txt","w");
      fprintf(hostdatei,"encode\n\n  %s ", encrypted); 
      fclose(hostdatei);
      
     
      string decrypted = CaesarCipher(encrypted, 26-gap);
      
      hostdatei = fopen("C:\\decode.txt","w");
      fprintf(hostdatei,"decode\n\n  %s ", decrypted ); 
      fclose(hostdatei);
       
       system("PAUSE");
       return 0;
    }
    Quelle des Orginalcodes

    Meine Fehlermeldung
    Code :
    1
    2
    
    39 [Warning] cannot pass objects of non-POD type `struct std::string' through `...'; call will abort at runtime 
    46 [Warning] cannot pass objects of non-POD type `struct std::string' through `...'; call will abort at runtime

    Wie muss ich encrypted und decrypted denn Ausgeben oder was sagt mir die Fehlermeldung ?

    Gruß Punish
     

  2. #2
    Avatar von Bratkartoffel
    Bratkartoffel Bratkartoffel ist offline gebratene Kartoffel
    tutorials.de Premium-User
    Registriert seit
    Jun 2007
    Ort
    Passau (Niederbayern)
    Beiträge
    1.394
    Guten Morgen,

    soweit ich es noch richtig im Kopf habe, funktioniert die fprintf()-Funktion nur mit primitiven Datentypen, also nicht mit einem String.
    Wandle mal deinen String mit Hilfe der c_str()-Methode um und gib das Ergebnis aus.

    Beispiel:
    Code cpp:
    1
    
    fprintf(hostdatei,"encode\n\n  %s ", encrypted.c_str());

    Gruß
    BK
    Punish bedankt sich. 
    Über eine gute Bewertung freut sich jeder ;)
    Bitte erledigte Threads als "Erledigt" markieren.

    "Though a program be but three lines long, someday it will have to be maintained.''
    -- Geoffrey James, "The Tao of Programming"

  3. #3
    OnlyFoo OnlyFoo ist offline Mitglied Brokat
    Registriert seit
    Feb 2005
    Beiträge
    470
    Die besserer Lösung ist: Erzeuge dir eine Instanz von std::ofstream und benutze sie genau so wie std::cout:

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    
    #include <fstream>
     
    ofstream out( "bla.txt" );
     
    // Ab hier genau wie 'cout'
    out << "encode" << endl << endl;
    out << encoded << endl;
    out.close()
     

  4. #4
    Crash Kid Crash Kid ist offline Mitglied Gold
    Registriert seit
    Jan 2009
    Beiträge
    147
    Du kannst das ganze auch mit nur fstream machen.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    #include <fstream>
     
    ...
     
    fstream fDatei;
    char cBuffer[512];
     
    ...
     
    fDatei.open("irgendwas.txt", ios::out);
    fDatei.write(cBuffer, sizeof(cBuffer));
    fDatei.close();
     
    ...
    Geändert von Crash Kid (19.05.10 um 20:20 Uhr)
     
    Wenn meine Antwort nützlich bzw. hilfreich war, würde ich mich sehr über eine Bewertung bzw. ein Danke sehr freuen.

    Danke euch


    Programmiere in C, C++ auf Windows XP, Vista und Windows 7
    Spezialisiert auf Netzwerkprogrammierung, WinAPI uvm.

  5. #5
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von Crash Kid Beitrag anzeigen
    Du kannst das ganze auch mit nur fstream machen.
    Ja, das könnte man. Aber warum nicht std::ofstream nehmen?
    Zitat Zitat von Crash Kid Beitrag anzeigen
    Code :
    1
    2
    
    fDatei.open("irgendwas.txt", ios::in);
    fDatei.write(cBuffer, sizeof(cBuffer));
    Das wird so nichts. Du öffnest die Datei zum Lesen und versuchst dann zu schreiben...

    std::fstream ist sinnvoll wenn man Lesen und Schreiben gleichzeitig möchte.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  6. #6
    Crash Kid Crash Kid ist offline Mitglied Gold
    Registriert seit
    Jan 2009
    Beiträge
    147
    Oh, sorry. Kleiner Tippfehler. Hab es ausgebessert.


    danke

    grüße
     
    Wenn meine Antwort nützlich bzw. hilfreich war, würde ich mich sehr über eine Bewertung bzw. ein Danke sehr freuen.

    Danke euch


    Programmiere in C, C++ auf Windows XP, Vista und Windows 7
    Spezialisiert auf Netzwerkprogrammierung, WinAPI uvm.

  7. #7
    kickerxy123 kickerxy123 ist offline Mitglied Gold
    Registriert seit
    Mar 2008
    Beiträge
    147
    Auf jeden Fall sollte man aber noch das erfolgreiche Öffnen der Datei überprüfen:

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    ofstream mo("bla.txt",ios::trunc);
    if(!mo)
    {
    mo.close();
    return 0;
    }
    mo << "write sth." << endl;
     
    mo.close();

    Hinweis: Das Flag "trunc" sorgt dafür, dass die Datei "bla.txt" erstellt wird, sofern nicht vorhanden oder aber den bisherigen content komplett löscht
     
    hilfreiche Antwort? Es gibt einen Danke-Button ;)
    Rettet das Internet!

  8. #8
    Crash Kid Crash Kid ist offline Mitglied Gold
    Registriert seit
    Jan 2009
    Beiträge
    147
    Ja klar das auch. Kann man ja auch

    Bei fstream wäre das mit der Funktion:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    ...
     
    if(fDatei.good())
    {
        //Wenn die Datei geöffnet werden konnte
    }
    else
    {
        //Wenn sie nicht geöffnet werden konnte
    }
     
    ...
     
    Wenn meine Antwort nützlich bzw. hilfreich war, würde ich mich sehr über eine Bewertung bzw. ein Danke sehr freuen.

    Danke euch


    Programmiere in C, C++ auf Windows XP, Vista und Windows 7
    Spezialisiert auf Netzwerkprogrammierung, WinAPI uvm.

  9. #9
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von Crash Kid Beitrag anzeigen
    Bei fstream wäre das mit der Funktion:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    ...
     
    if(fDatei.good())
    {
        //Wenn die Datei geöffnet werden konnte
    }
    else
    {
        //Wenn sie nicht geöffnet werden konnte
    }
    Die Bits abzufragen ist meist unsinnig. Obwohl es in dem Fall sogar funktionieren würde, warum fragt man nicht einfach das ab, was einen interessiert?
    Code cpp:
    1
    2
    3
    4
    5
    
    if (datei.is_open()) {
      ...
    } else {
      ...
    }
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. Verschlüsselung
    Von chrisjahl im Forum Internetkommunikation
    Antworten: 2
    Letzter Beitrag: 26.10.08, 23:40
  2. Antworten: 2
    Letzter Beitrag: 14.04.07, 14:15
  3. Antworten: 26
    Letzter Beitrag: 11.06.06, 22:11
  4. Caesar-Verschlüsselung
    Von laaars im Forum Delphi, Kylix, Pascal
    Antworten: 2
    Letzter Beitrag: 23.03.04, 12:56
  5. Algorithmus für Caesar Code gesucht...
    Von Henderwaeldler im Forum Coders Talk
    Antworten: 5
    Letzter Beitrag: 26.10.03, 15:47

Stichworte