Caesar Verschlüsselung mit Buchstaben

B

ByeBye 246844

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:
#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:
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
 
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:
C++:
fprintf(hostdatei,"encode\n\n  %s ", encrypted.c_str());

Gruß
BK
 
Die besserer Lösung ist: Erzeuge dir eine Instanz von std::eek:fstream und benutze sie genau so wie std::cout:

C++:
#include <fstream>

ofstream out( "bla.txt" );

// Ab hier genau wie 'cout'
out << "encode" << endl << endl;
out << encoded << endl;
out.close()
 
Du kannst das ganze auch mit nur fstream machen.

Code:
#include <fstream>

...

fstream fDatei;
char cBuffer[512];

...

fDatei.open("irgendwas.txt", ios::out);
fDatei.write(cBuffer, sizeof(cBuffer));
fDatei.close();

...
 
Zuletzt bearbeitet:
Auf jeden Fall sollte man aber noch das erfolgreiche Öffnen der Datei überprüfen:

C++:
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
 
Ja klar das auch. Kann man ja auch :google:

Bei fstream wäre das mit der Funktion:

Code:
...

if(fDatei.good())
{
    //Wenn die Datei geöffnet werden konnte
}
else
{
    //Wenn sie nicht geöffnet werden konnte
}

...
 
Hi.
Bei fstream wäre das mit der Funktion:

Code:
...

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?
C++:
if (datei.is_open()) {
  ...
} else {
  ...
}
Gruß
 

Neue Beiträge

Zurück