c++ - 获取发送到 std::cout 的最后一个字符

标签 c++ iostream cout

我需要在 main() 执行结束时检查发送到 stdout(通过 std::cout)的最后一个字符是否为 '\n'(或平台特定的行尾)。如何测试这个?可以安全地假设未使用 C 风格的 io(如 printf)。

程序是 C++ 的 REPL。它计算 C++ 表达式(或语句)并在标准输出上打印结果。输出总是以单个换行符终止是可取的。

最佳答案

这与@Kevin 给出的答案类似。但是我相信它更适合您的需求。除了使用您的一些流代替 cout - 您可以将 std::cout 中的 streambuf 替换为您自己的流:

int main() {
   std::streambuf* cbuf = std::cout.rdbuf(); // back up cout's streambuf
   std::cout.flush();
   keep_last_char_outbuf keep_last_buf(cbuf);
   std::cout.rdbuf(&keep_last_buf);          // assign your streambuf to cout

   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); // restore cout's original streambuf
}

预期输出:

ala ma kota

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

编写这样的 class keep_last_char_outbuf 的任务不是很容易,寻找装饰器模式和 streambuf界面。

如果你没有时间玩这个 - 看看我的建议 ideone link

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;
};

关于c++ - 获取发送到 std::cout 的最后一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12060581/

相关文章:

c++ - 何时使用哪种排序算法,何时绝对不应该

c++ - 格式化输出流,ios::left 和 ios::right

c++ - 为什么仅包括 iostream.h 会使可执行文件的重量增加 1mb?

c++ - 如何基于 basic_streambuf 构建 filtered_streambuf?

c++ - 这个使用标准库的非常简单的 C++ 程序不能用 GCC 编译

C++打印指针的值

C++ 输出:std::cout 和文件输出的内容不同

c++ - 带正交编码器 600ppr 的 Arduino RPM 代码

c++ - 从文件中读取然后从转换为 int?

c++ - 如何使用 CMake 正确设置动态库路径?