-2

我想cout用相同但endl. 我正在尝试为此使用宏,但无法弄清楚如何做到这一点。请帮忙!

有没有办法在程序中编写完整的行并<< endl与之连接?注意如果endl已经由程序员编写, noendl​​将被连接。

如果有其他更好的方法,请提出建议。


尝试使用正则表达式。所有现代语言都支持它们。

另外,例如,如果您的程序不是很大,您可以尝试使用 SublimeText 编辑器。它有非常智能的替换工具,支持正则表达式。

4

4 回答 4

9

只需制作一个功能模板:

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)...);
}
于 2013-09-30T21:04:22.120 回答
2

不幸的是,这是可能的。但在任何意义上,我都不能宽恕它。

#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
于 2013-09-30T21:18:48.533 回答
1

你真正感兴趣的是什么?每次输出操作或刷新后的换行符?请注意,冲洗确实很昂贵。

在每次输出操作后注入刷新的最简单方法是设置标志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";
}

根据评论,我意识到这可能不是您想要的,但我不知道仅使用预处理器和/或编译器添加换行符的可移植技术。

于 2013-09-30T21:09:29.740 回答
0

尝试使用正则表达式。所有现代语言都支持它们。

另外,例如,如果您的程序不是很大,您可以尝试使用 SublimeText 编辑器。它有非常智能的替换工具,支持正则表达式。

于 2013-09-30T21:03:24.883 回答