Что вы на самом деле увлекающийся? Новая строка после каждой операции вывода или флеш? Обратите внимание, что флеш действительно дорог.
Самый простой способ иметь флеш впрыскивается после каждой операции вывода является установка флагов std::ios_base::unitbuf
(это значение по умолчанию для std::cerr
):
std::cout << std::unitbuf;
После этой операции вы получите флеш после каждая отдельная операция вывода, например
std::cout << "hello" << ' ' << "world\n";
вызовет три промывки. Чтобы автоматически также вставить новую строку, вы можете настроить буфер потока фильтрации, который добавляет новую строку (необязательно, если она не была) при промывке потока. Это будет означать перезапись и 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";
}
Основываясь на комментарий, я понимаю, что это, вероятно, не то, что вы хотите, но я не знаю портативной техники, которая просто использует препроцессор и/или компилятор для добавления новых строк.
Просто прикрепляется перевод строки '\ n' струн вы выводите, то есть вместо' соиЬ << "бэ", '' написать COUT << «л \ п «;'.В большинстве случаев новая строка достаточно, и вам не нужно явно скрывать буфер. Использование макросов просто для сохранения нескольких символов - это плохая идея здесь и вернется, чтобы укусить вас позже. – us2012
Является ли первый cout в вопросе, который должен быть капитализирован? Также это одноразовое исправление, или оно должно работать с каждой сборкой. –
Я хочу, чтобы это не явным образом писать endl снова и снова, препроцессор cpp должен сделать это для меня. –