String zersplitten



  • Ja danke, hat geklappt.

    Ich hab nur das Problem jetzt das er wenn er 12 ALGERIA 2317065.750 5709.162 sowas einließt das nur 317065.750 die eingelesen wird



  • Onubub schrieb:

    Ja danke, hat geklappt.

    Ich hab nur das Problem jetzt das er wenn er 12 ALGERIA 2317065.750 5709.162 sowas einließt das nur 317065.750 die eingelesen wird

    .. dann probiere doch mal meine Variante.


  • Mod

    .. dann probiere doch mal meine Variante.

    Deine Variante ist etwas overengineered... aber das weißt du doch?

    Der Fehler ist schnell gefunden, das erste Zeichen das nicht in den Namen passt wird mitextrahiert.

    Der überladene Operator muss angepasst werden:

    std::istream& operator>>( std::istream& is, country& c )
    {
    	is >> c.A >> std::ws;
    
    	c.name.clear();
    	// Edit: Für die Schleife muss ich mich entschuldigen.
    	for( char ch = is.peek(); is && (ch >= 'A' && ch <= 'Z' || ch == ' ')  ; ch = is.peek() )
    	{
    		c.name.push_back( ch );
    		is.ignore();
    	}
    
    	c.name.erase( c.name.find_last_not_of(' ') + 1 );
    
    	return is >> c.B >> c.C;
    }
    


  • die bekomme ich gar nicht zum laufen da bekomm ich 100 fehler


  • Mod

    Onubub schrieb:

    die bekomme ich gar nicht zum laufen da bekomm ich 100 fehler

    Das ist äußerst merkwürdig, denn diese Funktion ist mit allen Standards kompatibel. Was für Fehler bekommst du denn?

    Edit: Er meinte natürlich Werners Variante...



  • Ja genau.

    Deine Variante läuft jetzt einwandfrei! Danke.

    Ich hab jetzt noch ne andere Datei da kommen statt Leerzeichen , Leerzeichen und dann tabs und dann leerzeichen. gibts da ne möglichkeit das das Programm beides kann?


  • Mod

    Onubub schrieb:

    die bekomme ich gar nicht zum laufen da bekomm ich 100 fehler

    Es fehlen ein paar typename

    template< typename E, typename Traits, typename Pred >
    std::basic_istream< E, Traits >& get_text( std::basic_istream< E, Traits >& in, std::basic_string< E, Traits >& txt, Pred end )
    {
        typename std::basic_istream< E, Traits >::sentry ok( in );
        if( ok )
        {
            std::ios_base::iostate state = std::ios_base::goodbit;
            try
            {
                std::basic_string< E, Traits > tx;
                typename std::basic_string< E, Traits >::size_type trim_pos = 0;
                const std::ctype< E >& ctype = std::use_facet< std::ctype< E > >( in.getloc() );
                for( typename Traits::int_type m = in.rdbuf()->sgetc(); ; m = in.rdbuf()->snextc() )
                {
    


  • Onubub schrieb:

    Ja genau.

    Deine Variante läuft jetzt einwandfrei! Danke.

    Ich hab jetzt noch ne andere Datei da kommen statt Leerzeichen , Leerzeichen und dann tabs und dann leerzeichen. gibts da ne möglichkeit das das Programm beides kann?

    Meine overingenierte Variante kann das sofort, wenn Du die typename 's noch einfügst, so wie camper es beschrieben hat.

    camper schrieb:

    Onubub schrieb:

    die bekomme ich gar nicht zum laufen da bekomm ich 100 fehler

    Es fehlen ein paar typename

    .. das ist das Kreuz mit dem Compiler vom Visual Studio, der ist da großzügig.



  • Auf die Erfinder und Standardisierer der C++ Streams warten ein paar ganz besondere Qualen in der Hölle.


  • Mod

    Moment mal! Das kann meine Variante auch, man muss es nur so anpassen:

    for( char ch = is.peek(); is && ch != '+' && ch != '-' && ch != '.' && !std::isdigit(ch) ; ch = is.peek() )
    	{
    		c.name.push_back( ch );
    		is.ignore();
    	}
    

    Edit: Das war die falsche.


Anmelden zum Antworten