stream operator >> mit anderen Zeichen als whitespace?



  • Hallo,

    ich sehe nur skipws und noskipws als Modifikatoren für << und >> Operatoren, aber gibt es auch eine Möglichkeit, den Extraction Operator so umzubiegen, dass er andere Delimiter anstelle von whitespaces nimmt? Oder muss ich mir so einen Tokenizer selber schreiben?



  • Mir ist keine Möglichkeit bekannt, soweit ich weiß gibt es auch keine.

    Ich würde mir eine eigene Klasse schreiben und für diese mit dann den entsprechenden Operator überladen. Dann kannst dir das ja selber zusammenbasteln.

    Lg freeG



  • Bei std::getline (aus <string>) kannst du z.B. eine beliebigen delimiter angeben.
    Ansonsten kannst du das Verhalten der streams mit locale-Objekten und facets modifizieren. Aber frag mich nicht wie das geht. Möglich ist es grundsätzlich.



  • (quelle: Tom Usenet / microsoft.public.vc.stl)

    #include <locale> 
    #include <string> 
    
    class space_ctype: public std::ctype<char> 
    { 
    public: 
     space_ctype(std::string const& whitespaces):std::ctype<char>(get_mask(whitespaces), true) { 
      }; 
    private: 
     static mask const* get_mask(std::string const& whitespaces) 
     { 
      mask* m = new mask[table_size]; 
      mask const* classic =std::ctype<char>::classic_table(); 
    
      for (size_t j = 0; j < table_size; ++j){ 
       m[j] = (mask)(classic[j] & ~space); 
      } 
      for(std::string::const_iterator i = whitespaces.begin(), end = whitespaces.end(); i != end; ++i){ 
       m[static_cast<unsigned char>(*i)] =  (mask)(m[static_cast<unsigned 
    char>(*i)] | space); 
      } 
      return m; 
     } 
    }; 
    
    static std::locale loc_space(std::locale("C"), new space_ctype("")); // kein space zeichen! 
    std::cin.imbue(loc_space); 
    std::string parser_string; 
    std::cin >> parser_string;
    

    Wenn man die ganze Klassen deklaration von "space_ctype" in ein H-File
    auslagert dann ist das ganze auch nicht mehr so unhandlich!

    PS:
    mit wchar als template argumnet des streams geht es anders. vgl.:
    http://stackoverflow.com/questions/2339593/overriding-ctypewchar-t




Anmelden zum Antworten