AnsiString mit << >> Operatoren benutzen



  • Hallo,

    Ich will eigentlich nur wissen wie ich die Operatoren << und >> dazu bringe auch AnsiString an zu nehmen, also so

    AnsiString bla;
    cin >> bla;
    

    Ich glaub das sind nur zwei zeilen, aber ich raff es nicht.

    In der Borland Hilfe hab ich das gefunden

    ostream& operator << (ostream& os, const AnsiString& arg);
    
         istream& operator >> (istream& is, AnsiString& arg);
    

    aber da bekomm ich dauernt fehler das er ostream und istream nicht kennt,
    obwohl ich alle includes eingebunden hab die die Hilfe gesagt hat.



  • Hallo

    Das wird doch in der Builder gut erklärt. Du brauchst nichtt die Definitionen der Operatoren kopieren (ich vermute das du das gemacht hast), sondern einfach die Include-Reihenfolge beachten

    #include <iostream> // zuerst
    #include <vcl.h> // danach
    

    Dann kannst du darauf folgend AnsiStrings in std-Streams schieben.

    bis bald
    akari



  • So, das hab ich jetzt gemacht, jetzt kann ich zwar Kompilieren aber funktionieren tuts nicht.
    Kannst du da mal drüber schaun und sagen was falsch ist, ich finds nicht,
    muß noch dazu sagen das das der erste versuch ist eine Klasse auszulagern.

    Die Datei TXTTest.h

    #ifndef TXTTestH
    #define TXTTestH
    class TXT
    {
    public:
            void setFilename(AnsiString);
            AnsiString getFilename();
    private:
            AnsiString Filename;
    };
    //---------------------------------------------------------------------------
    #endif
    

    Die Datei TXTTest.cpp

    #pragma hdrstop
    #include <vcl.h>
    #include "TXTTest.h"
    
    void TXT::setFilename(AnsiString name)
    {
            Filename = name;
    }
    //---------------------------------------------------------------------------
    AnsiString TXT::getFilename()
    {
            return Filename;
    }
    
    //---------------------------------------------------------------------------
    
    #pragma package(smart_init)
    

    und zum schluß main

    #include <iostream>
    #include <vcl.h>
    #include <conio.h>
    #include "TXTTest.h"
    
    int main()
    {
            TXT *Test = new TXT;
    
            std::cout << "Geben Sie einen Namen ein: ";
            AnsiString Datei;
            std::cin >> Datei;
            Test->setFilename(Datei);
            std::cout << "\nSie haben " << Test->getFilename().c_str() << " eingegeben";
            _getch();
            delete Test;
            return 0;
    }
    

    Bin echt Dankbar für jede Hilfe



  • jetzt kann ich zwar Kompilieren aber funktionieren tuts nicht.

    WAS funktioniert denn nicht?

    "Funktioniert nicht" ist keine brauchbare Fehlerbeschreibung ...



  • Hallo

    Offenbar gibt mit dem >>-Operator für AnsiString im BCB5 Probleme. Wenn ich deinen Code ausführe, wird die Eingabe nicht vom einem Enter beendet. Falls das das ist was du mit "funktioniert nicht" meinst 🙄

    Den Fehler kann man jedenfalls beheben, wenn man für die Eingabe std::string benutzt

    TXT *Test = new TXT; 
            std::cout << "Geben Sie einen Namen ein: ";
            std::string Datei;
            std::cin >> Datei;
            Test->setFilename(Datei.c_str());
            std::cout << "\nSie haben " << Test->getFilename() << " eingegeben"; // Hier brauchst du kein c_str() mehr
            _getch();
            delete Test;
            return 0;
    

    Du solltest also überlegen, ob du bei einem reinen Konsolenprogramm nicht so viel std::string benutzen solltest wie möglich.
    Dadurch wird dein Code standardkonformer und du kannst eventuell komplett auf VCL verzichten.

    bis bald
    akari



  • Ja, das war mit funktioniert nicht gemeint, Sorry war nicht meine absicht.

    Wo liegt den der Unterschied zwischen String und AnsiString?

    Das wird in eine Form eingebaut, ha nur zum Testen der Klasse die Konsole.

    Aber Danke für die Hilfe.

    Edit -> Hab es gerade mit String ausprobiert, aber auch hier lauft das Programm weiter wenn ich Enter drücke.

    Edit2 -> geht doch, sorry tippfehler



  • String == AnsiString
    String != std::string



  • Hi,

    Versuch doch mal, zum Testen NICHT die Konsole zu nehmen. Einfach ein Fenster mit einem Edit, einem Button und einem Label sollte reichen, dann hättest Du Dir den ganzen Ärger gespart und gleich testen können.

    Übrigens, als kleiner Tipp am Rande: guck mal in der Hilfe unter "__property", ich glaube, das könnte Dir gefallen 🙂

    Viele Grüße,
    Christian


Anmelden zum Antworten