正在将最后一个字符发送到std::cout
Getting last char sent to std::cout
在main()执行结束时,我需要检查(通过std::cout
)发送到stdout的最后一个字符是否是'n'
(或特定于平台的行尾)。如何对此进行测试?可以放心地假设没有使用C样式io(如printf)。
程序是C++的REPL。它评估C++表达式(或语句)并在stdout上打印结果。希望输出总是以单个新线路终止。
这与@Kevin给出的答案相似。不过我相信它更适合你的需要。您可以将std::cout中的streambuf替换为自己的:,而不是使用一些流来代替cout
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 kotan";
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
的任务并不容易,请查找decorator模式和streambuf接口。
如果你没有时间玩这个-看看我的建议视频链接
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;
};
您可以定义自己的类似流的对象,而不是打印到cout
,该对象接受标准的ostream
运算符/函数,但在将操作传递到真正的cout
时跟踪最近打印的字符。
相关文章:
- std::cout.imbue()多重调用
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- std::cout输出int时出现编译错误
- 为什么 std::cout 打印浮点数、双精度和长双精度到相同的小数精度?
- main() 中的 std::cout 在调试期间不会在调试控制台中打印任何内容
- std::cout 来自多个线程
- 在 c++ 中以十六进制格式打印无符号字符(BYTE).使用 std::cout
- Cuda 基本程序 (将值写入矩阵和 std:cout 不起作用) ;主功能不启动
- 是否可以为 std::cout 创建别名?
- std::cout 在打印变量与函数表达式时的行为不同
- 带有 std::cout 的多线程控制台文本动画
- 捕获/禁止发送到 std::cout 的 OpenCV 警告
- printf() 和 std::cout 在指针方面的区别
- 使用字符串流加速 std::cout 日志记录
- 是否可以在每次使用std::cout时执行一个函数
- 为什么'std::cout << !+2 '输出 0?
- 如何将自定义类传递给std::cout
- 对于输出,std::copy是否比std::cout快