我想cout
用相同但与endl
. 我正在尝试为此使用宏,但无法弄清楚如何做到这一点。请帮忙!
有没有办法在程序中编写完整的行并<< endl
与之连接?注意如果endl
已经由程序员编写, noendl
将被连接。
如果有其他更好的方法,请提出建议。
我想cout
用相同但与endl
. 我正在尝试为此使用宏,但无法弄清楚如何做到这一点。请帮忙!
有没有办法在程序中编写完整的行并<< endl
与之连接?注意如果endl
已经由程序员编写, noendl
将被连接。
如果有其他更好的方法,请提出建议。
尝试使用正则表达式。所有现代语言都支持它们。
另外,例如,如果您的程序不是很大,您可以尝试使用 SublimeText 编辑器。它有非常智能的替换工具,支持正则表达式。
只需制作一个功能模板:
template<typename T>
void printLn(T const & v, std::ostream & os = std::cout)
{
os << v << std::endl;
}
如果你想看中它并允许多个参数,C++11 可供你使用:
void printLn(std::ostream & os)
{
os << std::endl;
}
template<typename T, typename... Args>
void printLn(std::ostream & os, T const & v, Args&&... args)
{
os << v;
printLn(os, std::forward<Args>(args)...);
}
不幸的是,这是可能的。但在任何意义上,我都不能宽恕它。
#include <iostream>
namespace std
{
class not_actually_cout{};
template<typename T>
not_actually_cout& operator<< (not_actually_cout& stream, const T & v)
{
std::cout << v << std::endl;
return stream;
}
not_actually_cout not_actually_cout_instance;
}
#define cout not_actually_cout_instance
int main(void)
{
cout << "why god why";
cout << "please no";
return 0;
}
输出:
why god why
please no
你真正感兴趣的是什么?每次输出操作或刷新后的换行符?请注意,冲洗确实很昂贵。
在每次输出操作后注入刷新的最简单方法是设置标志std::ios_base::unitbuf
(这是 的默认设置std::cerr
):
std::cout << std::unitbuf;
在此操作之后,您将在每个单独的输出操作之后获得刷新,例如
std::cout << "hello" << ' ' << "world\n";
会导致三个冲洗。要自动插入换行符,您可以设置过滤流缓冲区,在刷新流时添加换行符(如果没有换行符,则可选)。这相当于覆盖 a 的overflow()
和sync()
函数,std::streambuf
并将相应的流缓冲区安装到std::cout
除了设置之外std::unitbuf
。通过这些更改,将不需要更改源。
下面的代码演示了一个相应的过滤流缓冲区:
#include <iostream>
#include <streambuf>
class newlinebuf
: public std::streambuf
{
enum { s_size = 64 };
std::ostream& d_stream;
std::streambuf* d_sbuf;
char d_buffer[s_size];
public:
newlinebuf(std::ostream& stream)
: d_stream(stream)
, d_sbuf(stream.rdbuf(this))
{
this->setp(this->d_buffer, this->d_buffer + s_size - 1);
}
~newlinebuf() {
if (this->d_stream.rdbuf() == this) {
this->d_stream.rdbuf(this->d_sbuf);
}
}
int overflow(int c) { // clear the buffer without flushing
std::streamsize size(this->pptr() - this->pbase());
std::streamsize n(this->d_sbuf->sputn(this->pbase(), size));
if (n == 0) { // no progress => error
return std::char_traits<char>::eof();
}
std::copy(this->pbase() + n, this->pbase() + size, this->pbase());
this->setp(this->d_buffer, this->d_buffer + s_size);
this->pbump(size - n);
if (c != std::char_traits<char>::eof()) {
*this->pptr() = std::char_traits<char>::to_char_type(c);
this->pbump(1);
}
return std::char_traits<char>::not_eof(c);
}
int sync() {
if (this->pptr() == this->pbase() || this->pptr()[-1] != '\n') {
*this->pptr() = '\n';
this->pbump(1);
}
return this->overflow(std::char_traits<char>::eof())
== std::char_traits<char>::eof()? -1: 0;
}
};
int main()
{
newlinebuf sbuf(std::cout << std::unitbuf);
std::cout << "hello" << "_" << "world\n" << "next line";
}
根据评论,我意识到这可能不是您想要的,但我不知道仅使用预处理器和/或编译器添加换行符的可移植技术。
尝试使用正则表达式。所有现代语言都支持它们。
另外,例如,如果您的程序不是很大,您可以尝试使用 SublimeText 编辑器。它有非常智能的替换工具,支持正则表达式。