我使用ofstream编写csv文件。 目前,我正在使用“<<”来写它操作员,这很容易。 例如,
Shape,Area,Min,Max
Square,10,2,11
Rectangle,20,3,12
我想改变它看起来像
Shape,Square,Rectangle
Area,10,20
Min,2,3
Max,11,12
我知道我可以使用“<<”运算符,只是这样写,但我使用了一些循环,不能使用“<<”运营商这样写。
所以我正在寻找一种顺序写作的方法,例如
Shape,
Area,
Min,
Max,
然后变成
Shape,Square
Area,10
Min,2
Max,1
所以它基本上是从上到下而不是从左到右。 我如何使用ofstream对此进行编码?我猜我必须使用seekp,但我不确定如何。 非常感谢你。
答案 0 :(得分:3)
除非在没有ostream的末尾,否则不能插入 覆盖已写入的数据。对于类似的东西 你要做的,你可能要收集每一行 单独的字符串(可能使用ostringstream来编写它),然后 输出行。类似的东西:
std::ostringstream label;
label << "Shape";
std::ostringstream area;
area << "Area";
std::ostringstream min;
min << "Min";
std::ostringstream max;
max << "Max";
for (std::vector<Shape>::const_iterator> it = shapes.begin();
it != shapese.end();
++ it)
{
label << ',' << it->TypeName();
area << ',' << it->Area();
min << ',' << it->min();
max << ',' << it->max();
}
dest << label.str() << '\n';
dest << area.str() << '\n';
dest << min.str() << '\n';
dest << max.str() << '\n';
答案 1 :(得分:0)
您可以根据需要使用旧的FILE*
API,seek
。 IOStream还允许您seekp
和seekg
。但是操纵这样的文件会很困难。如果你写出100个字节,seekp
到开头并开始写更多数据,你就会覆盖已经存在的东西(它不会自动转移给你)。您可能需要读取文件的内容,在内存中操作它们,并一次性将它们写入磁盘。
答案 2 :(得分:0)
尽管效率很低,但是可以通过使用额外的空格编写固定大小的行(40个字符?)来完成,因此您可以通过寻找行* 40 +位置来寻找行和(固定)位置(或寻找逗号)并覆盖空格。
现在您已掌握了这些知识,请继续使用Martin提到的方法