C++ C++;fstream对象是否可以设置为在每次调用<;时自动写入换行符&书信电报;?

C++ C++;fstream对象是否可以设置为在每次调用<;时自动写入换行符&书信电报;?,c++,newline,fstream,C++,Newline,Fstream,我已经创建了一个fstream对象来将信息写入文件。 我将字符串写入新文件,如 fStreamObject << "New message.\n"; fstreambject否,在标准流中没有这种可随时配置的功能 您可能需要对流类型进行子类化,并处理操作符否,在标准流中没有这种可配置的功能 您可能不得不对流类型进行子类化,并使用运算符> P>不,C++流不允许。 无法确定一次插入在哪里停止,下一次插入在哪里开始。 例如,对于自定义类型,它们的流插入器通常实现为对其他流插入器和成员函

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

fStreamObject << "New message.\n";

fstreambject否,在标准流中没有这种可随时配置的功能


您可能需要对流类型进行子类化,并处理
操作符否,在标准流中没有这种可配置的功能


您可能不得不对流类型进行子类化,并使用<代码>运算符> P>不,C++流不允许。 无法确定一次插入在哪里停止,下一次插入在哪里开始。
例如,对于自定义类型,它们的流插入器通常实现为对其他流插入器和成员函数的调用

您唯一能做的就是编写自己的类,它将委托给您选择的流,并执行此操作。
但是,这是非常有限的实用性

struct alwaysenter {
     std::ostream& o;
     template<class X> alwaysenter& operator<<(X&& x) {
         o<<std::forward<X>(x);
         return *this;
     }
};
struct alwaysenter{
标准::奥斯特雷姆公司;

模板Access和运算符< P>不,C++流不允许。 无法确定一次插入在哪里停止,下一次插入在哪里开始。
例如,对于自定义类型,它们的流插入器通常实现为对其他流插入器和成员函数的调用

您唯一能做的就是编写自己的类,它将委托给您选择的流,并执行此操作。
但是,这是非常有限的实用性

struct alwaysenter {
     std::ostream& o;
     template<class X> alwaysenter& operator<<(X&& x) {
         o<<std::forward<X>(x);
         return *this;
     }
};
struct alwaysenter{
标准::奥斯特雷姆公司;

模板Access和运算符< P>这取决于你所说的“设置流”。如果我们认为这是相当宽的,那么答案恰好是“是”!

以下是如何:

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

    #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";
    }
    
    #包括
    类newlinebuf
    :public std::streambuf{
    std::ostream*流;
    标准::streambuf*sbuf;
    int溢出(intc){返回this->sbuf->sputc(c);}
    int sync(){
    return(this->sbuf->sputc('\n')==std::char\u traits::eof()
    ||此->sbuf->pubsync()==-1)?-1:0;
    }
    公众:
    newlinebuf(标准::ostream&stream)
    :流(&流)
    ,sbuf(stream.rdbuf(this)){
    stream->rdbuf(this->sbuf);}
    };
    int main(){
    newlinebuf sbuf(标准::cout);
    
    STD:CUT< P>这取决于你所说的“设置流”。如果我们认为这是相当宽泛的,那么答案恰好是“是”!

    以下是如何:

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

    #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";
    }
    
    #包括
    类newlinebuf
    :public std::streambuf{
    std::ostream*流;
    标准::streambuf*sbuf;
    int溢出(intc){返回this->sbuf->sputc(c);}
    int sync(){
    return(this->sbuf->sputc('\n')==std::char\u traits::eof()
    ||此->sbuf->pubsync()==-1)?-1:0;
    }
    公众:
    newlinebuf(标准::ostream&stream)
    :流(&流)
    ,sbuf(stream.rdbuf(this)){
    stream->rdbuf(this->sbuf);}
    };
    int main(){
    newlinebuf sbuf(标准::cout);
    
    std::你为什么不创建一个为你做这件事的函数呢?或者可能是一个带有重载运算符的类,这样你就可以像普通流一样使用它,只是它会把所有的东西都放在一条新的行中。你的问题没有错。但是在什么情况下你需要你所请求的东西呢?你为什么不创建一个不需要的函数呢这是给你的吗?或者可能是一个带有重载运算符的类,这样你就可以像普通流一样使用它,只是它会将所有内容放在一个新的行中。你的问题没有错。但是在什么情况下你需要你所要求的东西?这不是你唯一能做的事情。你可以随时使用流缓冲区。顺便说一下,你你忘了写换行符。流缓冲区看不到单独的插入,但你可以使用自定义的char_traits类从
    std::basic_ostream
    继承,并专门化
    std::basic_ostream::sentry
    在每次格式化的插入操作后输入换行符。@potatostratter的缺点是继承类不会我与其他具有相同字符类型和不同字符特征的流具有相同的类型。但这是一个聪明的主意。@重复数据消除或不,我自己使用
    std::streambuf
    接口做过几次。@0x499602D2:您是如何处理流插入器调用其他流插入器的,可能多次?这不是唯一的方法您可以做的事情。您可以随时使用流缓冲区。顺便说一句,您忘记了编写换行符。流缓冲区看不到单独的插入,但您可以使用自定义字符特征类从
    std::basic_ostream
    继承,并专门化
    std::basic_ostream::sentry
    在每个格式化的插入符之后输入换行符重复操作。@Potatoswatter的缺点是继承类的类型不会与具有相同字符类型和不同字符特征的其他流相同。但这是一个聪明的主意。@重复数据消除或不重复,我自己使用
    std::streambuf
    接口做过几次。@0x499602D2:您是如何处理流插入器的呼叫其他str