如何返回到csv文件中第一行的末尾?

时间:2011-03-23 15:29:58

标签: c++ csv ofstream

我使用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,但我不确定如何。 非常感谢你。

3 个答案:

答案 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还允许您seekpseekg。但是操纵这样的文件会很困难。如果你写出100个字节,seekp到开头并开始写更多数据,你就会覆盖已经存在的东西(它不会自动转移给你)。您可能需要读取文件的内容,在内存中操作它们,并一次性将它们写入磁盘。

答案 2 :(得分:0)

尽管效率很低,但是可以通过使用额外的空格编写固定大小的行(40个字符?)来完成,因此您可以通过寻找行* 40 +位置来寻找行和(固定)位置(或寻找逗号)并覆盖空格。

现在您已掌握了这些知识,请继续使用Martin提到的方法