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。IOStream を使用するとseekp、 およびseekg. しかし、このようなファイルの操作は困難です。たとえば 100 バイトseekpを最初に書き出して、さらにデータを書き始めると、既にあるものを上書きすることになります (自動的にシフトされるわけではありません)。おそらく、ファイルの内容を読み込み、メモリ内で操作し、ディスクに一度に書き込む必要があります。

于 2011-03-23T15:58:25.067 に答える
0

非効率的ですが、固定サイズの行 (40 文字?) を余分なスペースで書くことで実行できるため、行 * 40 + 位置 (またはコンマを探す) を求めて行と (固定) 位置に移動し、スペースを上書きします。

この知識が得られたので、マーティンが述べたアプローチに進みます

于 2011-03-23T19:09:38.830 に答える