【发布时间】:2021-03-30 06:56:08
【问题描述】:
在 C++ 中,我如何检测我的std::ostream os 是否位于行首,换句话说(我认为)最近写入os 的内容是os<<'\n' 或os<<std::endl(),或者否则尚未向os 写入任何内容?
乍一看,这听起来没有必要,因为我可以自己跟踪状态。但常见的情况如下,其中跟踪将涉及以非常不自然的方式更改可能从 try 块调用的每个 os<<thing 语句。
try {
do_something_which_writes_to(std::cout);
}
catch(const My_error&error) {
print_a_newline_if_necessary(std::cout);
std::cout<<error<<"\n";
}
(实际上,当然,我们想将error 写入std::cerr,但通常会与std::cout 混在一起,除非其中一个被重定向,所以我们仍然希望在之前终止std::cout 行打印到std::cerr。我特意简化了示例以避免这种干扰。)
您可能会认为os.tellp() 会是答案,但tellp() 似乎只适用于std::ofstream。至少对我来说,std::cout.tellp() 总是返回-1,表示不支持。
【问题讨论】:
-
cout甚至可能不知道写入缓冲区的内容。它可能已写入底层媒体并且早已不复存在。在处理文件时您可以侥幸逃脱,因为在您关闭文件之前该文件(可能)不会去任何地方。串行端口、网络套接字或任何支持命令控制台的东西,Crom 只知道数据去了哪里以及多久之前。