FStream C ++自动添加线

时间:2014-03-08 01:09:12

标签: c++ fstream

使用OFSTREAM在每个值之间做一个终点是一件痛苦的事。 这是我所得到的一个例子:

    ofstream fout("~/xample.txt");
    fout << val1;
    fout << endl;
    fout << val2;

我希望能够做到,而不是

    ofstream fout("xample.txt");
    fout << val1;
    fout << val2;

我不关心文件是如何存储的,因为无论如何我都会写一个配置向导。

3 个答案:

答案 0 :(得分:2)

如果fout << val1 << endl;无效,您可以继承ofstream并创建自己的流,自动添加endl。但你也可以从消防栓中喝水。

答案 1 :(得分:1)

  

这是一种痛苦......

除此之外,你可以简单地写一下

fout << val1 << endl;
fout << val2 << endl;

您可以使用任何其他空白字符值来分隔输出文件中的值:

fout << val1 << ' ';
fout << val2 << ' ';
// ... more value outputs
fout << endl;

文件大小无关紧要,但肯定是行数。

<强>更新
当您询问如何扩展std::ostream上的格式化行为时:
我认为使用std::streambufstd::ostream等的继承并不是一个好主意,并尝试(重新)实现接口本身(通常不会继承STL的好主意)课程,虽然可以完成)。我想说的目的是使用流操作器来实现这一点。

要自动附加endl或任何其他分隔符,您可以编写一个小参数化流操纵器(至少此解决方案是复制/粘贴和IDE intellisense友好):

template<typename T>
class auto_delim_manip
{
public:
    auto_delim_manip(T value_, char delim_) 
    : value(value_) 
    , delim(delim_) {}
    void put(std::ostream& os) const {
        os << value << delim;
        os.flush();
    }
private:
    T value;
    char delim;
};

template<typename T>
auto_delim_manip<T> auto_delim(T value, char delim = '\n') {
    return auto_delim_manip<T>(value,delim);
}

template<typename T>
std::ostream& operator<<(std::ostream& os, const auto_delim_manip<T>& autoDelim) 
{
    autoDelim.put(os);
    return os;
}

int main() {

    cout << auto_delim(5.2) << auto_delim(3) << auto_delim("Hello!");

    return 0;
}

输出:

5.2
3
Hello!

检查running sample here

答案 2 :(得分:1)

如果您有大量值,只需将'endl'与输出放在同一行,然后遍历所有数据。如:

for(int i = 0; i < numValues; ++i) {
    fout << values[i] << endl;
}

我不知道有一种内置的自动化方法,但实际上手动添加行结尾并不是那么多。