Um zu verstehen, wie Eingangsströme arbeiten ich entworfen 2 der folgenden Klassen:Benutzerdefinierter Eingabestream. Strompuffer und Unterlauf Methode
#include <iostream>
class my_streambuf: public std::streambuf
{
private:
std::streambuf* buffer;
char ch;
protected:
virtual std::streambuf::int_type underflow()
{
std::streambuf::int_type result = buffer->sbumpc();
if (result != traits_type::eof())
{
ch = traits_type::to_char_type(result);
setg(&ch, &ch, &ch + 1);
}
return result;
}
public:
my_streambuf(std::streambuf* buffer) : buffer(buffer) {};
virtual ~my_streambuf() {};
};
class my_istream: public std::istream
{
public:
my_istream(std::istream& stream) : std::istream(new my_streambuf(stream.rdbuf())) {};
virtual ~my_istream()
{
delete rdbuf();
}
};
int main()
{
char s[32];
my_istream is(std::cin);
is >> s;
std::cout << s;
return 0;
}
Welche funktionieren, bis ich die Logik der underflow
Methode ändern. Das Hauptziel ist das Speichern von Daten in der C-String-Version s
, die sich von der Benutzereingabe unterscheidet. Um einen einfachen Test zu machen, änderte ich die underflow
Methode, die folgenden sein:
virtual std::streambuf::int_type underflow()
{
std::streambuf::int_type result = buffer->sbumpc();
if (result != traits_type::eof())
{
result = traits_type::to_int_type('+'); // <-- this was added
ch = traits_type::to_char_type(result);
setg(&ch, &ch, &ch + 1);
}
return result;
}
Mit der Idee, die Methode Rückkehr nur +
Symbole anstelle von Benutzereingaben Zeichen zu machen ist. Wenn also zum Beispiel 123
eingegeben wird, erwarte ich, dass +++
in der Variablen s
gespeichert wird. Und das funktioniert nicht. Die Konsole hängt, als ob sie auf weitere Eingaben wartet. Nur ein bestimmter Tastendruck (oder Senden von EOF) hilft.
Was fehlt mir hier?
Wie von @ferosekhanj weist darauf hin, das Problem war die fehlenden Newline, die nicht durch die modifizierte Version von underflow
an den Aufrufer zurückgegeben wurde. Damit der Code ordnungsgemäß funktioniert, muss er zurückgegeben werden. Diese Version der Methode funktioniert gut.
virtual std::streambuf::int_type underflow()
{
std::streambuf::int_type result = buffer->sbumpc();
if ((result != traits_type::eof()) && !traits_type::eq(traits_type::to_char_type(result), '\n'))
{
result = traits_type::to_int_type('+');
ch = traits_type::to_char_type(result);
setg(&ch, &ch, &ch + 1);
}
return result;
}
Wenn ich nicht viel falsch bin, liest nur 'cin' einen String, bis er einen Zeilenvorschub sieht. Andere Streams tun dies bis "EOF". – HighPredator
Was meinst du mit anderen Streams? cin ist nur eine Instanz von std: istream – ferosekhanj
Ich meine, dass dies nach meinem Wissen in 'cin implementiert ist, nicht die Stream-Klasse. – HighPredator