1

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

4

3 回答 3

4

在不覆盖已写入数据的情况下,您不能在 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';
于 2011-03-23T15:46:14.747 回答
0

您可以根据需要使用旧FILE*API seek。IOStreams 还允许您seekpseekg. 但是像这样操作文件会很困难。如果您seekp在开头写出 100 个字节并开始写入更多数据,您将覆盖已经存在的内容(它不会自动为您移动)。您可能需要读入文件的内容,在内存中操作它们,然后一次性将它们写入磁盘。

于 2011-03-23T15:58:25.067 回答
0

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

既然您已经掌握了这些知识,请采用 Martin 提到的方法

于 2011-03-23T19:09:38.830 回答