我需要在 main() 执行结束时检查发送到标准输出(通过std::cout
)的最后一个字符是否是'\n'
(或特定于平台的行尾)。如何对此进行测试?可以安全地假设没有使用 C 风格的 io(如 printf)。
程序是 C++ 的 REPL。它评估 C++ 表达式(或语句)并在标准输出上打印结果。希望输出总是以单个换行符终止。
除了打印到之外cout
,您还可以定义自己的类流对象,该对象接受标准ostream
运算符/函数,但在将操作传递给真实的 . 时跟踪最近打印的字符cout
。
@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 链接
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;
};