#include <iostream>
class keep_last_char_outbuf : public std::streambuf {
public:
keep_last_char_outbuf(std::streambuf* buf) : buf(buf), last_char(traits_type::eof()) {
// no buffering, overflow on every char
setp(0, 0);
}
char get_last_char() const { return last_char; }
virtual int_type overflow(int_type c) {
buf->sputc(c);
last_char = c;
return c;
}
private:
std::streambuf* buf;
char last_char;
};
int main() {
std::streambuf* cbuf = std::cout.rdbuf();
std::cout.flush();
keep_last_char_outbuf keep_last_buf(cbuf);
std::cout.rdbuf(&keep_last_buf);
std::cout << "ala ma kota\n";
char last_char = keep_last_buf.get_last_char();
if (last_char == '\r' || last_char == '\n')
std::cout << "\nLast char was newline: " << int(last_char) << "\n";
else
std::cout << "\nLast char: '" << last_char << "'\n";
std::cout << "ala ma kota";
last_char = keep_last_buf.get_last_char();
if (last_char == '\r' || last_char == '\n')
std::cout << "\nLast char was newline: " << int(last_char) << "\n";
else
std::cout << "\nLast char: '" << last_char << "'\n";
std::cout.rdbuf(cbuf);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3Mga2VlcF9sYXN0X2NoYXJfb3V0YnVmIDogcHVibGljIHN0ZDo6c3RyZWFtYnVmIHsKcHVibGljOgogICAga2VlcF9sYXN0X2NoYXJfb3V0YnVmKHN0ZDo6c3RyZWFtYnVmKiBidWYpIDogYnVmKGJ1ZiksIGxhc3RfY2hhcih0cmFpdHNfdHlwZTo6ZW9mKCkpIHsKICAgICAgICAvLyBubyBidWZmZXJpbmcsIG92ZXJmbG93IG9uIGV2ZXJ5IGNoYXIKICAgICAgICBzZXRwKDAsIDApOwogICAgfQogICAgY2hhciBnZXRfbGFzdF9jaGFyKCkgY29uc3QgeyByZXR1cm4gbGFzdF9jaGFyOyB9CgogICAgdmlydHVhbCBpbnRfdHlwZSBvdmVyZmxvdyhpbnRfdHlwZSBjKSB7CiAgICAgICAgYnVmLT5zcHV0YyhjKTsKICAgICAgICBsYXN0X2NoYXIgPSBjOwogICAgICAgIHJldHVybiBjOwogICAgfQpwcml2YXRlOgogICAgc3RkOjpzdHJlYW1idWYqIGJ1ZjsKICAgIGNoYXIgbGFzdF9jaGFyOwp9OwoKaW50IG1haW4oKSB7CiAgIHN0ZDo6c3RyZWFtYnVmKiBjYnVmID0gc3RkOjpjb3V0LnJkYnVmKCk7CiAgIHN0ZDo6Y291dC5mbHVzaCgpOwogICBrZWVwX2xhc3RfY2hhcl9vdXRidWYga2VlcF9sYXN0X2J1ZihjYnVmKTsKICAgc3RkOjpjb3V0LnJkYnVmKCZrZWVwX2xhc3RfYnVmKTsKCiAgIHN0ZDo6Y291dCA8PCAiYWxhIG1hIGtvdGFcbiI7CgogICBjaGFyIGxhc3RfY2hhciA9IGtlZXBfbGFzdF9idWYuZ2V0X2xhc3RfY2hhcigpOwogICBpZiAobGFzdF9jaGFyID09ICdccicgfHwgbGFzdF9jaGFyID09ICdcbicpCiAgICAgIHN0ZDo6Y291dCA8PCAiXG5MYXN0IGNoYXIgd2FzIG5ld2xpbmU6ICIgPDwgaW50KGxhc3RfY2hhcikgPDwgIlxuIjsKICAgZWxzZQogICAgICBzdGQ6OmNvdXQgPDwgIlxuTGFzdCBjaGFyOiAnIiA8PCBsYXN0X2NoYXIgPDwgIidcbiI7CiAgICAKICAgc3RkOjpjb3V0IDw8ICJhbGEgbWEga290YSI7CiAgIGxhc3RfY2hhciA9IGtlZXBfbGFzdF9idWYuZ2V0X2xhc3RfY2hhcigpOwogICBpZiAobGFzdF9jaGFyID09ICdccicgfHwgbGFzdF9jaGFyID09ICdcbicpCiAgICAgIHN0ZDo6Y291dCA8PCAiXG5MYXN0IGNoYXIgd2FzIG5ld2xpbmU6ICIgPDwgaW50KGxhc3RfY2hhcikgPDwgIlxuIjsKICAgZWxzZQogICAgICBzdGQ6OmNvdXQgPDwgIlxuTGFzdCBjaGFyOiAnIiA8PCBsYXN0X2NoYXIgPDwgIidcbiI7CgogICBzdGQ6OmNvdXQucmRidWYoY2J1Zik7Cn0=