richtige Verwendung von getline()


  • Administrator

    @BasicMan01,
    Genau deshalb meinte ich ein kurzes Beispiel. Wer liest sich schon freiwillig all den Code durch, welcher Guest Brain nur gepostet hat? 🙄

    @Guest Brain,
    Dank dem, dass ich wusste, worauf ich schauen möchte:
    <string.h> != <string>
    Das sind zwei ganz verschiedene Header. <string.h> ist der Header für C String Operationen, während <string> der Header für C++ Strings ist.

    C++ Referenz: http://www.cplusplus.com/reference/

    Grüssli



  • Kopf -> Tisch -> Bämm -> Aua
    Nen ganzen Nachmittag wegen nem simplen .h verschwendet...
    Ich tauch unter und beschaffe mir eine neue Identität! Trotz dem Danke für die Hilfe!



  • Guest Brain schrieb:

    Kopf -> Tisch -> Bämm -> Aua
    Nen ganzen Nachmittag wegen nem simplen .h verschwendet...
    Ich tauch unter und beschaffe mir eine neue Identität! Trotz dem Danke für die Hilfe!

    Ein eigenes Verschlüsselungsverfahren zu entwickeln endet übrigens in 99,99% in einer Katastrophe. Im besten Fall kann man damit Dateien verschleiern, aber das war es dann auch schon. Aber als kleines Experiment ist das natürlich vollkommen okay. 🙂



  • bist du noch da?
    also hats sinn, dir hier zu posten, was an deinem code alles nicht so schön ist?
    falls ja, kannst ja noch mal schreiben und morgen noch mal vorbeigukcne oder so^^



  • Ja ich bin noch da. Klar würde ich mich über etwas konstruktive Kritik freuen.
    Fangen wir doch mal beim Einlesen der Dateien an, da gibt VC++ nämlich schon Warnungen aus.
    Wir haben es in der Schule aber nur so gelernt, dass dies aber nicht der richtige Weg ist weiß ich auch.
    Wie würdet ihr denn vorgehen?
    grüße Guest Brain 😃



  • Ach ja und das Ganze soll erst mal nur ein Konsolenprogramm sein.



  • Also zum einlesen würde ich ifstream benutzen:

    http://www.cplusplus.com/reference/iostream/ifstream/

    Wenn du da auf Memberfunktionen (wie z.B den Konstruktor) klickst, dann gibts auch überall Beispiele dazu.



  • In Headern nutzt man kein using namespace, da das den Sinn der namespaces komplett zerstört (und auch zu sehr doofen Fehlern führen kann)...

    FILE *InData;	//einzulesende Datei
    	FILE *OutData;	//auszugebende Datei
    

    das hier sieht sehr nach C aus
    in C++ gibts für so etwas Streams:
    http://www.cplusplus.com/reference/iostream/

    bool InDataFlag;	//Zum Prüfen der Dateizeiger
    	bool OutDataFlag;
    

    das hier sind zumindest komische Variablennamen...
    Könnte sein, dass sich das dann mit den Streams so und so erledigt - aber ich versteh als Ausenstehender zumindest an Hand des Namens oder des Kommentars nicht, was die Variablen anzeigen.

    CCrypt(string InPath, string OutPath);
    

    Nicht trivial-kopierbare Typen übergibt man nicht per value sondern per (const) reference:

    CCrypt(const std::String& InPath, const std::string& OutPath)
    

    das gleiche gilt auch bei Open...

    Im Allgemeinen solltest du die Schnittstellen deiner Klasse vll noch mal überdenken...
    Sieht ein wenig so aus, als ob es eine Art Superklasse ist, die nicht nur ver- und entschlüsselt, sondern auch noch in Dateien schreibt und daraus liest und außerdem noch irgendwas für den Nutzer hat(zumindest klingt Menue so^^)

    #include <string.h>
    

    das das der falsche Header ist, hatten wir ja schon geklärt - du solltest aber mal im Kopf behalten, dass die standard-C++-Header nie keine Endung haben:
    http://www.cplusplus.com/reference/

    CCrypt::CCrypt()
    {	
    	Status = "keine Meldung";
    
    }
    

    Für so etwas gibt es die Initialisierungsliste:

    CCrypt::CCrypt()
    :  Status("keine Meldung")
    {}
    
    CCrypt::~CCrypt()
    {
    
    }
    

    Wenn dein DTor nur so aussieht, brauchst du ihn auch gar nicht erst zu deklarieren - das übernimmt der Compiler schon für dich.
    Dein DTor sollte aber noch die Dateien schließen(apropos: du testest die Handles gegen 0, bevor du versuchst, sie zu schließen - im Konstruktor setzt du sie aber nicht auf 0 - dort steht also irgendwas drin - und deine CloseFile-Funktionen werden undefiniertes Verhalten zur Folge haben, wenn man sie falsch verwendet)

    void CCrypt::Menue()
    

    hat wie gesagt nix in der Klasse zu tun sondern sollte eher in der main-Funktion stehen oder so...

    cout<<endl<<"Aktuelle Statusmeldug: "<<Status.c_str()<<endl;
    

    Das .c_str() ist ein wenig Sinnlos. Lass das einfach weg.

    char Name[200];
    

    wieso dann auf einmal doch wieder char[]? Es ging doch die ganze Zeit so schön mit std::string - und jetzt auf einmal willst du wieder eine Fehlerquelle einbauen?

    if(InDataFlag == true)
    			{
    				ReadData();
    			}
    

    bools vergleicht man eigtl kürzer:

    if(x)
      ReadData();
    
    //für false dann entsprechend:
    if(!x)
      bla();
    

    Es geht zwar auch mit == true und == false, aber schöner Stil ist das nicht.

    InData = fopen(sPath.c_str(),"r");
    

    Wie weiter oben beschrieben: das hier ist kein C++ sondern C.

    int CCrypt::OpenInData(string sPath)
    {
      {//fehler
        return 1;
      }
    
      //alles ok
      return 0;
    }
    

    für so etwas nimmt man in C++ eigtl Exceptions.

    bb



  • Ja also das mit den FILE* wollte ich noch ändern (wir haben in der Schule aber nur damit gearbeitet deshalb kenn ich das nicht anders). Die DataFlag sollte eigentlich wie ein Schalter sein ob die Daten geöffnet sind oder nicht aber wo ich gerade noch mal darüber nachdenke... das geht eingentlich auch ohne bool Variable.

    Die leeren Konstruktoren sollen auch noch gefüllt werden und wegen der Sache mit der Superklasse öhm ja sie sollte erst mal Daten einlesen und Daten schreiben können. Danach wollte ich erst eine Methode hinzufügen die den Text auch verschlüsselt.

    Das Char Feld habe ich auch wieder entfernt nachdem es mit den Strings geklappt hatte.

    Wenn ich .c_str() weg lasse dann gibts ne Fehlermeldung, vermutlich kann cout nicht mit Strings umgehen.

    so weit so gut
    mfg Guest Brain



  • Guest Brain schrieb:

    Wenn ich .c_str() weg lasse dann gibts ne Fehlermeldung, vermutlich kann cout nicht mit Strings umgehen.

    Dann hast du vermutlich ein include vergessen!? (iostream und string hast du beides?)

    bb


Anmelden zum Antworten