Fstream C 自动线添加

FStream C++ automatic line addition

本文关键字:添加 自动线 Fstream      更新时间:2023-10-16

用ofstream在每个值之间进行端线是很痛苦的。这是我所拥有的示例:

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

我希望能够做到,而是

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

我不在乎如何存储文件,因为我会编写一个配置向导。

如果 fout << val1 << endl;与您不起作用,则可以继承并创建自己的流,从而自动添加endl。但您也可以从消防栓中喝水。

这是一个痛苦...

此外,您可以简单地写

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

您可以使用任何其他Whitespace字符值在输出文件中界定您的值:

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!

在此处检查运行样本。

如果您有大量值,只需将'endl'放在与输出的同一行上,然后通过所有数据循环循环。例如:

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

我不知道一种内置的方式来自动化这一点,但老实说,手动添加线路结尾不是太多。