我创建了一个fstream对象来将信息写入文件。 我将字符串写入新文件,如
fStreamObject << "New message.\n";
因为我想要每个&lt;&lt;将字符串打印到下一行。
我希望能够设置属性并拨打电话,如
fstreamObject << "New message.";
将字符串写入下一行。
是否有fstream对象的标志/设置允许这样做?
我已经看到了不同的文件模式(即ofstream :: in,ofstream :: out等),但我找不到自动写入新行的模式。另外,我不打算写自己的解决方案。我希望能够使用内置功能。</ p>
答案 0 :(得分:2)
不,标准流中没有这种类似的可配置功能。</ p>
您可能必须对流类型进行子类化并使用operator<<
进行操作以使其按您希望的方式工作,或者使用某些描述的辅助函数来执行此操作:
fstreamObject << nl("New message.");
(但这并不比仅仅拥有\n
容易(对于字符串,无论如何)。
答案 1 :(得分:2)
取决于你的意思&#34;设置流&#34;。如果我们认为这相当宽泛,那么答案恰好是&#34;是&#34;!
以下是:
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";
}
虽然这种方法有效,但我建议反对使用它!问题在于,所有复合输出运算符(即使用多个输出运算符执行其工作的运算符)将导致多个换行符。我不知道可以采取哪些措施来防止这种行为。标准库中没有任何内容可以配置流来执行此操作:您需要以某种方式插入换行符。
答案 2 :(得分:1)
不,C ++流不允许这样做。
无法确定一次插入停止和下一次插入的位置
例如,对于自定义类型,它们的流插入器通常实现为对其他流插入器和成员函数的调用。
> 尽管如此,这是严格限制的。
struct alwaysenter {
std::ostream& o;
template<class X> alwaysenter& operator<<(X&& x) {
o<<std::forward<X>(x);
return *this;
}
};