istream_iterator überspringt Leerzeichen



  • Hallo,

    ich bastel gerade an einer Vigenère Verschlüsselung, und habe das Problem, dass der istream_iterator, mit dem ich die Zeichen lese, alle Leerzeichen auslässt.

    Hier mal die relevanten Code Teile:

    class Vigenere
    {
    public:
    	Vigenere(const std::string& k, bool e) : key(k), encrypt(e), kPos(0)
    	{ }
    
    	Vigenere(std::istream& k, bool e) : encrypt(e), kPos(0)
    	{
    		k >> key;
    	}
    
    	char operator()(char ch)
    	{
    		char k = key[kPos]; 
    		if (!std::isalpha(ch)) 
    			return ch;
    
    		kPos = (kPos + 1) % (key.length()); 
    
    		char key = std::isupper(k) ? k - 'A' : k - 'a';
    		char offset = std::isupper(ch) ? 'A' : 'a';
    		char tmp = ch - offset;
    		char result = encrypt ? tmp + key : tmp - key;
    		if (result < 0)
    			result += 26;
    		else
    			result %= 26;
    		return result + offset;
    	}
    
    private:
    	std::string key; 
    	int         kPos;              
    	bool        encrypt;
    };
    
    void crypt::vigenere::crypt(std::istream &text_in, std::istream &key_in, std::ostream &out, bool encrypt)
    {
    	std::istream_iterator<char> in_iter(text_in), in_end;
    	std::ostream_iterator<char> out_iter(out);
    	std::transform(in_iter, in_end, out_iter, Vigenere(key_in, encrypt)); 
    }
    

    Aufgerufen wird vigenere::crypt(...) entweder mit einem ifstream oder cin als text_in, das Problem besteht in beiden Fällen.

    Ich bin mit einem Debugger durchgegangen, und Leerzeichen im Text kommen erst gar nicht beim Funktionsobjekt an.

    Danke schonmal für die Hilfe.



  • Habe es nicht getestet, aber AFAIR sollte sich Dein Problem erledigt haben, wenn Du auf 'istreambuf_iterator' umsteigst.



  • Hat geklappt, vielen Dank!


Anmelden zum Antworten