C ++可以将fstream对象设置为在每次调用&lt; <! - ? - >时自动写入换行符

时间:2015-02-06 00:39:35

标签: c++ newline fstream

我创建了一个fstream对象来将信息写入文件。 我将字符串写入新文件,如

fStreamObject << "New message.\n";

因为我想要每个&lt;&lt;将字符串打印到下一行。

我希望能够设置属性并拨打电话,如

fstreamObject << "New message.";

将字符串写入下一行。

是否有fstream对象的标志/设置允许这样做?

我已经看到了不同的文件模式(即ofstream :: in,ofstream :: out等),但我找不到自动写入新行的模式。另外,我不打算写自己的解决方案。我希望能够使用内置功能。<​​/ p>

3 个答案:

答案 0 :(得分:2)

不,标准流中没有这种类似的可配置功能。<​​/ p>

您可能必须对流类型进行子类化并使用operator<<进行操作以使其按您希望的方式工作,或者使用某些描述的辅助函数来执行此操作:

fstreamObject << nl("New message.");

(但这并不比仅仅拥有\n容易(对于字符串,无论如何)。

答案 1 :(得分:2)

取决于你的意思&#34;设置流&#34;。如果我们认为这相当宽泛,那么答案恰好是&#34;是&#34;!

以下是:

  1. 创建一个流缓冲区,每次刷新时插入换行符,即调用sync()时。否则它只是转发字符。
  2. 更改文件流的流缓冲区,以将此流缓冲区过滤用于文件流的流缓冲区。
  3. 设置标志std::ios_base::unitbuf,在每次[正确写入]输出操作后导致刷新。
  4. 以下是执行此操作的示例代码:

    #include <iostream>
    
    class newlinebuf
        : public std::streambuf {
        std::ostream*   stream;
        std::streambuf* sbuf;
        int overflow(int c) { return this->sbuf->sputc(c); }
        int sync() {
            return (this->sbuf->sputc('\n') == std::char_traits::eof() 
                    || this->sbuf->pubsync() == -1)? -1: 0;
        }
    public:
        newlinebuf(std::ostream& stream)
            : stream(&stream)
            , sbuf(stream.rdbuf(this)) {
            stream << std::unitbuf;
        }
        ~newlinebuf() { this->stream->rdbuf(this->sbuf); }
    };
    
    int main() {
        newlinebuf sbuf(std::cout);
    
        std::cout << "hello" << "world";
    }
    

    虽然这种方法有效,但我建议反对使用它!问题在于,所有复合输出运算符(即使用多个输出运算符执行其工作的运算符)将导致多个换行符。我不知道可以采取哪些措施来防止这种行为。标准库中没有任何内容可以配置流来执行此操作:您需要以某种方式插入换行符。

答案 2 :(得分:1)

不,C ++流不允许这样做。
无法确定一次插入停止和下一次插入的位置 例如,对于自定义类型,它们的流插入器通常实现为对其他流插入器和成员函数的调用。

> 尽管如此,这是严格限制的。

struct alwaysenter {
     std::ostream& o;
     template<class X> alwaysenter& operator<<(X&& x) {
         o<<std::forward<X>(x);
         return *this;
     }
};