fork download
  1. #include <iostream>
  2.  
  3. class keep_last_char_outbuf : public std::streambuf {
  4. public:
  5. keep_last_char_outbuf(std::streambuf* buf) : buf(buf), last_char(traits_type::eof()) {
  6. // no buffering, overflow on every char
  7. setp(0, 0);
  8. }
  9. char get_last_char() const { return last_char; }
  10.  
  11. virtual int_type overflow(int_type c) {
  12. buf->sputc(c);
  13. last_char = c;
  14. return c;
  15. }
  16. private:
  17. std::streambuf* buf;
  18. char last_char;
  19. };
  20.  
  21. int main() {
  22. std::streambuf* cbuf = std::cout.rdbuf();
  23. std::cout.flush();
  24. keep_last_char_outbuf keep_last_buf(cbuf);
  25. std::cout.rdbuf(&keep_last_buf);
  26.  
  27. std::cout << "ala ma kota\n";
  28.  
  29. char last_char = keep_last_buf.get_last_char();
  30. if (last_char == '\r' || last_char == '\n')
  31. std::cout << "\nLast char was newline: " << int(last_char) << "\n";
  32. else
  33. std::cout << "\nLast char: '" << last_char << "'\n";
  34.  
  35. std::cout << "ala ma kota";
  36. last_char = keep_last_buf.get_last_char();
  37. if (last_char == '\r' || last_char == '\n')
  38. std::cout << "\nLast char was newline: " << int(last_char) << "\n";
  39. else
  40. std::cout << "\nLast char: '" << last_char << "'\n";
  41.  
  42. std::cout.rdbuf(cbuf);
  43. }
Success #stdin #stdout 0.01s 2684KB
stdin
ala ma kota
stdout
ala ma kota

Last char was newline: 10
ala ma kota
Last char: 'a'